2006-06-09 Nathan Sidwell 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. Index: gdb/remote-fileio.c =================================================================== RCS file: /cvs/src/src/gdb/remote-fileio.c,v retrieving revision 1.17.2.1 diff -c -3 -p -r1.17.2.1 remote-fileio.c *** gdb/remote-fileio.c 24 May 2006 08:00:02 -0000 1.17.2.1 --- gdb/remote-fileio.c 9 Jun 2006 15:09:47 -0000 *************** remote_fileio_func_system (char *buf) *** 1278,1293 **** { 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; ! } /* Parameter: Ptr to commandline / length incl. trailing zero */ if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) --- 1278,1284 ---- { CORE_ADDR ptrval; int ret, length, retlength; ! char *cmdline = NULL; /* Parameter: Ptr to commandline / length incl. trailing zero */ if (remote_fileio_extract_ptr_w_len (&buf, &ptrval, &length)) *************** remote_fileio_func_system (char *buf) *** 1295,1313 **** remote_fileio_ioerror (); return; } ! /* Request commandline using 'm' packet */ ! cmdline = alloca (length); ! retlength = remote_read_bytes (ptrval, (gdb_byte *) cmdline, length); ! if (retlength != length) { ! remote_fileio_ioerror (); return; } remote_fio_no_longjmp = 1; ret = system (cmdline); ! if (ret == -1) remote_fileio_return_errno (-1); else remote_fileio_return_success (WEXITSTATUS (ret)); --- 1286,1322 ---- remote_fileio_ioerror (); return; } ! ! if (length) ! { ! /* 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 (!length) ! remote_fileio_return_success (ret); ! else if (ret == -1) remote_fileio_return_errno (-1); else remote_fileio_return_success (WEXITSTATUS (ret)); Index: gdb/doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.314.2.2 diff -c -3 -p -r1.314.2.2 gdb.texinfo *** gdb/doc/gdb.texinfo 19 Apr 2006 18:19:20 -0000 1.314.2.2 --- gdb/doc/gdb.texinfo 9 Jun 2006 15:09:57 -0000 *************** int system(const char *command); *** 24564,24574 **** 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. @exdent Errors: @end smallexample --- 24564,24576 ---- Fsystem,commandptr/len @exdent Return value: ! 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: gdb/testsuite/gdb.base/fileio.c =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.base/fileio.c,v retrieving revision 1.8.12.1 diff -c -3 -p -r1.8.12.1 fileio.c *** gdb/testsuite/gdb.base/fileio.c 5 Jun 2006 15:36:02 -0000 1.8.12.1 --- gdb/testsuite/gdb.base/fileio.c 9 Jun 2006 15:12:57 -0000 *************** test_system () *** 385,390 **** --- 385,394 ---- 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: gdb/testsuite/gdb.base/fileio.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.base/fileio.exp,v retrieving revision 1.7.30.1 diff -c -3 -p -r1.7.30.1 fileio.exp *** gdb/testsuite/gdb.base/fileio.exp 5 Jun 2006 15:39:14 -0000 1.7.30.1 --- gdb/testsuite/gdb.base/fileio.exp 9 Jun 2006 15:12:57 -0000 *************** gdb_test continue \ *** 191,196 **** --- 191,200 ---- "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"