* 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.
This commit is contained in:
Nathan Sidwell 2006-06-13 08:55:22 +00:00
parent e1c2defab5
commit 5600ea19e0
6 changed files with 56 additions and 26 deletions

View 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,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));