]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement and test wrappers for lstat_extended, stat64_extended,
authorNicholas Nethercote <njn@valgrind.org>
Wed, 10 Jun 2009 06:13:34 +0000 (06:13 +0000)
committerNicholas Nethercote <njn@valgrind.org>
Wed, 10 Jun 2009 06:13:34 +0000 (06:13 +0000)
lstat64_extended, and improve the existing wrapper for stat_extended.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10291

coregrind/m_syswrap/priv_syswrap-darwin.h
coregrind/m_syswrap/syswrap-darwin.c
coregrind/m_syswrap/syswrap-generic.c
memcheck/tests/darwin/scalar.c
memcheck/tests/darwin/scalar.stderr.exp

index c72eb5a29573e4a9b8a47fbcd54c7a1767de3446..6e822523a127a61876b65d730b3e89e1a0a4de16 100644 (file)
@@ -335,7 +335,7 @@ DECL_TEMPLATE(darwin, sem_destroy);             // 276
 // NYI open_extended 277
 // NYI umask_extended 278
 DECL_TEMPLATE(darwin, stat_extended);           // 279
-// NYI lstat_extended 280
+DECL_TEMPLATE(darwin, lstat_extended);          // 280
 // NYI fstat_extended 281
 DECL_TEMPLATE(darwin, chmod_extended);          // 282
 DECL_TEMPLATE(darwin, fchmod_extended);         // 283
@@ -396,8 +396,8 @@ DECL_TEMPLATE(darwin, sendfile);                // 337
 DECL_TEMPLATE(darwin, stat64);                  // 338
 DECL_TEMPLATE(darwin, fstat64);                 // 339
 DECL_TEMPLATE(darwin, lstat64);                 // 340
-// NYI stat64_extended 341
-// NYI lstat64_extended 342
+DECL_TEMPLATE(darwin, stat64_extended);         // 341
+DECL_TEMPLATE(darwin, lstat64_extended);        // 342
 // NYI fstat64_extended 343
 DECL_TEMPLATE(darwin, getdirentries64);         // 344
 DECL_TEMPLATE(darwin, statfs64);                // 345
index d670ee1cdc56aebdc9ebaeaf0122c84e90f25dbd..20238def2eff417a6c117fec7f47193120b3ef24 100644 (file)
@@ -1828,22 +1828,90 @@ PRE(stat_extended)
    PRE_REG_READ4(int, "stat_extended", char *, file_name, struct stat *, buf, 
                  void *, fsacl, vki_size_t *, fsacl_size);
    PRE_MEM_RASCIIZ( "stat_extended(file_name)",  ARG1 );
-   PRE_MEM_READ(    "stat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
    PRE_MEM_WRITE(   "stat_extended(buf)",        ARG2, sizeof(struct vki_stat) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      PRE_MEM_WRITE("stat_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
+   PRE_MEM_READ(    "stat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
    PRE_MEM_WRITE(   "stat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
-   PRE_MEM_WRITE(   "stat_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
 }
 POST(stat_extended)
 {
    POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
+   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
+}
+
+
+PRE(lstat_extended)
+{
+   PRINT("lstat_extended( %#lx(%s), %#lx, %#lx, %#lx )",
+      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
+   PRE_REG_READ4(int, "lstat_extended", char *, file_name, struct stat *, buf, 
+                 void *, fsacl, vki_size_t *, fsacl_size);
+   PRE_MEM_RASCIIZ( "lstat_extended(file_name)",  ARG1 );
+   PRE_MEM_WRITE(   "lstat_extended(buf)",        ARG2, sizeof(struct vki_stat) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      PRE_MEM_WRITE("lstat_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
+   PRE_MEM_READ(    "lstat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
+   PRE_MEM_WRITE(   "lstat_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
+}
+POST(lstat_extended)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
+   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
+}
+
+
+PRE(stat64_extended)
+{
+   PRINT("stat64_extended( %#lx(%s), %#lx, %#lx, %#lx )",
+      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
+   PRE_REG_READ4(int, "stat64_extended", char *, file_name, struct stat64 *, buf, 
+                 void *, fsacl, vki_size_t *, fsacl_size);
+   PRE_MEM_RASCIIZ( "stat64_extended(file_name)",  ARG1 );
+   PRE_MEM_WRITE(   "stat64_extended(buf)",        ARG2, sizeof(struct vki_stat64) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      PRE_MEM_WRITE("stat64_extended(fsacl)",      ARG3, *(vki_size_t *)ARG4 );
+   PRE_MEM_READ(    "stat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
+   PRE_MEM_WRITE(   "stat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
+}
+POST(stat64_extended)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
+   POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
+}
+
+
+PRE(lstat64_extended)
+{
+   PRINT("lstat64_extended( %#lx(%s), %#lx, %#lx, %#lx )",
+      ARG1, (char *)ARG1, ARG2, ARG3, ARG4);
+   PRE_REG_READ4(int, "lstat64_extended", char *, file_name, struct stat64 *, buf, 
+                 void *, fsacl, vki_size_t *, fsacl_size);
+   PRE_MEM_RASCIIZ( "lstat64_extended(file_name)",  ARG1 );
+   PRE_MEM_WRITE(   "lstat64_extended(buf)",        ARG2, sizeof(struct vki_stat64) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      PRE_MEM_WRITE(   "lstat64_extended(fsacl)",   ARG3, *(vki_size_t *)ARG4 );
+   PRE_MEM_READ(    "lstat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
+   PRE_MEM_WRITE(   "lstat64_extended(fsacl_size)", ARG4, sizeof(vki_size_t) );
+}
+POST(lstat64_extended)
+{
+   POST_MEM_WRITE( ARG2, sizeof(struct vki_stat64) );
+   if (ML_(safe_to_deref)( (void*)ARG4, sizeof(vki_size_t) ))
+      POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
    POST_MEM_WRITE( ARG4, sizeof(vki_size_t) );
-   POST_MEM_WRITE( ARG3, *(vki_size_t *)ARG4 );
 }
 
 
 PRE(fchmod_extended)
 {
-   /* Note: this is not really correct.  Handling of
+   /* DDD: Note: this is not really correct.  Handling of
       chmod_extended is broken in the same way. */
    PRINT("fchmod_extended ( %ld, %ld, %ld, %ld, %#lx )",
          ARG1, ARG2, ARG3, ARG4, ARG5);
@@ -1853,7 +1921,7 @@ PRE(fchmod_extended)
                  gid_t, gid,
                  vki_mode_t, mode,
                  void* /*really,user_addr_t*/, xsecurity);
-   /* relative to the xnu sources (kauth_copyinfilesec), this
+   /* DDD: relative to the xnu sources (kauth_copyinfilesec), this
       is just way wrong. */
    PRE_MEM_READ( "fchmod_extended(xsecurity)", ARG5, 
                  sizeof(struct kauth_filesec) );
@@ -1861,7 +1929,7 @@ PRE(fchmod_extended)
 
 PRE(chmod_extended)
 {
-   /* Note: this is not really correct.  Handling of
+   /* DDD: Note: this is not really correct.  Handling of
       fchmod_extended is broken in the same way. */
    PRINT("chmod_extended ( %#lx(%s), %ld, %ld, %ld, %#lx )",
          ARG1, ARG1 ? (HChar*)ARG1 : "(null)", ARG2, ARG3, ARG4, ARG5);
@@ -1872,7 +1940,7 @@ PRE(chmod_extended)
                  vki_mode_t, mode,
                  void* /*really,user_addr_t*/, xsecurity);
    PRE_MEM_RASCIIZ("chmod_extended(path)", ARG1);
-   /* relative to the xnu sources (kauth_copyinfilesec), this
+   /* DDD: relative to the xnu sources (kauth_copyinfilesec), this
       is just way wrong. */
    PRE_MEM_READ( "chmod_extended(xsecurity)", ARG5, 
                  sizeof(struct kauth_filesec) );
@@ -7157,7 +7225,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 // _____(__NR_open_extended), 
 // _____(__NR_umask_extended), 
    MACXY(__NR_stat_extended,  stat_extended), 
-// _____(__NR_lstat_extended),   // 280
+   MACXY(__NR_lstat_extended, lstat_extended),   // 280
 // _____(__NR_fstat_extended), 
    MACX_(__NR_chmod_extended,    chmod_extended), 
    MACX_(__NR_fchmod_extended,   fchmod_extended), 
@@ -7218,8 +7286,8 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    MACXY(__NR_stat64,      stat64), 
    MACXY(__NR_fstat64,     fstat64), 
    MACXY(__NR_lstat64,     lstat64),    // 340
-// _____(__NR_stat64_extended), 
-// _____(__NR_lstat64_extended), 
+   MACXY(__NR_stat64_extended,  stat64_extended), 
+   MACXY(__NR_lstat64_extended, lstat64_extended), 
 // _____(__NR_fstat64_extended), 
    MACXY(__NR_getdirentries64, getdirentries64), 
    MACXY(__NR_statfs64,    statfs64), 
index 354c48527eea18871e5cb9e0e877f8150af9ab07..1aedb6a15e7fef81cae85a1d68f844da93276993 100644 (file)
@@ -109,7 +109,7 @@ Bool ML_(client_signal_OK)(Int sigNo)
 
 Bool ML_(safe_to_deref) ( void* start, SizeT size )
 {
-   return VG_(am_is_valid_for_client)( (Addr)start, size, VKI_PROT_NONE );
+   return VG_(am_is_valid_for_client)( (Addr)start, size, VKI_PROT_READ );
 }
 
 
index bfd8397a389713a928ca0dfe16e2ea039bce4143..fef31b803fe2ad5a8265279028224b4e7dd86c2e 100644 (file)
@@ -364,8 +364,24 @@ int main(void)
 
    // __NR_open_extended 277
    // __NR_umask_extended 278
+
    // __NR_stat_extended 279
+   {
+      size_t one = 1;
+      GO(__NR_stat_extended, "4s 4m");
+      SY(__NR_stat_extended, x0, x0, x0, x0); FAIL;
+      // Go again to get a complaint about where the 3rd arg points;  it
+      // requires the 4th arg to point to a valid value.
+      SY(__NR_stat_extended, 0, 0, 0, &one); FAIL;
+
    // __NR_lstat_extended 280
+      GO(__NR_lstat_extended, "4s 4m");
+      SY(__NR_lstat_extended, x0, x0, x0, x0); FAIL;
+      // Go again to get a complaint about where the 3rd arg points;  it
+      // requires the 4th arg to point to a valid value.
+      SY(__NR_lstat_extended, 0, 0, 0, &one); FAIL;
+   }
+
    // __NR_fstat_extended 281
    // __NR_chmod_extended 282
    // __NR_fchmod_extended 283
@@ -428,8 +444,24 @@ int main(void)
    // __NR_fstat64 339
    // __NR_lstat64 340
    // __NR_stat64_extended 341
+
    // __NR_lstat64_extended 342
+   {
+      size_t one = 1;
+      GO(__NR_stat64_extended, "4s 4m");
+      SY(__NR_stat64_extended, x0, x0, x0, x0); FAIL;
+      // Go again to get a complaint about where the 3rd arg points;  it
+      // requires the 4th arg to point to a valid value.
+      SY(__NR_stat64_extended, 0, 0, 0, &one); FAIL;
+
    // __NR_fstat64_extended 343
+      GO(__NR_lstat64_extended, "4s 4m");
+      SY(__NR_lstat64_extended, x0, x0, x0, x0); FAIL;
+      // Go again to get a complaint about where the 3rd arg points;  it
+      // requires the 4th arg to point to a valid value.
+      SY(__NR_lstat64_extended, 0, 0, 0, &one); FAIL;
+   }
+
    // __NR_getdirentries64 344
    // __NR_statfs64 345
    // __NR_fstatfs64 346
index d0541e1e1ae8679fc564457ee7b1f861afb43957..fbd0014aa61b7e8df3d99e67dd08839235a9f4b3 100644 (file)
@@ -214,6 +214,130 @@ Syscall param sem_destroy(sem) points to unaddressable byte(s)
    ...
  Address 0x........ is not stack'd, malloc'd or (recently) free'd
 -----------------------------------------------------
+x2000117(279):  __NR_stat_extended 4s 4m
+-----------------------------------------------------
+
+Syscall param stat_extended(file_name) contains uninitialised byte(s)
+   ...
+
+Syscall param stat_extended(buf) contains uninitialised byte(s)
+   ...
+
+Syscall param stat_extended(fsacl) contains uninitialised byte(s)
+   ...
+
+Syscall param stat_extended(fsacl_size) contains uninitialised byte(s)
+   ...
+
+Syscall param stat_extended(file_name) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param stat_extended(buf) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param stat_extended(fsacl_size) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param stat_extended(fsacl) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+-----------------------------------------------------
+x2000118(280): __NR_lstat_extended 4s 4m
+-----------------------------------------------------
+
+Syscall param lstat_extended(file_name) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat_extended(buf) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat_extended(fsacl) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat_extended(fsacl_size) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat_extended(file_name) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lstat_extended(buf) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lstat_extended(fsacl_size) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lstat_extended(fsacl) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+-----------------------------------------------------
+x2000155(341):__NR_stat64_extended 4s 4m
+-----------------------------------------------------
+
+Syscall param stat64_extended(file_name) contains uninitialised byte(s)
+   ...
+
+Syscall param stat64_extended(buf) contains uninitialised byte(s)
+   ...
+
+Syscall param stat64_extended(fsacl) contains uninitialised byte(s)
+   ...
+
+Syscall param stat64_extended(fsacl_size) contains uninitialised byte(s)
+   ...
+
+Syscall param stat64_extended(file_name) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param stat64_extended(buf) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param stat64_extended(fsacl_size) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param stat64_extended(fsacl) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+-----------------------------------------------------
+x2000156(342):__NR_lstat64_extended 4s 4m
+-----------------------------------------------------
+
+Syscall param lstat64_extended(file_name) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat64_extended(buf) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat64_extended(fsacl) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat64_extended(fsacl_size) contains uninitialised byte(s)
+   ...
+
+Syscall param lstat64_extended(file_name) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lstat64_extended(buf) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lstat64_extended(fsacl_size) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lstat64_extended(fsacl) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+-----------------------------------------------------
 x20001a4(420):__NR_sem_wait_nocancel 0s* 0m
 -----------------------------------------------------
 -----------------------------------------------------