Module: xenomai-forge
Branch: master
Commit: 74e853742ce919df6e35c9919354465c3982f7bb
URL:    
http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=74e853742ce919df6e35c9919354465c3982f7bb

Author: Philippe Gerum <r...@xenomai.org>
Date:   Tue Jan  7 13:15:49 2014 +0100

cobalt/shadow: sanitize ppd retrieval

---

 include/cobalt/kernel/assert.h |    2 +-
 include/cobalt/kernel/ppd.h    |   15 ++++++++++++++-
 kernel/cobalt/debug.c          |    3 ---
 kernel/cobalt/posix/internal.h |    9 ++++++++-
 kernel/cobalt/shadow.c         |   17 +----------------
 5 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/include/cobalt/kernel/assert.h b/include/cobalt/kernel/assert.h
index 63886a1..775ae1f 100644
--- a/include/cobalt/kernel/assert.h
+++ b/include/cobalt/kernel/assert.h
@@ -83,7 +83,7 @@
 #define primary_mode_only()    XENO_BUGON(CONTEXT, ipipe_root_p)
 #define secondary_mode_only()  XENO_BUGON(CONTEXT, !ipipe_root_p)
 #define interrupt_only()       XENO_BUGON(CONTEXT, !xnsched_interrupt_p())
-#define atomic_only()          XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) 
&& spltest()) == 0)
+#define atomic_only()          XENO_BUGON(CONTEXT, (xnlock_is_owner(&nklock) 
&& hard_irqs_disabled()) == 0)
 #define realtime_cpu_only()    XENO_BUGON(CONTEXT, 
!xnsched_supported_cpu(ipipe_processor_id()))
 
 void __xnsys_assert_failed(const char *file, int line, const char *msg);
diff --git a/include/cobalt/kernel/ppd.h b/include/cobalt/kernel/ppd.h
index 05e32b3..937f998 100644
--- a/include/cobalt/kernel/ppd.h
+++ b/include/cobalt/kernel/ppd.h
@@ -23,6 +23,7 @@
 
 #include <cobalt/kernel/list.h>
 #include <cobalt/kernel/shadow.h>
+#include <cobalt/kernel/lock.h>
 #include <cobalt/kernel/heap.h>
 
 struct mm_struct;
@@ -53,7 +54,7 @@ struct xnsys_ppd {
 
 extern struct xnsys_ppd __xnsys_global_ppd;
 
-static inline struct xnsys_ppd *xnsys_ppd_get(int global)
+static inline struct xnsys_ppd *__xnsys_ppd_get(int global)
 {
        struct xnshadow_ppd *ppd;
 
@@ -63,4 +64,16 @@ static inline struct xnsys_ppd *xnsys_ppd_get(int global)
        return container_of(ppd, struct xnsys_ppd, ppd);
 }
 
+static inline struct xnsys_ppd *xnsys_ppd_get(int global)
+{
+       struct xnsys_ppd *ppd;
+       spl_t s;
+
+       xnlock_get_irqsave(&nklock, s);
+       ppd = __xnsys_ppd_get(global);
+       xnlock_put_irqrestore(&nklock, s);
+
+       return ppd;
+}
+
 #endif /* _COBALT_KERNEL_PPD_H */
diff --git a/kernel/cobalt/debug.c b/kernel/cobalt/debug.c
index 226c5ee..10fbb53 100644
--- a/kernel/cobalt/debug.c
+++ b/kernel/cobalt/debug.c
@@ -618,11 +618,8 @@ void xndebug_shadow_init(struct xnthread *thread)
 {
        struct xnsys_ppd *sys_ppd;
        size_t len;
-       spl_t s;
 
-       xnlock_get_irqsave(&nklock, s);
        sys_ppd = xnsys_ppd_get(0);
-       xnlock_put_irqrestore(&nklock, s);
        /*
         * The caller is current, so we know for sure that sys_ppd
         * will still be valid after we dropped the lock.
diff --git a/kernel/cobalt/posix/internal.h b/kernel/cobalt/posix/internal.h
index bf73ea3..9102e27 100644
--- a/kernel/cobalt/posix/internal.h
+++ b/kernel/cobalt/posix/internal.h
@@ -67,9 +67,16 @@ static inline struct cobalt_process 
*cobalt_process_context(void)
 static inline struct cobalt_kqueues *cobalt_kqueues(int pshared)
 {
        struct xnshadow_ppd *ppd;
+       spl_t s;
+
+       xnlock_get_irqsave(&nklock, s);
 
-       if (pshared || (ppd = xnshadow_ppd_get(cobalt_muxid)) == NULL)
+       if (pshared || (ppd = xnshadow_ppd_get(cobalt_muxid)) == NULL) {
+               xnlock_put_irqrestore(&nklock, s);
                return &cobalt_global_kqueues;
+       }
+
+       xnlock_put_irqrestore(&nklock, s);
 
        return &container_of(ppd, struct cobalt_process, ppd)->kqueues;
 }
diff --git a/kernel/cobalt/shadow.c b/kernel/cobalt/shadow.c
index 4fc51ca..8f53474 100644
--- a/kernel/cobalt/shadow.c
+++ b/kernel/cobalt/shadow.c
@@ -919,7 +919,6 @@ int xnshadow_map_user(struct xnthread *thread,
        struct xnthread_start_attr attr;
        struct xnsys_ppd *sys_ppd;
        struct xnheap *sem_heap;
-       spl_t s;
        int ret;
 
        if (!xnthread_test_state(thread, XNUSER))
@@ -953,10 +952,7 @@ int xnshadow_map_user(struct xnthread *thread,
        }
 #endif /* CONFIG_MMU */
 
-       xnlock_get_irqsave(&nklock, s);
        sys_ppd = xnsys_ppd_get(0);
-       xnlock_put_irqrestore(&nklock, s);
-
        sem_heap = &sys_ppd->sem_heap;
        u_window = xnheap_alloc(sem_heap, sizeof(*u_window));
        if (u_window == NULL) {
@@ -1323,7 +1319,7 @@ static int handle_mayday_event(struct pt_regs *regs)
 
        /* We enter the mayday handler with hw IRQs off. */
        xnlock_get(&nklock);
-       sys_ppd = xnsys_ppd_get(0);
+       sys_ppd = __xnsys_ppd_get(0);
        xnlock_put(&nklock);
 
        xnarch_handle_mayday(tcb, regs, sys_ppd->mayday_addr);
@@ -1551,9 +1547,6 @@ static int xnshadow_sys_heap_info(struct xnheap_desc 
__user *u_hd,
 {
        struct xnheap_desc hd;
        struct xnheap *heap;
-       spl_t s;
-
-       xnlock_get_irqsave(&nklock, s);
 
        switch(heap_nr) {
        case XNHEAP_PROC_PRIVATE_HEAP:
@@ -1564,7 +1557,6 @@ static int xnshadow_sys_heap_info(struct xnheap_desc 
__user *u_hd,
                heap = &kheap;
                break;
        default:
-               xnlock_put_irqrestore(&nklock, s);
                return -EINVAL;
        }
 
@@ -1572,7 +1564,6 @@ static int xnshadow_sys_heap_info(struct xnheap_desc 
__user *u_hd,
        hd.size = xnheap_extentsize(heap);
        hd.area = xnheap_base_memory(heap);
        hd.used = xnheap_used_mem(heap);
-       xnlock_put_irqrestore(&nklock, s);
 
        return __xn_safe_copy_to_user(u_hd, &hd, sizeof(*u_hd));
 }
@@ -2279,7 +2270,6 @@ static int handle_taskexit_event(struct task_struct *p) 
/* p == current */
        struct xnsys_ppd *sys_ppd;
        struct xnthread *thread;
        struct mm_struct *mm;
-       spl_t s;
 
        /*
         * We are called for both kernel and user shadows over the
@@ -2302,9 +2292,7 @@ static int handle_taskexit_event(struct task_struct *p) 
/* p == current */
        xnsched_run();
 
        if (xnthread_test_state(thread, XNUSER)) {
-               xnlock_get_irqsave(&nklock, s);
                sys_ppd = xnsys_ppd_get(0);
-               xnlock_put_irqrestore(&nklock, s);
                xnheap_free(&sys_ppd->sem_heap, thread->u_window);
                thread->u_window = NULL;
                mm = xnshadow_current_mm();
@@ -2486,15 +2474,12 @@ static int handle_cleanup_event(struct mm_struct *mm)
        struct xnsys_ppd *sys_ppd;
        struct xnthread *thread;
        struct mm_struct *old;
-       spl_t s;
 
        /* We are NOT called for exiting kernel shadows. */
 
        old = xnshadow_swap_mm(mm);
 
-       xnlock_get_irqsave(&nklock, s);
        sys_ppd = xnsys_ppd_get(0);
-       xnlock_put_irqrestore(&nklock, s);
        if (sys_ppd != &__xnsys_global_ppd) {
                /*
                 * Detect a userland shadow running exec(), i.e. still


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to