diff options
author | Chris Metcalf <cmetcalf@ezchip.com> | 2015-05-26 20:29:56 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@ezchip.com> | 2015-05-26 20:29:56 -0400 |
commit | 1827059925140a1f0c16faf23ee895ee72f84efc (patch) | |
tree | a967ab57564bee0580e355ee705320e6709bded4 | |
parent | 4da82229f0ea9dd50e43f15705ee92d5d30c4158 (diff) | |
download | glibc-1827059925140a1f0c16faf23ee895ee72f84efc.tar.gz glibc-1827059925140a1f0c16faf23ee895ee72f84efc.tar.xz glibc-1827059925140a1f0c16faf23ee895ee72f84efc.zip |
tile: use better variable naming in INLINE_SYSCALL
At issue for INLINE_SYSCALL was that it used "err" and "val" as variable names in a #define, so that if it was used in a context where the "caller" was also using "err" or "val", and those variables were passed in to INLINE_SYSCALL, we would end up referencing the internal shadowed variables instead. For example, "char val" in check_may_shrink_heap() in sysdeps/unix/sysv/linux/malloc-sysdep.h was being shadowed by the syscall return "val" in INLINE_SYSCALL, causing the "char val" not to get updated at all, and may_shrink_heap ended up always false. A similar fix was made to INTERNAL_VSYSCALL_CALL.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/tile/sysdep.h | 29 |
2 files changed, 21 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog index 7fcd403700..4a38a05643 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-05-26 Chris Metcalf <cmetcalf@ezchip.com> + + * sysdeps/unix/sysv/linux/tile/sysdep.h (INLINE_SYSCALL): + Avoid using variables in #defines that might cause shadowing. + (INTERNAL_VSYSCALL_CALL): Likewise. + 2015-05-26 Roland McGrath <roland@hack.frob.com> * sysdeps/nacl/lll_timedlock_wait.c: New file. diff --git a/sysdeps/unix/sysv/linux/tile/sysdep.h b/sysdeps/unix/sysv/linux/tile/sysdep.h index 1f4122c46b..6b30b2f2dd 100644 --- a/sysdeps/unix/sysv/linux/tile/sysdep.h +++ b/sysdeps/unix/sysv/linux/tile/sysdep.h @@ -78,16 +78,17 @@ /* Define a macro which expands inline into the wrapper code for a system call. */ # undef INLINE_SYSCALL -# define INLINE_SYSCALL(name, nr, args...) \ +# define INLINE_SYSCALL(name, nr, args...) \ ({ \ - INTERNAL_SYSCALL_DECL (err); \ - unsigned long val = INTERNAL_SYSCALL (name, err, nr, args); \ - if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (val, err), 0)) \ - { \ - __set_errno (INTERNAL_SYSCALL_ERRNO (val, err)); \ - val = -1; \ - } \ - (long) val; }) + INTERNAL_SYSCALL_DECL (_sc_err); \ + unsigned long _sc_val = INTERNAL_SYSCALL (name, _sc_err, nr, args); \ + if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (_sc_val, _sc_err), 0)) \ + { \ + __set_errno (INTERNAL_SYSCALL_ERRNO (_sc_val, _sc_err)); \ + _sc_val = -1; \ + } \ + (long) _sc_val; \ + }) #undef INTERNAL_SYSCALL #define INTERNAL_SYSCALL(name, err, nr, args...) \ @@ -203,11 +204,11 @@ "=R05" (_clobber_r5), "=R10" (_clobber_r10) -#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \ - ({ \ - struct syscall_return_value rv = funcptr (args); \ - err = rv.error; \ - rv.value; \ +#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...) \ + ({ \ + struct syscall_return_value _sc_rv = funcptr (args); \ + err = _sc_rv.error; \ + _sc_rv.value; \ }) /* List of system calls which are supported as vsyscalls. */ |