OSDN Git Service

sysctl: avoid inline initialization
authorMike Frysinger <vapier@gentoo.org>
Thu, 22 Oct 2009 04:43:19 +0000 (00:43 -0400)
committerMike Frysinger <vapier@gentoo.org>
Thu, 22 Oct 2009 04:43:19 +0000 (00:43 -0400)
Assign each field one by one rather than stack initialization as gcc will
call memset() to zero out the rest of the structure -- which we don't care
about as the field is unused and not seen outside of the libc.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
libc/sysdeps/linux/common/sysctl.c

index 11d53cd..f65a3ea 100644 (file)
 #include <sys/syscall.h>
 #if defined __NR__sysctl && (defined __USE_GNU || defined __USE_BSD)
 
-/* psm: including sys/sysctl.h would depend on kernel headers */
-extern int sysctl (int *__name, int __nlen, void *__oldval,
-                  size_t *__oldlenp, void *__newval, size_t __newlen) __THROW;
-
 struct __sysctl_args {
        int *name;
        int nlen;
@@ -24,21 +20,17 @@ struct __sysctl_args {
        unsigned long __unused[4];
 };
 
-static __always_inline
-_syscall1(int, _sysctl, struct __sysctl_args *, args)
-
 int sysctl(int *name, int nlen, void *oldval, size_t * oldlenp,
                   void *newval, size_t newlen)
 {
-       struct __sysctl_args args = {
-         .name = name,
-         .nlen = nlen,
-         .oldval = oldval,
-         .oldlenp = oldlenp,
-         .newval = newval,
-         .newlen = newlen
-       };
-
-       return _sysctl(&args);
+       /* avoid initializing on the stack as gcc will call memset() */
+       struct __sysctl_args args;
+       args.name = name;
+       args.nlen = nlen;
+       args.oldval = oldval;
+       args.oldlenp = oldlenp;
+       args.newval = newval;
+       args.newlen = newlen;
+       return INLINE_SYSCALL(_sysctl, 1, &args);
 }
 #endif