From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11347 invoked by alias); 9 Jun 2006 20:21:12 -0000 Received: (qmail 11291 invoked by uid 22791); 9 Jun 2006 20:21:10 -0000 X-Spam-Check-By: sourceware.org Received: from potter.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 09 Jun 2006 20:21:07 +0000 Received: (qmail 17321 invoked from network); 9 Jun 2006 20:21:03 -0000 Received: from unknown (HELO ?192.168.189.148?) (nathan@127.0.0.2) by mail.codesourcery.com with ESMTPA; 9 Jun 2006 20:21:03 -0000 Message-ID: <4489D824.40605@codesourcery.com> Date: Fri, 09 Jun 2006 20:21:00 -0000 From: Nathan Sidwell User-Agent: Thunderbird 1.5.0.2 (X11/20060522) MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Add system(NULL) to fileio Content-Type: multipart/mixed; boundary="------------040009040101020104040509" Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-06/txt/msg00112.txt.bz2 This is a multi-part message in MIME format. --------------040009040101020104040509 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 630 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 --------------040009040101020104040509 Content-Type: text/x-patch; name="sys-null.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="sys-null.patch" Content-length: 5701 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" --------------040009040101020104040509--