diff options
author | Stefan Esser <sesser@php.net> | 2004-12-02 01:04:23 (GMT) |
---|---|---|
committer | Stefan Esser <sesser@php.net> | 2004-12-02 01:04:23 (GMT) |
commit | 1a319ae1ace6f20bd1fbeae4073509b99c1950ff (patch) | |
tree | 80a273c8f122d95ee582ffe5baa06781b9cf3822 /TSRM | |
parent | b08147d46ae1254d56b2be0e2d4424dad12ebf1a (diff) | |
download | php-1a319ae1ace6f20bd1fbeae4073509b99c1950ff.tar.gz |
Fixed: virtual_popen in ZTS mode
Diffstat (limited to 'TSRM')
-rw-r--r-- | TSRM/tsrm_virtual_cwd.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c index 969628c..0a351db 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/TSRM/tsrm_virtual_cwd.c @@ -969,13 +969,24 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) { int command_length; + int dir_length, extra = 0; char *command_line; - char *ptr; + char *ptr, *dir; FILE *retval; command_length = strlen(command); - ptr = command_line = (char *) malloc(command_length + sizeof("cd ; ") + CWDG(cwd).cwd_length+1); + dir_length = CWDG(cwd).cwd_length; + dir = CWDG(cwd).cwd; + while (dir_length > 0) { + if (*dir == '\'') extra+=3; + dir++; + dir_length--; + } + dir_length = CWDG(cwd).cwd_length; + dir = CWDG(cwd).cwd; + + ptr = command_line = (char *) malloc(command_length + sizeof("cd '' ; ") + dir_length +1+1); if (!command_line) { return NULL; } @@ -985,8 +996,21 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) if (CWDG(cwd).cwd_length == 0) { *ptr++ = DEFAULT_SLASH; } else { - memcpy(ptr, CWDG(cwd).cwd, CWDG(cwd).cwd_length); - ptr += CWDG(cwd).cwd_length; + *ptr++ = '\''; + while (dir_length > 0) { + switch (*dir) { + case '\'': + *ptr++ = '\''; + *ptr++ = '\\'; + *ptr++ = '\''; + /* fall-through */ + default: + *ptr++ = *dir; + } + dir++; + dir_length--; + } + *ptr++ = '\''; } *ptr++ = ' '; |