brian 98/05/19 15:49:05
Modified: . STATUS src CHANGES src/modules/standard mod_include.c mod_log_agent.c mod_log_referer.c mod_mime_magic.c Log: Two things: replaced the use of spawn_child with ap_spawn_child_err_buff in various modules (to be "safe" under Win32) and modified the agent and referer logging modules to use ap_open_piped_logs rather than try and do it on their own. I'm not sure that uncompress_child in mod_mime_magic is correct; could someone look at it? Also, Ralf, mod_rewrite.c needs similar treatment. I was off to do it but it looked more complex than the other changes, and I'm sure once you see the changes made here you can understand which mod_rewrite changes to make. Revision Changes Path 1.402 +9 -10 apache-1.3/STATUS Index: STATUS =================================================================== RCS file: /export/home/cvs/apache-1.3/STATUS,v retrieving revision 1.401 retrieving revision 1.402 diff -u -r1.401 -r1.402 --- STATUS 1998/05/16 16:35:33 1.401 +++ STATUS 1998/05/19 22:48:52 1.402 @@ -17,14 +17,11 @@ for buffer overflow, someone should rewrite or verify they're safe - * SSI: mod_include has had "cmd" disabled pending rewrite to use - new Win32 spawning. + * CGI: chdir() needs to be reinstated for CGI. - * CGI: chdir() needs to be reinstated for CGI. + * Child process: eliminate spawn_child() and spawn_child_err() which + are unsafe in mod_rewrite.c - * Child process: eliminate spawn_child() and spawn_child_err() which - are unsafe. - Documentation that needs writing: * Documentation for: @@ -218,8 +215,7 @@ really bad * chdir() for CGI scripts and mod_include #exec needs to be - re-implemented. This requires either serializing chdir/spawn - or using a native Win32 CreateProcess(?) call. + re-implemented now that CreateProcess is being used. * process/thread model - need dynamic thread creation/destruction, similar to @@ -247,8 +243,6 @@ * we don't mmap on NT. Use TransmitFile? * CGIs - - hangs on multiple CGI execution? PR#1607,1129 - Marc can't repeat... - docs on how they work w/scripts - use registry to find interpreter? - WTF is the buffering coming from? @@ -369,4 +363,9 @@ 5) would be nice if the proxy used Via and Max-Forwards, even as HTTP/1.0 * #ifdef __EMX__ --> #ifdef OS2. + + * use of spawnvp in uncompress_child in mod_mime_magic - doesn't + use the new child_info structure, is this still safe? Needs to be + looked at. + 1.853 +9 -2 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.852 retrieving revision 1.853 diff -u -r1.852 -r1.853 --- CHANGES 1998/05/18 21:56:06 1.852 +++ CHANGES 1998/05/19 22:48:57 1.853 @@ -1,5 +1,12 @@ Changes with Apache 1.3b7 + *) Mod_log_agent, mod_log_referer now use ap_open_piped_log for piped logs. + [Brian Behlendorf] + + *) Replace use of spawn_child with ap_spawn_child_err_buff, to make everything + "safe" under Win32. In: mod_include.c, mod_mime_magic.c + [Brian Behlendorf] + *) Improve RFC1413 support. [Bob Beck <[EMAIL PROTECTED]>] *) Fix support script `dbmmanage': It was unable to handle some sort @@ -11,8 +18,8 @@ *) WIN32: CGIs could cause a hang (because of a deadlock in the standard C library), so CGI handling has been changed to use Win32 native handles - instead of C file descriptors. - [Ben Laurie and Bill Stoddard <[EMAIL PROTECTED]>] PR#1129, 1607 + instead of C file descriptors. + [Ben Laurie and Bill Stoddard <[EMAIL PROTECTED]>] PR#1129, 1607 *) The proxy cache would store an incorrect content-length in the cached file copy after a cache update. That resulted in repeated fetching 1.89 +6 -13 apache-1.3/src/modules/standard/mod_include.c Index: mod_include.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_include.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -r1.88 -r1.89 --- mod_include.c 1998/05/19 19:19:01 1.88 +++ mod_include.c 1998/05/19 22:49:03 1.89 @@ -786,7 +786,7 @@ #endif ap_cleanup_for_exec(); /* set shellcmd flag to pass arg to SHELL_PATH */ - child_pid = ap_call_exec(r, NULL, s, ap_create_environment(r->pool, env), + child_pid = ap_call_exec(r, pinfo, s, ap_create_environment(r->pool, env), 1); #ifdef WIN32 return (child_pid); @@ -811,20 +811,18 @@ static int include_cmd(char *s, request_rec *r) { include_cmd_arg arg; - FILE *f; + BUFF *script_in; arg.r = r; arg.s = s; - if (!spawn_child(r->pool, include_cmd_child, &arg, - kill_after_timeout, NULL, &f)) { + if (!ap_spawn_child_err_buff(r->pool, include_cmd_child, &arg, + kill_after_timeout, NULL, &script_in, NULL)) { return -1; } - ap_send_fd(f, r); - ap_pfclose(r->pool, f); /* will wait for zombie when - * r->pool is cleared - */ + ap_send_fb(script_in, r); + ap_bclose(script_in); return 0; } #endif @@ -841,10 +839,6 @@ return 1; } if (!strcmp(tag, "cmd")) { -#ifdef WIN32 - ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, - "cmd in SSI temporarily disabled"); -#else parse_string(r, tag_val, parsed_string, sizeof(parsed_string), 1); if (include_cmd(parsed_string, r) == -1) { ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, @@ -856,7 +850,6 @@ /* just in case some stooge changed directories */ #ifndef WIN32 ap_chdir_file(r->filename); -#endif #endif } else if (!strcmp(tag, "cgi")) { 1.25 +5 -31 apache-1.3/src/modules/standard/mod_log_agent.c Index: mod_log_agent.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_log_agent.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- mod_log_agent.c 1998/05/19 19:19:02 1.24 +++ mod_log_agent.c 1998/05/19 22:49:03 1.25 @@ -58,6 +58,7 @@ #include "httpd.h" #include "http_config.h" +#include "http_log.h" module agent_log_module; @@ -101,30 +102,6 @@ {NULL} }; -static int agent_log_child(void *cmd, child_info *pinfo) -{ - /* Child process code for 'AgentLog "|..."'; - * may want a common framework for this, since I expect it will - * be common for other foo-loggers to want this sort of thing... - */ - int child_pid = 1; - - ap_cleanup_for_exec(); - signal(SIGHUP, SIG_IGN); -#if defined(WIN32) - child_pid = spawnl(SHELL_PATH, SHELL_PATH, "/c", (char *) cmd, NULL); - return (child_pid); -#elif defined(__EMX__) - /* For OS/2 we need to use a '/' */ - execl(SHELL_PATH, SHELL_PATH, "/c", (char *) cmd, NULL); -#else - execl(SHELL_PATH, SHELL_PATH, "-c", (char *) cmd, NULL); -#endif - perror("exec"); - fprintf(stderr, "Exec of shell for logging failed!!!\n"); - return (child_pid); -} - static void open_agent_log(server_rec *s, pool *p) { agent_log_state *cls = ap_get_module_config(s->module_config, @@ -136,16 +113,13 @@ return; /* virtual log shared w/main server */ if (*cls->fname == '|') { - FILE *dummy; + piped_log *pl; - if (!spawn_child(p, agent_log_child, (void *) (cls->fname + 1), - kill_after_timeout, &dummy, NULL)) { - perror("spawn_child"); - fprintf(stderr, "Couldn't fork child for AgentLog process\n"); + pl = ap_open_piped_log(p, cls->fname + 1); + if (pl == NULL) { exit(1); } - - cls->agent_fd = fileno(dummy); + cls->agent_fd = ap_piped_log_write_fd(pl); } else if (*cls->fname != '\0') { if ((cls->agent_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) { 1.26 +5 -31 apache-1.3/src/modules/standard/mod_log_referer.c Index: mod_log_referer.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_log_referer.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- mod_log_referer.c 1998/05/19 19:19:02 1.25 +++ mod_log_referer.c 1998/05/19 22:49:03 1.26 @@ -58,6 +58,7 @@ #include "httpd.h" #include "http_config.h" +#include "http_log.h" module referer_log_module; @@ -116,31 +117,6 @@ {NULL} }; -static int referer_log_child(void *cmd, child_info *pinfo) -{ - /* Child process code for 'RefererLog "|..."'; - * may want a common framework for this, since I expect it will - * be common for other foo-loggers to want this sort of thing... - */ - int child_pid = 1; - - ap_cleanup_for_exec(); - signal(SIGHUP, SIG_IGN); -#if defined(WIN32) - /* For OS/2 we need to use a '/' */ - child_pid = spawnl(SHELL_PATH, SHELL_PATH, "/c", (char *) cmd, NULL); - return (child_pid); -#elif defined(__EMX__) - /* For OS/2 we need to use a '/' */ - execl(SHELL_PATH, SHELL_PATH, "/c", (char *) cmd, NULL); -#else - execl(SHELL_PATH, SHELL_PATH, "-c", (char *) cmd, NULL); -#endif - perror("execl"); - fprintf(stderr, "Exec of shell for logging failed!!!\n"); - return (child_pid); -} - static void open_referer_log(server_rec *s, pool *p) { referer_log_state *cls = ap_get_module_config(s->module_config, @@ -152,16 +128,14 @@ return; /* virtual log shared w/main server */ if (*cls->fname == '|') { - FILE *dummy; + piped_log *pl; - if (!spawn_child(p, referer_log_child, (void *) (cls->fname + 1), - kill_after_timeout, &dummy, NULL)) { - perror("spawn_child"); - fprintf(stderr, "Couldn't fork child for RefererLog process\n"); + pl = ap_open_piped_log(p, cls->fname + 1); + if (pl == NULL) { exit(1); } - cls->referer_fd = fileno(dummy); + cls->referer_fd = ap_piped_log_write_fd(pl); } else if (*cls->fname != '\0') { if ((cls->referer_fd = ap_popenf(p, fname, xfer_flags, xfer_mode)) < 0) { 1.32 +6 -7 apache-1.3/src/modules/standard/mod_mime_magic.c Index: mod_mime_magic.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_mime_magic.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- mod_mime_magic.c 1998/05/19 19:19:02 1.31 +++ mod_mime_magic.c 1998/05/19 22:49:03 1.32 @@ -2171,8 +2171,7 @@ unsigned char **newch, int n) { struct uncompress_parms parm; - FILE *fin; - FILE *fout; + BUFF *bin, *bout; pool *sub_pool; parm.r = r; @@ -2184,22 +2183,22 @@ */ sub_pool = ap_make_sub_pool(r->pool); - if (!spawn_child(sub_pool, uncompress_child, &parm, kill_always, - &fin, &fout)) { + if (!ap_spawn_child_err_buff(sub_pool, uncompress_child, &parm, kill_always, + &bin, &bout, NULL)) { ap_log_error(APLOG_MARK, APLOG_ERR, r->server, MODNAME ": couldn't spawn uncompress process: %s", r->uri); return -1; } - if (write(fileno(fin), old, n) != n) { + if (ap_bwrite(bin, old, n) != n) { ap_destroy_pool(sub_pool); ap_log_error(APLOG_MARK, APLOG_ERR, r->server, MODNAME ": write failed."); return -1; } - ap_pfclose(sub_pool, fin); + ap_bclose(bin); *newch = (unsigned char *) ap_palloc(r->pool, n); - if ((n = read(fileno(fout), *newch, n)) <= 0) { + if ((n = ap_bread(bout, *newch, n)) <= 0) { ap_destroy_pool(sub_pool); ap_log_error(APLOG_MARK, APLOG_ERR, r->server, MODNAME ": read failed %s", r->filename);