]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 9 Jun 2006 20:25:26 +0000 (20:25 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Fri, 9 Jun 2006 20:25:26 +0000 (20:25 +0000)
* remote-file.io.c (remote_fileio_func_system): Treat zero length
string as NULL.  Adjust for NULL pointer argument.
* doc/gdb.texinfo (system): Document behaviour with zero length
string.

gdb/testsuite/
* gdb.base/fileio.c: Add system(NULL) test.
* gdb.base/fileio.exp: Check it.

ChangeLog.csl
gdb/doc/gdb.texinfo
gdb/remote-fileio.c
gdb/testsuite/gdb.base/fileio.c
gdb/testsuite/gdb.base/fileio.exp

index 95c26490dd65a253c8a137e9186c4e51919c9cd1..bc867d44a904aa830a7e6966dcedf1a397dbfcfa 100644 (file)
@@ -1,5 +1,15 @@
 2006-06-09  Nathan Sidwell  <nathan@codesourcery.com>
 
+       gdb/
+       * remote-file.io.c (remote_fileio_func_system): Treat zero length
+       string as NULL.  Adjust for NULL pointer argument.
+       * doc/gdb.texinfo (system): Document behaviour with zero length
+       string.
+
+       gdb/testsuite/
+       * gdb.base/fileio.c: Add system(NULL) test.
+       * gdb.base/fileio.exp: Check it.
+
        gdb/testsuite/
        * gdb.cp/anon-union.cc: Add code at end of function.
        * gdb.cp/anon-union.exp: Adjust end of function breakpoint.
index b1a7581121480810e707475f6346417228e332fe..13dd712095b67b5abcc2cb867e79c391d8d0be6e 100644 (file)
@@ -24564,11 +24564,13 @@ int system(const char *command);
 Fsystem,commandptr/len
 
 @exdent Return value:
-The value returned is -1 on error and the return status
-of the command otherwise.  Only the exit status of the
-command is returned, which is extracted from the hosts
-system return value by calling WEXITSTATUS(retval).
-In case /bin/sh could not be executed, 127 is returned.
+If @var{len} is zero, the return value indicates whether a shell is
+available.  Zero indicates it is not available and non-zero indicates
+that it is.  Otherwise, the value returned is -1 on error and the
+return status of the command otherwise.  Only the exit status of the
+command is returned, which is extracted from the hosts system return
+value by calling WEXITSTATUS(retval).  In case /bin/sh could not be
+executed, 127 is returned.
 
 @exdent Errors:
 @end smallexample
index c9fbb03fb95cb350aa050cdb50f093014cb95ef2..952c31875abfabaed9da1d990473b30fc17632d2 100644 (file)
@@ -1278,16 +1278,7 @@ remote_fileio_func_system (char *buf)
 {
   CORE_ADDR ptrval;
   int ret, length, retlength;
-  char *cmdline;
-
-  /* Check if system(3) has been explicitely allowed using the
-     `set remote system-call-allowed 1' command.  If not, return
-     EPERM */
-  if (!remote_fio_system_call_allowed)
-    {
-      remote_fileio_reply (-1, FILEIO_EPERM);
-      return;
-    }
+  char *cmdline = NULL;
 
   /* Parameter: Ptr to commandline / length incl. trailing zero */
   if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length))
@@ -1295,19 +1286,37 @@ remote_fileio_func_system (char *buf)
       remote_fileio_ioerror ();
       return;
     }
-  /* Request commandline using 'm' packet */
-  cmdline = alloca (length);
-  retlength = remote_read_bytes (ptrval, (gdb_byte *) cmdline, length);
-  if (retlength != length)
+
+  if (length)
     {
-      remote_fileio_ioerror ();
+      /* Request commandline using 'm' packet */
+      cmdline = alloca (length);
+      retlength = remote_read_bytes (ptrval, (gdb_byte *) cmdline, length);
+      if (retlength != length)
+       {
+         remote_fileio_ioerror ();
+         return;
+       }
+    }
+  
+  /* Check if system(3) has been explicitely allowed using the
+     `set remote system-call-allowed 1' command.  If not, return
+     EPERM */
+  if (!remote_fio_system_call_allowed)
+    {
+      if (!length)
+       remote_fileio_return_success (0);
+      else
+       remote_fileio_reply (-1, FILEIO_EPERM);
       return;
     }
 
   remote_fio_no_longjmp = 1;
   ret = system (cmdline);
 
-  if (ret == -1)
+  if (!length)
+    remote_fileio_return_success (ret);
+  else if (ret == -1)
     remote_fileio_return_errno (-1);
   else
     remote_fileio_return_success (WEXITSTATUS (ret));
index f0883c62711f6e4f8977784805c0904eaedc277c..1763f50594f94975ad1558f4153acf4556266aed 100644 (file)
@@ -385,6 +385,10 @@ test_system ()
   ret = system ("wrtzlpfrmpft");
   printf ("system 2: ret = %d %s\n", ret, WEXITSTATUS (ret) == 127 ? "OK" : "");
   stop ();
+  /* Test for shell */
+  ret = system (NULL);
+  printf ("system 3: ret = %d %s\n", ret, ret != 0 ? "OK" : "");
+  stop ();
 }
 
 int
index 1da8b16a158ebde2f6991fa8b194f5888fe782d8..436afb75eb16b67f57f901824cc04356f86d6ee9 100644 (file)
@@ -190,6 +190,10 @@ gdb_test continue \
 "Continuing\\..*system 2:.*OK$stop_msg" \
 "System with invalid command returns 127"
 
+gdb_test continue \
+"Continuing\\..*system 3:.*OK$stop_msg" \
+"System says shell is available"
+
 gdb_test continue \
 "Continuing\\..*rename 1:.*OK$stop_msg" \
 "Rename a file"