diff options
-rw-r--r-- | ext/standard/proc_open.c | 17 | ||||
-rw-r--r-- | ext/standard/proc_open.h | 4 |
2 files changed, 13 insertions, 8 deletions
diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index d774808a7b..bbcdd1073a 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -240,6 +240,7 @@ static void proc_open_rsrc_dtor(zend_resource *rsrc) FG(pclose_ret) = -1; #endif _php_free_envp(proc->env, proc->is_persistent); + pefree(proc->pipes, proc->is_persistent); pefree(proc->command, proc->is_persistent); pefree(proc, proc->is_persistent); @@ -434,7 +435,8 @@ PHP_FUNCTION(proc_open) zval *descitem = NULL; zend_string *str_index; zend_ulong nindex; - struct php_proc_open_descriptor_item descriptors[PHP_PROC_OPEN_MAX_DESCRIPTORS]; + struct php_proc_open_descriptor_item *descriptors = NULL; + int ndescriptors_array; #ifdef PHP_WIN32 PROCESS_INFORMATION pi; HANDLE childHandle; @@ -499,7 +501,11 @@ PHP_FUNCTION(proc_open) memset(&env, 0, sizeof(env)); } - memset(descriptors, 0, sizeof(descriptors)); + ndescriptors_array = zend_hash_num_elements(Z_ARRVAL_P(descriptorspec)); + + descriptors = safe_emalloc(sizeof(struct php_proc_open_descriptor_item), ndescriptors_array, 0); + + memset(descriptors, 0, sizeof(struct php_proc_open_descriptor_item) * ndescriptors_array); #ifdef PHP_WIN32 /* we use this to allow the child to inherit handles */ @@ -669,9 +675,7 @@ PHP_FUNCTION(proc_open) goto exit_fail; } } - - if (++ndesc == PHP_PROC_OPEN_MAX_DESCRIPTORS) - break; + ndesc++; } ZEND_HASH_FOREACH_END(); #ifdef PHP_WIN32 @@ -875,6 +879,7 @@ PHP_FUNCTION(proc_open) proc = (struct php_process_handle*)pemalloc(sizeof(struct php_process_handle), is_persistent); proc->is_persistent = is_persistent; proc->command = command; + proc->pipes = pemalloc(sizeof(zend_resource *) * ndesc, is_persistent); proc->npipes = ndesc; proc->child = child; #ifdef PHP_WIN32 @@ -952,10 +957,12 @@ PHP_FUNCTION(proc_open) } } + efree(descriptors); ZVAL_RES(return_value, zend_register_resource(proc, le_proc_open)); return; exit_fail: + efree(descriptors); _php_free_envp(env, is_persistent); pefree(command, is_persistent); #if PHP_CAN_DO_PTS diff --git a/ext/standard/proc_open.h b/ext/standard/proc_open.h index 13177ce2b0..52e5c1ed87 100644 --- a/ext/standard/proc_open.h +++ b/ext/standard/proc_open.h @@ -25,8 +25,6 @@ typedef int php_file_descriptor_t; typedef pid_t php_process_id_t; #endif -#define PHP_PROC_OPEN_MAX_DESCRIPTORS 16 - /* Environment block under win32 is a NUL terminated sequence of NUL terminated * name=value strings. * Under unix, it is an argv style array. @@ -44,7 +42,7 @@ struct php_process_handle { HANDLE childHandle; #endif int npipes; - zend_resource *pipes[PHP_PROC_OPEN_MAX_DESCRIPTORS]; + zend_resource **pipes; char *command; int is_persistent; php_process_env_t env; |