From: Dmitry Stogov Date: Tue, 19 Sep 2006 20:33:12 +0000 (+0000) Subject: MFH: Fixed mess with CGI/CLI -d command line option (now it works with cgi; constants... X-Git-Tag: php-5.2.0RC5~126 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7d14dad02ea58db34594e91f759424c51071c5a8;p=php MFH: Fixed mess with CGI/CLI -d command line option (now it works with cgi; constants are working exactly like in php.ini; with FastCGI -d affects all requests). --- diff --git a/NEWS b/NEWS index 6f2be7ae6b..d401e9ec4c 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? Sep 2006, PHP 5.2.0 +- Fixed mess with CGI/CLI -d option (now it works with cgi; constants are + working exactly like in php.ini; with FastCGI -d affects all requests). + (Dmitry) - Fixed bug #38844 (curl_easy_strerror() is defined only since cURL 7.12.0). (Tony) - Fixed bug #38574 (missing curl constants and improper constant detection). diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index ca424f5ac4..d0f1321b94 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -193,6 +193,7 @@ END_EXTERN_C() typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, int callback_type, void *arg); BEGIN_EXTERN_C() ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg); +ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg); END_EXTERN_C() #define ZEND_INI_PARSER_ENTRY 1 diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index 244673dba6..9346acfda7 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -157,10 +157,14 @@ static void ini_error(char *str) TSRMLS_FETCH(); currently_parsed_filename = zend_ini_scanner_get_filename(TSRMLS_C); - error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */ - error_buf = (char *) emalloc(error_buf_len); + if (currently_parsed_filename) { + error_buf_len = 128+strlen(currently_parsed_filename); /* should be more than enough */ + error_buf = (char *) emalloc(error_buf_len); - sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C)); + sprintf(error_buf, "Error parsing %s on line %d\n", currently_parsed_filename, zend_ini_scanner_get_lineno(TSRMLS_C)); + } else { + error_buf = estrdup("Invalid configuration directive\n"); + } if (CG(ini_parser_unbuffered_errors)) { #ifdef PHP_WIN32 @@ -202,6 +206,29 @@ ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_erro } +ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, zend_ini_parser_cb_t ini_parser_cb, void *arg) +{ + zend_ini_parser_param ini_parser_param; + TSRMLS_FETCH(); + + ini_parser_param.ini_parser_cb = ini_parser_cb; + ini_parser_param.arg = arg; + + CG(ini_parser_param) = &ini_parser_param; + if (zend_ini_prepare_string_for_scanning(str TSRMLS_CC)==FAILURE) { + return FAILURE; + } + + CG(ini_parser_unbuffered_errors) = unbuffered_errors; + + if (ini_parse(TSRMLS_C)) { + return SUCCESS; + } else { + return FAILURE; + } +} + + %} %pure_parser diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h index e5cc41d583..95499f0722 100644 --- a/Zend/zend_ini_scanner.h +++ b/Zend/zend_ini_scanner.h @@ -26,6 +26,7 @@ BEGIN_EXTERN_C() int zend_ini_scanner_get_lineno(TSRMLS_D); char *zend_ini_scanner_get_filename(TSRMLS_D); int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC); +int zend_ini_prepare_string_for_scanning(char *str TSRMLS_DC); void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC); int ini_lex(zval *ini_lval TSRMLS_DC); END_EXTERN_C() diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l index 2495c60360..e2740261d6 100644 --- a/Zend/zend_ini_scanner.l +++ b/Zend/zend_ini_scanner.l @@ -83,6 +83,17 @@ int zend_ini_open_file_for_scanning(zend_file_handle *fh TSRMLS_DC) } +int zend_ini_prepare_string_for_scanning(char *str TSRMLS_DC) +{ + int len = strlen(str); + + yyin = NULL; + yy_scan_buffer(str, len + 2 TSRMLS_CC); + ini_filename = NULL; + return SUCCESS; +} + + void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC) { zend_stream_close(fh); diff --git a/main/SAPI.c b/main/SAPI.c index 5bd12b13e9..c23357c65d 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -76,6 +76,7 @@ SAPI_API sapi_module_struct sapi_module; SAPI_API void sapi_startup(sapi_module_struct *sf) { + sf->ini_entries = NULL; sapi_module = *sf; #ifdef ZTS diff --git a/main/SAPI.h b/main/SAPI.h index 281a8e3f5d..7a4da0528e 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -257,6 +257,8 @@ struct _sapi_module_struct { void (*ini_defaults)(HashTable *configuration_hash); int phpinfo_as_text; + + char *ini_entries; }; diff --git a/main/php_ini.c b/main/php_ini.c index 92f2a4dda0..d88c87dbab 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -529,6 +529,11 @@ int php_init_config(TSRMLS_D) zend_llist_destroy(&scanned_ini_list); } } + + if (sapi_module.ini_entries) { + zend_parse_ini_string(sapi_module.ini_entries, 1, php_config_ini_parser_cb, &extension_lists); + } + return SUCCESS; } /* }}} */ diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index dfe04c82d7..bd7887b788 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -919,21 +919,6 @@ static void init_request_info(TSRMLS_D) } /* }}} */ -static void define_command_line_ini_entry(char *arg) -{ - char *name, *value; - - name = arg; - value = strchr(arg, '='); - if (value) { - *value = 0; - value++; - } else { - value = "1"; - } - zend_alter_ini_entry(name, strlen(name) + 1, value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); -} - #if PHP_FASTCGI /** * Clean up child processes upon exit @@ -987,6 +972,7 @@ int main(int argc, char *argv[]) int orig_optind = php_optind; char *orig_optarg = php_optarg; char *script_file = NULL; + int ini_entries_len = 0; #if FORCE_CGI_REDIRECT long force_redirect = 1; char *redirect_status_env = NULL; @@ -1076,6 +1062,23 @@ int main(int argc, char *argv[]) case 'n': cgi_sapi_module.php_ini_ignore = 1; break; + case 'd': { + /* define ini entries on command line */ + int len = strlen(php_optarg); + + if (strchr(php_optarg, '=')) { + cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("\n\0")); + memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len); + memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); + ini_entries_len += len + sizeof("\n\0") - 2; + } else { + cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("=1\n\0")); + memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len); + memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); + ini_entries_len += len + sizeof("=1\n\0") - 2; + } + break; + } #if PHP_FASTCGI #ifndef PHP_WIN32 /* if we're started on command line, check to see if @@ -1378,9 +1381,6 @@ consult the installation file that came with this distribution, or visit \n\ case 'C': /* don't chdir to the script directory */ SG(options) |= SAPI_OPTION_NO_CHDIR; break; - case 'd': /* define ini entries on command line */ - define_command_line_ini_entry(php_optarg); - break; case 'e': /* enable extended info output */ CG(extended_info) = 1; @@ -1702,6 +1702,9 @@ fastcgi_request_done: if (cgi_sapi_module.php_ini_path_override) { free(cgi_sapi_module.php_ini_path_override); } + if (cgi_sapi_module.ini_entries) { + free(cgi_sapi_module.ini_entries); + } } zend_catch { exit_status = 255; } zend_end_try(); diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 27d278cb5a..bec69c8b4c 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -106,6 +106,15 @@ #define PHP_MODE_REFLECTION_CLASS 9 #define PHP_MODE_REFLECTION_EXTENSION 10 +#define HARDCODED_INI \ + "html_errors=0\n" \ + "register_argc_argv=1\n" \ + "implicit_flush=1\n" \ + "output_buffering=0\n" \ + "max_execution_time=0\n" \ + "max_input_time=-1\n" + + static char *php_optarg = NULL; static int php_optind = 1; #if (HAVE_LIBREADLINE || HAVE_LIBEDIT) && !defined(COMPILE_DL_READLINE) @@ -342,10 +351,6 @@ static int php_cli_startup(sapi_module_struct *sapi_module) zend_hash_update(configuration_hash, name, sizeof(name), tmp, sizeof(zval), (void**)&entry);\ Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry)) -/* hard coded ini settings must be set in main() */ -#define INI_HARDCODED(name,value)\ - zend_alter_ini_entry(name, sizeof(name), value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); - static void sapi_cli_ini_defaults(HashTable *configuration_hash) { zval *tmp, *entry; @@ -451,29 +456,6 @@ static void php_cli_usage(char *argv0) } /* }}} */ -static void define_command_line_ini_entry(char *arg TSRMLS_DC) -{ - char *name, *value; - - name = arg; - value = strchr(arg, '='); - if (value) { - *value = 0; - value++; - } else { - value = "1"; - } - - if (!strcasecmp(name, "extension")) { /* load function module */ - zval extension, zval; - ZVAL_STRING(&extension, value, 0); - php_dl(&extension, MODULE_PERSISTENT, &zval, 1 TSRMLS_CC); - } else { - zend_alter_ini_entry(name, strlen(name)+1, value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); - } -} - - static php_stream *s_in_process = NULL; static void cli_register_file_handles(TSRMLS_D) @@ -602,6 +584,7 @@ int main(int argc, char *argv[]) int argc = __argc; char **argv = __argv; #endif + int ini_entries_len = 0; #if defined(PHP_WIN32) && defined(_DEBUG) && defined(PHP_WIN32_DEBUG_HEAP) { @@ -646,6 +629,10 @@ int main(int argc, char *argv[]) setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif + ini_entries_len = strlen(HARDCODED_INI); + cli_sapi_module.ini_entries = malloc(ini_entries_len+2); + memcpy(cli_sapi_module.ini_entries, HARDCODED_INI, ini_entries_len+1); + cli_sapi_module.ini_entries[ini_entries_len+1] = 0; while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0))!=-1) { switch (c) { @@ -655,6 +642,23 @@ int main(int argc, char *argv[]) case 'n': cli_sapi_module.php_ini_ignore = 1; break; + case 'd': { + /* define ini entries on command line */ + int len = strlen(php_optarg); + + if (strchr(php_optarg, '=')) { + cli_sapi_module.ini_entries = realloc(cli_sapi_module.ini_entries, ini_entries_len + len + sizeof("\n\0")); + memcpy(cli_sapi_module.ini_entries + ini_entries_len, php_optarg, len); + memcpy(cli_sapi_module.ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); + ini_entries_len += len + sizeof("\n\0") - 2; + } else { + cli_sapi_module.ini_entries = realloc(cli_sapi_module.ini_entries, ini_entries_len + len + sizeof("=1\n\0")); + memcpy(cli_sapi_module.ini_entries + ini_entries_len, php_optarg, len); + memcpy(cli_sapi_module.ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); + ini_entries_len += len + sizeof("=1\n\0") - 2; + } + break; + } } } php_optind = orig_optind; @@ -683,7 +687,6 @@ int main(int argc, char *argv[]) module_started = 1; zend_first_try { - zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */ CG(in_compilation) = 0; /* not initialized but needed for several options */ EG(uninitialized_zval_ptr) = NULL; @@ -693,21 +696,9 @@ int main(int argc, char *argv[]) goto out_err; } - /* here is the place for hard coded defaults which cannot be overwritten in the ini file */ - INI_HARDCODED("register_argc_argv", "1"); - INI_HARDCODED("html_errors", "0"); - INI_HARDCODED("implicit_flush", "1"); - INI_HARDCODED("output_buffering", "0"); - INI_HARDCODED("max_execution_time", "0"); - INI_HARDCODED("max_input_time", "-1"); - while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0)) != -1) { switch (c) { - case 'd': /* define ini entries on command line */ - define_command_line_ini_entry(php_optarg TSRMLS_CC); - break; - case 'h': /* help & quit */ case '?': if (php_request_startup(TSRMLS_C)==FAILURE) { @@ -1260,6 +1251,10 @@ out_err: if (cli_sapi_module.php_ini_path_override) { free(cli_sapi_module.php_ini_path_override); } + if (cli_sapi_module.ini_entries) { + free(cli_sapi_module.ini_entries); + } + if (module_started) { php_module_shutdown(TSRMLS_C); }