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

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Fri May 10 15:26:04 2013 +0200

posix: avoid races in pthread_set_name_np

---

 ksrc/skins/posix/syscall.c |    6 ------
 ksrc/skins/posix/thread.c  |   11 +++++++++++
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 49ed764..2093edb 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -422,7 +422,6 @@ static int __pthread_set_name_np(struct pt_regs *regs)
 {
        char name[XNOBJECT_NAME_LEN];
        struct pse51_hkey hkey;
-       struct task_struct *p;
        pthread_t k_tid;
 
        if (__xn_safe_strncpy_from_user(name,
@@ -435,11 +434,6 @@ static int __pthread_set_name_np(struct pt_regs *regs)
        hkey.u_tid = __xn_reg_arg1(regs);
        hkey.mm = current->mm;
        k_tid = __pthread_find(&hkey);
-       if (k_tid) {
-               p = xnthread_user_task(&k_tid->threadbase);
-               strncpy(p->comm, name, sizeof(p->comm));
-               p->comm[sizeof(p->comm) - 1] = '\0';
-       }
 
        return -pthread_set_name_np(k_tid, name);
 }
diff --git a/ksrc/skins/posix/thread.c b/ksrc/skins/posix/thread.c
index 01fc699..78f5634 100644
--- a/ksrc/skins/posix/thread.c
+++ b/ksrc/skins/posix/thread.c
@@ -715,6 +715,9 @@ int pthread_set_mode_np(int clrmask, int setmask)
  */
 int pthread_set_name_np(pthread_t thread, const char *name)
 {
+#ifdef CONFIG_XENO_OPT_PERVASIVE
+       struct task_struct *p;
+#endif /* CONFIG_XENO_OPT_PERVASIVE */
        spl_t s;
 
        xnlock_get_irqsave(&nklock, s);
@@ -727,6 +730,14 @@ int pthread_set_name_np(pthread_t thread, const char *name)
        snprintf(xnthread_name(&thread->threadbase), XNOBJECT_NAME_LEN, "%s",
                 name);
 
+#ifdef CONFIG_XENO_OPT_PERVASIVE
+       p = xnthread_user_task(&thread->threadbase);
+       if (p) {
+               strncpy(p->comm, name, sizeof(p->comm));
+               p->comm[sizeof(p->comm) - 1] = '\0';
+       }
+#endif /* CONFIG_XENO_OPT_PERVASIVE */
+
        xnlock_put_irqrestore(&nklock, s);
 
        return 0;


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

Reply via email to