aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/doc/gdb.texinfo12
-rw-r--r--gdb/remote-fileio.c42
-rw-r--r--gdb/testsuite/ChangeLog3
-rw-r--r--gdb/testsuite/gdb.base/fileio.c10
-rw-r--r--gdb/testsuite/gdb.base/fileio.exp8
6 files changed, 56 insertions, 26 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1e9ccc4..a33484f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2006-06-13 Nathan Sidwell <nathan@codesourcery.com>
+
+ * 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.
+
2006-06-12 Daniel Jacobowitz <dan@codesourcery.com>
* remote.c (set_remote_protocol_packet_cmd)
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 47e8d2c..6935d82 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -24752,11 +24752,13 @@ int system(const char *command);
@samp{Fsystem,@var{commandptr}/@var{len}}
@item 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 host's
-@code{system} return value by calling @code{WEXITSTATUS(retval)}.
-In case @file{/bin/sh} could not be executed, 127 is returned.
+If @var{len} is zero, the return value indicates whether a shell is
+available. A zero return value indicates a shell is not available.
+For non-zero @var{len}, 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 host's @code{system}
+return value by calling @code{WEXITSTATUS(retval)}. In case
+@file{/bin/sh} could not be executed, 127 is returned.
@item Errors:
diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c
index d445d40..6089926 100644
--- a/gdb/remote-fileio.c
+++ b/gdb/remote-fileio.c
@@ -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,38 @@ 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 length is 0,
+ indicating a NULL parameter to the system call, return zero to
+ indicate a shell is not available. Otherwise fail with 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));
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 7695bca..4e4fb35 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2006-06-13 Nathan Sidwell <nathan@codesourcery.com>
+ * gdb.base/fileio.c: Add system(NULL) test.
+ * gdb.base/fileio.exp: Check it.
+
* gdb.base/break.c: Add 10a breakpoint at }
* gdb.base/break.exp: Add test for breakpoint at }
* gdb.cp/anon-union.cc: Add code at end of function.
diff --git a/gdb/testsuite/gdb.base/fileio.c b/gdb/testsuite/gdb.base/fileio.c
index f0883c6..3910da5 100644
--- a/gdb/testsuite/gdb.base/fileio.c
+++ b/gdb/testsuite/gdb.base/fileio.c
@@ -373,17 +373,21 @@ test_system ()
int ret;
char sys[512];
+ /* Test for shell */
+ ret = system (NULL);
+ printf ("system 1: ret = %d %s\n", ret, ret != 0 ? "OK" : "");
+ stop ();
/* This test prepares the directory for test_rename() */
sprintf (sys, "mkdir -p %s %s", TESTSUBDIR, TESTDIR2);
ret = system (sys);
if (ret == 127)
- printf ("system 1: ret = %d /bin/sh unavailable???\n", ret);
+ printf ("system 2: ret = %d /bin/sh unavailable???\n", ret);
else
- printf ("system 1: ret = %d %s\n", ret, ret == 0 ? "OK" : "");
+ printf ("system 2: ret = %d %s\n", ret, ret == 0 ? "OK" : "");
stop ();
/* Invalid command (just guessing ;-) ) */
ret = system ("wrtzlpfrmpft");
- printf ("system 2: ret = %d %s\n", ret, WEXITSTATUS (ret) == 127 ? "OK" : "");
+ printf ("system 3: ret = %d %s\n", ret, WEXITSTATUS (ret) == 127 ? "OK" : "");
stop ();
}
diff --git a/gdb/testsuite/gdb.base/fileio.exp b/gdb/testsuite/gdb.base/fileio.exp
index 1da8b16..01eff55 100644
--- a/gdb/testsuite/gdb.base/fileio.exp
+++ b/gdb/testsuite/gdb.base/fileio.exp
@@ -180,14 +180,18 @@ gdb_test continue \
"Continuing\\..*isatty 5:.*OK$stop_msg" \
"Isatty (open file)"
-send_gdb "set remote system-call-allowed 1\n"; gdb_expect -re ".*$gdb_prompt $"
gdb_test continue \
"Continuing\\..*system 1:.*OK$stop_msg" \
+"System says shell is available"
+
+send_gdb "set remote system-call-allowed 1\n"; gdb_expect -re ".*$gdb_prompt $"
+gdb_test continue \
+"Continuing\\..*system 2:.*OK$stop_msg" \
"System(3) call"
# Is this ok? POSIX says system returns a waitpid status?
gdb_test continue \
-"Continuing\\..*system 2:.*OK$stop_msg" \
+"Continuing\\..*system 3:.*OK$stop_msg" \
"System with invalid command returns 127"
gdb_test continue \