This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Add system(NULL) to fileio


We noticed that system(NULL) has a special meaning.  This patch augments the
fileio protocol to support it.

Fortunately the current protocol's LENGTH field is strlen + 1, so it can never
legitimately be zero.  So I use that to indicate a NULL string is being passed
-- we don't have to presume a NULL pointer is all bits zero  :)

Tested with a modified libgloss for an m68k target. ok?

btw, this patch requires my testsuite patch for break on } to be applied.

nathan
-- 
Nathan Sidwell    ::   http://www.codesourcery.com   ::         CodeSourcery
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk

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.

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"
  

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]