Mark Wielaard c728a33
#include <sys/capability.h>
Mark Wielaard c728a33
#include <stddef.h>
Mark Wielaard c728a33
#include <stdio.h>
Mark Wielaard c728a33
Mark Wielaard c728a33
int
Mark Wielaard c728a33
main (int c, char **argv)
Mark Wielaard c728a33
{
Mark Wielaard c728a33
  struct __user_cap_header_struct hdr;
Mark Wielaard c728a33
  hdr.version = _LINUX_CAPABILITY_VERSION;
Mark Wielaard c728a33
  hdr.pid = 0;
Mark Wielaard c728a33
  (void) capget(&hdr, NULL);
Mark Wielaard c728a33
  switch (hdr.version) {
Mark Wielaard c728a33
    case _LINUX_CAPABILITY_VERSION_1:
Mark Wielaard c728a33
      printf("Version 1\n");
Mark Wielaard c728a33
      break;
Mark Wielaard c728a33
    case _LINUX_CAPABILITY_VERSION_2:
Mark Wielaard c728a33
      printf("Version 2\n");
Mark Wielaard c728a33
      break;
Mark Wielaard c728a33
    default:
Mark Wielaard c728a33
      printf("Unknown version\n");
Mark Wielaard c728a33
      break;
Mark Wielaard c728a33
   }
Mark Wielaard c728a33
  return 0;
Mark Wielaard c728a33
}
Mark Wielaard c728a33
81c97a1
--- valgrind-3.7.0/coregrind/m_syswrap/syswrap-linux.c.jj	2010-04-07 08:14:12.000000000 -0400
81c97a1
+++ valgrind-3.7.0/coregrind/m_syswrap/syswrap-linux.c	2010-04-12 07:24:12.838876000 -0400
Mark Wielaard f4ddfbd
@@ -2212,8 +2212,9 @@ PRE(sys_capget)
7d17c10
                  vki_cap_user_header_t, header, vki_cap_user_data_t, data);
7d17c10
    PRE_MEM_READ( "capget(header)", ARG1, 
7d17c10
                   sizeof(struct __vki_user_cap_header_struct) );
7d17c10
-   PRE_MEM_WRITE( "capget(data)", ARG2, 
7d17c10
-                  sizeof(struct __vki_user_cap_data_struct) );
7d17c10
+   if (ARG2 != (Addr)NULL)
7d17c10
+      PRE_MEM_WRITE( "capget(data)", ARG2, 
7d17c10
+                      sizeof(struct __vki_user_cap_data_struct) );
7d17c10
 }
7d17c10
 POST(sys_capget)
7d17c10
 {
Mark Wielaard a84d919
--- valgrind/memcheck/tests/x86-linux/scalar.c	(revision 13010)
Mark Wielaard a84d919
+++ valgrind/memcheck/tests/x86-linux/scalar.c	(working copy)
Mark Wielaard a84d919
@@ -813,7 +813,7 @@
Mark Wielaard a84d919
 
Mark Wielaard a84d919
    // __NR_capget 184
Mark Wielaard a84d919
    GO(__NR_capget, "2s 2m");
Mark Wielaard a84d919
-   SY(__NR_capget, x0, x0); FAIL;
Mark Wielaard a84d919
+   SY(__NR_capget, x0, x0+1); FAIL;
Mark Wielaard a84d919
 
Mark Wielaard a84d919
    // __NR_capset 185
Mark Wielaard a84d919
    GO(__NR_capset, "2s 2m");