pollita Sun Sep 24 17:03:58 2006 UTC
Modified files:
/php-src/ext/standard exec.c
Log:
PHP6 Updates
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/exec.c?r1=1.120&r2=1.121&diff_format=u
Index: php-src/ext/standard/exec.c
diff -u php-src/ext/standard/exec.c:1.120 php-src/ext/standard/exec.c:1.121
--- php-src/ext/standard/exec.c:1.120 Sun Jun 11 20:33:29 2006
+++ php-src/ext/standard/exec.c Sun Sep 24 17:03:58 2006
@@ -16,7 +16,7 @@
| Ilia Alshanetsky <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
-/* $Id: exec.c,v 1.120 2006/06/11 20:33:29 bjori Exp $ */
+/* $Id: exec.c,v 1.121 2006/09/24 17:03:58 pollita Exp $ */
#include <stdio.h>
#include "php.h"
@@ -55,6 +55,7 @@
* If type==2, all lines will be saved to given array (exec with &$array)
* If type==3, output will be printed binary, no lines will be saved or
returned (passthru)
*
+ * Unicode command strings are encoding using filesystem_encoding, returned
data is not decoded back to unicode
*/
int php_exec(int type, char *cmd, zval *array, zval *return_value TSRMLS_DC)
{
@@ -168,15 +169,16 @@
{
char *cmd;
int cmd_len;
+ zend_uchar cmd_type;
zval *ret_code=NULL, *ret_array=NULL;
int ret;
if (mode) {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z/",
&cmd, &cmd_len, &ret_code) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|z/",
&cmd, &cmd_len, &cmd_type, &ret_code) == FAILURE) {
RETURN_FALSE;
}
} else {
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z/z/",
&cmd, &cmd_len, &ret_array, &ret_code) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|z/z/",
&cmd, &cmd_len, &cmd_type, &ret_array, &ret_code) == FAILURE) {
RETURN_FALSE;
}
}
@@ -185,6 +187,12 @@
RETURN_FALSE;
}
+ if (cmd_type == IS_UNICODE) {
+ if (FAILURE == php_stream_path_encode(NULL, &cmd, &cmd_len,
(UChar*)cmd, cmd_len, REPORT_ERRORS, FG(default_context))) {
+ RETURN_FALSE;
+ }
+ }
+
if (!ret_array) {
ret = php_exec(mode, cmd, NULL, return_value TSRMLS_CC);
} else {
@@ -198,9 +206,13 @@
zval_dtor(ret_code);
ZVAL_LONG(ret_code, ret);
}
+
+ if (cmd_type == IS_UNICODE) {
+ efree(cmd);
+ }
}
-/* {{{ proto string exec(string command [, array &output [, int
&return_value]])
+/* {{{ proto string exec(string command [, array &output [, int
&return_value]]) U
Execute an external program */
PHP_FUNCTION(exec)
{
@@ -209,7 +221,7 @@
/* }}} */
-/* {{{ proto int system(string command [, int &return_value])
+/* {{{ proto int system(string command [, int &return_value]) U
Execute an external program and display output */
PHP_FUNCTION(system)
{
@@ -217,7 +229,7 @@
}
/* }}} */
-/* {{{ proto void passthru(string command [, int &return_value])
+/* {{{ proto void passthru(string command [, int &return_value]) U
Execute an external program and display raw output */
PHP_FUNCTION(passthru)
{
@@ -235,11 +247,11 @@
*NOT* safe for binary strings
*/
char *php_escape_shell_cmd(char *str) {
- register int x, y, l;
+ 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++) {
@@ -292,6 +304,13 @@
}
}
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;
}
/* }}} */
@@ -299,12 +318,10 @@
/* {{{ php_escape_shell_arg
*/
char *php_escape_shell_arg(char *str) {
- int x, y, l;
+ 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
@@ -337,71 +354,106 @@
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;
}
/* }}} */
-/* {{{ proto string escapeshellcmd(string command)
+/* {{{ proto string escapeshellcmd(string command) U
Escape shell metacharacters */
PHP_FUNCTION(escapeshellcmd)
{
- zval **arg1;
+ char *command;
+ int command_len;
+ zend_uchar command_type;
char *cmd = NULL;
- if (zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &command,
&command_len, &command_type) == 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_type == IS_UNICODE) {
+ if (FAILURE == php_stream_path_encode(NULL, &command,
&command_len, (UChar*)command, command_len, REPORT_ERRORS,
FG(default_context))) {
+ RETURN_FALSE;
+ }
+ }
+
+ if (command_len) {
+ cmd = php_escape_shell_cmd(command);
+ RETVAL_STRING(cmd, 0);
+ } else {
+ RETVAL_EMPTY_STRING();
+ }
+
+ if (command_type == IS_UNICODE) {
+ efree(command);
}
}
/* }}} */
-/* {{{ proto string escapeshellarg(string arg)
+/* {{{ proto string escapeshellarg(string arg) U
Quote and escape an argument for use in a shell command */
PHP_FUNCTION(escapeshellarg)
{
- zval **arg1;
+ char *argument;
+ int argument_len;
+ zend_uchar argument_type;
char *cmd = NULL;
- if (zend_get_parameters_ex(1, &arg1) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &argument,
&argument_len, &argument_type) == FAILURE) {
+ return;
+ }
+
+ if (argument_type == IS_UNICODE) {
+ if (FAILURE == php_stream_path_encode(NULL, &argument,
&argument_len, (UChar*)argument, argument_len, REPORT_ERRORS,
FG(default_context))) {
+ RETURN_FALSE;
+ }
}
- 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);
+ }
+
+ if (argument_type == IS_UNICODE) {
+ efree(argument);
}
}
/* }}} */
-/* {{{ proto string shell_exec(string cmd)
+/* {{{ proto string shell_exec(string cmd) U
Execute command via shell and return complete output as string */
PHP_FUNCTION(shell_exec)
{
FILE *in;
size_t total_readbytes;
- zval **cmd;
+ char *command;
+ int command_len;
+ zend_uchar command_type;
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, "t", &command,
&command_len, &command_type) == FAILURE) {
+ return;
}
-
- convert_to_string_ex(cmd);
+
+ if (command_type == IS_UNICODE) {
+ if (FAILURE == php_stream_path_encode(NULL, &command,
&command_len, (UChar*)command, command_len, REPORT_ERRORS,
FG(default_context))) {
+ RETURN_FALSE;
+ }
+ }
+
#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;
}
@@ -410,15 +462,17 @@
php_stream_close(stream);
if (total_readbytes > 0) {
- RETURN_STRINGL(ret, total_readbytes, 0);
- } else {
- RETURN_NULL();
+ RETVAL_STRINGL(ret, total_readbytes, 0);
+ }
+
+ if (command_type == IS_UNICODE) {
+ efree(command);
}
}
/* }}} */
#ifdef HAVE_NICE
-/* {{{ proto bool proc_nice(int priority)
+/* {{{ proto bool proc_nice(int priority) U
Change the priority of the current process */
PHP_FUNCTION(proc_nice)
{
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php