jani            Mon Nov  5 14:06:53 2007 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/ext/standard       exec.c exec.h 
  Log:
  MFH: sync
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/exec.c?r1=1.113.2.3.2.1.2.1&r2=1.113.2.3.2.1.2.2&diff_format=u
Index: php-src/ext/standard/exec.c
diff -u php-src/ext/standard/exec.c:1.113.2.3.2.1.2.1 
php-src/ext/standard/exec.c:1.113.2.3.2.1.2.2
--- php-src/ext/standard/exec.c:1.113.2.3.2.1.2.1       Sun Sep 30 05:49:44 2007
+++ php-src/ext/standard/exec.c Mon Nov  5 14:06:53 2007
@@ -16,7 +16,7 @@
    |         Ilia Alshanetsky <[EMAIL PROTECTED]>                             |
    +----------------------------------------------------------------------+
  */
-/* $Id: exec.c,v 1.113.2.3.2.1.2.1 2007/09/30 05:49:44 jani Exp $ */
+/* $Id: exec.c,v 1.113.2.3.2.1.2.2 2007/11/05 14:06:53 jani Exp $ */
 
 #include <stdio.h>
 #include "php.h"
@@ -57,7 +57,7 @@
  * If type==3, output will be printed binary, no lines will be saved or 
returned (passthru)
  *
  */
-int php_exec(int type, char *cmd, zval *array, zval *return_value TSRMLS_DC)
+PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value 
TSRMLS_DC)
 {
        FILE *fp;
        char *buf, *tmp=NULL;
@@ -111,7 +111,7 @@
 
        if (type != 3) {
                b = buf;
-               
+
                while (php_stream_get_line(stream, b, EXEC_INPUT_BUF, &bufl)) {
                        /* no new line found, let's read some more */
                        if (b[bufl - 1] != '\n' && !php_stream_eof(stream)) {
@@ -132,7 +132,7 @@
                                PHPWRITE(buf, bufl);
                                sapi_flush(TSRMLS_C);
                        } else if (type == 2) {
-                               /* strip trailing whitespaces */        
+                               /* strip trailing whitespaces */
                                l = bufl;
                                while (l-- && isspace(((unsigned char 
*)buf)[l]));
                                if (l != (int)(bufl - 1)) {
@@ -144,7 +144,7 @@
                        b = buf;
                }
                if (bufl) {
-                       /* strip trailing whitespaces if we have not done so 
already */ 
+                       /* strip trailing whitespaces if we have not done so 
already */
                        if (type != 2) {
                                l = bufl;
                                while (l-- && isspace(((unsigned char 
*)buf)[l]));
@@ -157,7 +157,7 @@
                        /* Return last line from the shell command */
                        if (PG(magic_quotes_runtime)) {
                                int len;
-       
+
                                tmp = php_addslashes(buf, bufl, &len, 0 
TSRMLS_CC);
                                RETVAL_STRINGL(tmp, len, 0);
                        } else {
@@ -172,7 +172,7 @@
                }
        }
 
-       pclose_return = php_stream_close(stream); 
+       pclose_return = php_stream_close(stream);
        efree(buf);
 
 done:
@@ -191,7 +191,7 @@
 }
 /* }}} */
 
-static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode)
+static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */
 {
        char *cmd;
        int cmd_len;
@@ -226,6 +226,7 @@
                ZVAL_LONG(ret_code, ret);
        }
 }
+/* }}} */
 
 /* {{{ proto string exec(string command [, array &output [, int 
&return_value]])
    Execute an external program */
@@ -233,7 +234,6 @@
 {
        php_exec_ex(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 }
-
 /* }}} */
 
 /* {{{ proto int system(string command [, int &return_value])
@@ -261,14 +261,15 @@
 
    *NOT* safe for binary strings
 */
-char *php_escape_shell_cmd(char *str) {
-       register int x, y, l;
+PHPAPI char *php_escape_shell_cmd(char *str)
+{
+       register int x, y, l = strlen(str);
        char *cmd;
        char *p = NULL;
+       size_t estimate = (2 * l) + 1;
 
-       l = strlen(str);
        cmd = safe_emalloc(2, l, 1);
-       
+
        for (x = 0, y = 0; x < l; x++) {
                switch (str[x]) {
                        case '"':
@@ -319,21 +320,27 @@
                }
        }
        cmd[y] = '\0';
+
+       if ((estimate - y) > 4096) {
+               /* realloc if the estimate was way overill
+                * Arbitrary cutoff point of 4096 */
+               cmd = erealloc(cmd, y + 1);
+       }
+
        return cmd;
 }
 /* }}} */
 
 /* {{{ php_escape_shell_arg
  */
-char *php_escape_shell_arg(char *str) {
-       int x, y, l;
+PHPAPI char *php_escape_shell_arg(char *str)
+{
+       int x, y = 0, l = strlen(str);
        char *cmd;
+       size_t estimate = (4 * l) + 3;
 
-       y = 0;
-       l = strlen(str);
-       
        cmd = safe_emalloc(4, l, 3); /* worst case */
-       
+
 #ifdef PHP_WIN32
        cmd[y++] = '"';
 #else
@@ -364,6 +371,12 @@
        cmd[y++] = '\'';
 #endif
        cmd[y] = '\0';
+
+       if ((estimate - y) > 4096) {
+               /* realloc if the estimate was way overill
+                * Arbitrary cutoff point of 4096 */
+               cmd = erealloc(cmd, y + 1);
+       }
        return cmd;
 }
 /* }}} */
@@ -372,18 +385,19 @@
    Escape shell metacharacters */
 PHP_FUNCTION(escapeshellcmd)
 {
-       zval **arg1;
+       char *command;
+       int command_len;
        char *cmd = NULL;
 
-       if (zend_get_parameters_ex(1, &arg1) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &command, 
&command_len) == FAILURE) {
+               return;
        }
-       
-       convert_to_string_ex(arg1);
-       if (Z_STRLEN_PP(arg1)) {
-               cmd = php_escape_shell_cmd(Z_STRVAL_PP(arg1));
-               RETVAL_STRING(cmd, 1);
-               efree(cmd);
+
+       if (command_len) {
+               cmd = php_escape_shell_cmd(command);
+               RETVAL_STRING(cmd, 0);
+       } else {
+               RETVAL_EMPTY_STRING();
        }
 }
 /* }}} */
@@ -392,18 +406,17 @@
    Quote and escape an argument for use in a shell command */
 PHP_FUNCTION(escapeshellarg)
 {
-       zval **arg1;
+       char *argument;
+       int argument_len;
        char *cmd = NULL;
 
-       if (zend_get_parameters_ex(1, &arg1) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &argument, 
&argument_len) == FAILURE) {
+               return;
        }
-       
-       convert_to_string_ex(arg1);
-       if (Z_STRLEN_PP(arg1)) {
-               cmd = php_escape_shell_arg(Z_STRVAL_PP(arg1));
-               RETVAL_STRING(cmd, 1);
-               efree(cmd);
+
+       if (argument) {
+               cmd = php_escape_shell_arg(argument);
+               RETVAL_STRING(cmd, 0);
        }
 }
 /* }}} */
@@ -414,37 +427,35 @@
 {
        FILE *in;
        size_t total_readbytes;
-       zval **cmd;
+       char *command;
+       int command_len;
        char *ret;
        php_stream *stream;
 
-       if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &cmd)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &command, 
&command_len) == FAILURE) {
+               return;
        }
-       
+
        if (PG(safe_mode)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot execute 
using backquotes in Safe Mode");
                RETURN_FALSE;
        }
 
-       convert_to_string_ex(cmd);
 #ifdef PHP_WIN32
-       if ((in=VCWD_POPEN(Z_STRVAL_PP(cmd), "rt"))==NULL) {
+       if ((in=VCWD_POPEN(command, "rt"))==NULL) {
 #else
-       if ((in=VCWD_POPEN(Z_STRVAL_PP(cmd), "r"))==NULL) {
+       if ((in=VCWD_POPEN(command, "r"))==NULL) {
 #endif
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to execute 
'%s'", Z_STRVAL_PP(cmd));
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to execute 
'%s'", command);
                RETURN_FALSE;
        }
 
        stream = php_stream_fopen_from_pipe(in, "rb");
        total_readbytes = php_stream_copy_to_mem(stream, &ret, 
PHP_STREAM_COPY_ALL, 0);
-       php_stream_close(stream); 
-       
+       php_stream_close(stream);
+
        if (total_readbytes > 0) {
-               RETURN_STRINGL(ret, total_readbytes, 0);
-       } else {
-               RETURN_NULL();  
+               RETVAL_STRINGL(ret, total_readbytes, 0);
        }
 }
 /* }}} */
@@ -466,7 +477,7 @@
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only a super user 
may attempt to increase the priority of a process");
                RETURN_FALSE;
        }
-       
+
        RETURN_TRUE;
 }
 /* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/exec.h?r1=1.24.2.3.2.1&r2=1.24.2.3.2.1.2.1&diff_format=u
Index: php-src/ext/standard/exec.h
diff -u php-src/ext/standard/exec.h:1.24.2.3.2.1 
php-src/ext/standard/exec.h:1.24.2.3.2.1.2.1
--- php-src/ext/standard/exec.h:1.24.2.3.2.1    Mon Jan  1 09:36:08 2007
+++ php-src/ext/standard/exec.h Mon Nov  5 14:06:53 2007
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: exec.h,v 1.24.2.3.2.1 2007/01/01 09:36:08 sebastian Exp $ */
+/* $Id: exec.h,v 1.24.2.3.2.1.2.1 2007/11/05 14:06:53 jani Exp $ */
 
 #ifndef EXEC_H
 #define EXEC_H
@@ -36,6 +36,6 @@
 
 PHPAPI char *php_escape_shell_cmd(char *);
 PHPAPI char *php_escape_shell_arg(char *);
-int php_exec(int type, char *cmd, zval *array, zval *return_value TSRMLS_DC);
+PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value 
TSRMLS_DC);
 
 #endif /* EXEC_H */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to