]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
More shmctl() fixes. (Helge Deller)
authorJulian Seward <jseward@acm.org>
Wed, 8 May 2002 01:31:15 +0000 (01:31 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 8 May 2002 01:31:15 +0000 (01:31 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@232

vg_syscall_mem.c

index 6a9826718834e55f6fa6b6419f4bf617fdb63c0e..ea83fbf9191117c451826fb0c9d7362b7757e73f 100644 (file)
@@ -1384,19 +1384,18 @@ void VG_(perform_assumed_nonblocking_syscall) ( ThreadId tid )
                 KERNEL_DO_SYSCALL(tid,res);
                 break;
             case 24: /* IPCOP_shmctl */
-               {
-                  if ( arg3 > 0 ) {
-                     must_be_readable ( tst, "shmctl(buf)", arg3, 
-                                        sizeof( struct shmid_ds ) ); 
-
-                     if ( arg2 == SHM_STAT )
-                        must_be_writable( tst, "shmctl(IPC_STAT,buf)", arg3, 
-                                          sizeof( struct shmid_ds ) );
-                  }
-
-                  KERNEL_DO_SYSCALL(tid,res);
-                  break;
+               if ( arg3 ) {
+                       if ( arg2 == SHM_STAT )
+                               must_be_writable( tst, "shmctl(SHM_STAT,buf)", arg3,
+                                               sizeof(struct shmid_ds) );
+                       else
+                               must_be_readable( tst, "shmctl(SHM_XXXX,buf)", arg3,
+                                               sizeof(struct shmid_ds) );
                }
+               KERNEL_DO_SYSCALL(tid,res);
+               if ( arg3 && !VG_(is_kerror)(res) && res == 0 /*&& arg2 == SHM_STAT*/ )
+                       make_readable( arg3, sizeof(struct shmid_ds) );
+               break;
             default:
                VG_(message)(Vg_DebugMsg,
                             "FATAL: unhandled syscall(ipc) %d",