use syscall_arg_t for arguments in public syscall() function
authorRich Felker <dalias@aerifal.cx>
Tue, 18 Mar 2014 21:08:15 +0000 (17:08 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 18 Mar 2014 21:08:15 +0000 (17:08 -0400)
on x32, this change allows programs which use syscall() with pointers
or 64-bit values as arguments to work correctly, i.e. without
truncation or incorrect sign extension. on all other supported archs,
syscall_arg_t is defined as long, so this change is a no-op.

src/misc/syscall.c

index 1535560916fa0c14bd006378ed2e5b7d0567e396..9d435a978579d6121f9c6b9eadbbc3a0a92fe778 100644 (file)
@@ -6,14 +6,14 @@
 long syscall(long n, ...)
 {
        va_list ap;
-       long a,b,c,d,e,f;
+       syscall_arg_t a,b,c,d,e,f;
        va_start(ap, n);
-       a=va_arg(ap, long);
-       b=va_arg(ap, long);
-       c=va_arg(ap, long);
-       d=va_arg(ap, long);
-       e=va_arg(ap, long);
-       f=va_arg(ap, long);
+       a=va_arg(ap, syscall_arg_t);
+       b=va_arg(ap, syscall_arg_t);
+       c=va_arg(ap, syscall_arg_t);
+       d=va_arg(ap, syscall_arg_t);
+       e=va_arg(ap, syscall_arg_t);
+       f=va_arg(ap, syscall_arg_t);
        va_end(ap);
        return __syscall_ret(__syscall(n,a,b,c,d,e,f));
 }