[Xenomai-git] Jan Kiszka : POSIX: Work around for error code corruption in pthread_cond_[ timed]wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:22:22 2010 +0100

POSIX: Work around for error code corruption in pthread_cond_[timed]wait

This is the some work around for POSIX as already applied on Native. The
temporary storage of the prologue error in xnthread's errcode is a bit
more fragile here as POSIX services uses this variable for saving errno.
Therefore, user space that makes use of signal handlers should better
migrate to revised syscalls that will be added later on.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |   23 ++-
 1 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 6c3ec3a..0032f4d 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
union __xeno_mutex mx, *umx;
unsigned timed, count;
struct timespec ts;
-   int err;
+   int err, epilogue_err;
 
ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
@@ -1560,14 +1560,19 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
mx.shadow_mutex,
count, timed, XN_INFINITE);
 
+   cur-errcode = err != EINTR ? err : 0;
+
if (err == 0 || err == ETIMEDOUT) {
-   err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
-   mx.shadow_mutex, count);
-   if (err == 0 
-   __xn_safe_copy_to_user((void __user *)
-  umx-shadow_mutex.lockcnt,
-  mx.shadow_mutex.lockcnt,
-  sizeof(umx-shadow_mutex.lockcnt)))
+   epilogue_err =
+   -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
+  mx.shadow_mutex,
+  count);
+   if (epilogue_err != 0)
+   err = epilogue_err;
+   else if (__xn_safe_copy_to_user((void __user *)
+   umx-shadow_mutex.lockcnt,
+   mx.shadow_mutex.lockcnt,
+   
sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
 
@@ -1618,7 +1623,7 @@ static int __pthread_cond_wait_epilogue(struct pt_regs 
*regs)
  sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
 
-   return err;
+   return err ? err : -cur-errcode;
 }
 
 static int __pthread_cond_signal(struct pt_regs *regs)


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Jan Kiszka : POSIX: Work around for error code corruption in pthread_cond_[ timed]wait

2010-03-06 Thread GIT version control
Module: xenomai-jki
Branch: queues/assorted
Commit: c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=c94e685bbc9dd5ee7859ead6b3fb77bda45d4cd5

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:22:22 2010 +0100

POSIX: Work around for error code corruption in pthread_cond_[timed]wait

This is the some work around for POSIX as already applied on Native. The
temporary storage of the prologue error in xnthread's errcode is a bit
more fragile here as POSIX services uses this variable for saving errno.
Therefore, user space that makes use of signal handlers should better
migrate to revised syscalls that will be added later on.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |   23 ++-
 1 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 6c3ec3a..0032f4d 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
union __xeno_mutex mx, *umx;
unsigned timed, count;
struct timespec ts;
-   int err;
+   int err, epilogue_err;
 
ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
@@ -1560,14 +1560,19 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
mx.shadow_mutex,
count, timed, XN_INFINITE);
 
+   cur-errcode = err != EINTR ? err : 0;
+
if (err == 0 || err == ETIMEDOUT) {
-   err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
-   mx.shadow_mutex, count);
-   if (err == 0 
-   __xn_safe_copy_to_user((void __user *)
-  umx-shadow_mutex.lockcnt,
-  mx.shadow_mutex.lockcnt,
-  sizeof(umx-shadow_mutex.lockcnt)))
+   epilogue_err =
+   -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
+  mx.shadow_mutex,
+  count);
+   if (epilogue_err != 0)
+   err = epilogue_err;
+   else if (__xn_safe_copy_to_user((void __user *)
+   umx-shadow_mutex.lockcnt,
+   mx.shadow_mutex.lockcnt,
+   
sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
 
@@ -1618,7 +1623,7 @@ static int __pthread_cond_wait_epilogue(struct pt_regs 
*regs)
  sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
 
-   return err;
+   return err ? err : -cur-errcode;
 }
 
 static int __pthread_cond_signal(struct pt_regs *regs)


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Jan Kiszka : POSIX: Work around for error code corruption in pthread_cond_[ timed]wait

2010-03-05 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: d5264a40e7ee371954ac00a257b7835a64c8c88f
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=d5264a40e7ee371954ac00a257b7835a64c8c88f

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:22:22 2010 +0100

POSIX: Work around for error code corruption in pthread_cond_[timed]wait

This is the some work around for POSIX as already applied on Native. The
temporary storage of the prologue error in xnthread's errcode is a bit
more fragile here as POSIX services uses this variable for saving errno.
Therefore, user space that makes use of signal handlers should better
migrate to revised syscalls that will be added later on.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |   25 -
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 6c3ec3a..59be317 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
union __xeno_mutex mx, *umx;
unsigned timed, count;
struct timespec ts;
-   int err;
+   int err, epilogue_err;
 
ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
@@ -1560,14 +1560,21 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
mx.shadow_mutex,
count, timed, XN_INFINITE);
 
+   /* Old user space prevents that we can return EINTR (it would loop
+  forever if we did). So drop this error. */
+   cur-errcode = err != EINTR ? err : 0;
+
if (err == 0 || err == ETIMEDOUT) {
-   err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
-   mx.shadow_mutex, count);
-   if (err == 0 
-   __xn_safe_copy_to_user((void __user *)
-  umx-shadow_mutex.lockcnt,
-  mx.shadow_mutex.lockcnt,
-  sizeof(umx-shadow_mutex.lockcnt)))
+   epilogue_err =
+   -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
+  mx.shadow_mutex,
+  count);
+   if (epilogue_err != 0)
+   err = epilogue_err;
+   else if (__xn_safe_copy_to_user((void __user *)
+   umx-shadow_mutex.lockcnt,
+   mx.shadow_mutex.lockcnt,
+   
sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
 
@@ -1618,7 +1625,7 @@ static int __pthread_cond_wait_epilogue(struct pt_regs 
*regs)
  sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
 
-   return err;
+   return err ? err : -cur-errcode;
 }
 
 static int __pthread_cond_signal(struct pt_regs *regs)


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git


[Xenomai-git] Jan Kiszka : POSIX: Work around for error code corruption in pthread_cond_[ timed]wait

2010-03-02 Thread GIT version control
Module: xenomai-jki
Branch: for-upstream
Commit: 368b0bd6663a9aff89cdc2d331460db0b619830d
URL:
http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=368b0bd6663a9aff89cdc2d331460db0b619830d

Author: Jan Kiszka jan.kis...@siemens.com
Date:   Tue Mar  2 23:22:22 2010 +0100

POSIX: Work around for error code corruption in pthread_cond_[timed]wait

This is the some work around for POSIX as already applied on Native. The
temporary storage of the prologue error in xnthread's errcode is a bit
more fragile here as POSIX services uses this variable for saving errno.
Therefore, user space that makes use of signal handlers should better
migrate to revised syscalls that will be added later on.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com

---

 ksrc/skins/posix/syscall.c |   25 -
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/ksrc/skins/posix/syscall.c b/ksrc/skins/posix/syscall.c
index 6c3ec3a..59be317 100644
--- a/ksrc/skins/posix/syscall.c
+++ b/ksrc/skins/posix/syscall.c
@@ -1520,7 +1520,7 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
union __xeno_mutex mx, *umx;
unsigned timed, count;
struct timespec ts;
-   int err;
+   int err, epilogue_err;
 
ucnd = (union __xeno_cond *)__xn_reg_arg1(regs);
umx = (union __xeno_mutex *)__xn_reg_arg2(regs);
@@ -1560,14 +1560,21 @@ static int __pthread_cond_wait_prologue(struct pt_regs 
*regs)
mx.shadow_mutex,
count, timed, XN_INFINITE);
 
+   /* Old user space prevents that we can return EINTR (it would loop
+  forever if we did). So drop this error. */
+   cur-errcode = err != EINTR ? err : 0;
+
if (err == 0 || err == ETIMEDOUT) {
-   err = -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
-   mx.shadow_mutex, count);
-   if (err == 0 
-   __xn_safe_copy_to_user((void __user *)
-  umx-shadow_mutex.lockcnt,
-  mx.shadow_mutex.lockcnt,
-  sizeof(umx-shadow_mutex.lockcnt)))
+   epilogue_err =
+   -pse51_cond_timedwait_epilogue(cur, cnd.shadow_cond,
+  mx.shadow_mutex,
+  count);
+   if (epilogue_err != 0)
+   err = epilogue_err;
+   else if (__xn_safe_copy_to_user((void __user *)
+   umx-shadow_mutex.lockcnt,
+   mx.shadow_mutex.lockcnt,
+   
sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
}
 
@@ -1618,7 +1625,7 @@ static int __pthread_cond_wait_epilogue(struct pt_regs 
*regs)
  sizeof(umx-shadow_mutex.lockcnt)))
return -EFAULT;
 
-   return err;
+   return err ? err : -cur-errcode;
 }
 
 static int __pthread_cond_signal(struct pt_regs *regs)


___
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git