--- parser3/src/main/pa_exec.C 2002/08/01 11:26:50 1.38 +++ parser3/src/main/pa_exec.C 2003/01/21 15:51:14 1.48 @@ -1,13 +1,13 @@ /** @file Parser: program executing for different OS-es. - Copyright(c) 2000,2001, 2002 ArtLebedev Group(http://www.artlebedev.com) + Copyright(c) 2000,2001, 2003 ArtLebedev Group(http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) @todo setrlimit */ -static const char* IDENT_EXEC_C="$Id: pa_exec.C,v 1.38 2002/08/01 11:26:50 paf Exp $"; +static const char* IDENT_EXEC_C="$Date: 2003/01/21 15:51:14 $"; #include "pa_config_includes.h" @@ -163,10 +163,10 @@ static const char *buildCommand(Pool& po #else -static int execve_piped(const char *file_spec_cstr, +static pid_t execve_piped(const char *file_spec_cstr, char * const argv[], char * const env[], int *pipe_in, int *pipe_out, int *pipe_err) { - int pid; + pid_t pid; int in_fds[2]; int out_fds[2]; int err_fds[2]; @@ -211,7 +211,7 @@ static int execve_piped(const char *file close(err_fds[0]); close(err_fds[1]); } errno=save_errno; - return 0; + return -1; } if(!pid) { @@ -235,7 +235,8 @@ static int execve_piped(const char *file close(err_fds[1]); } - /* HP-UX SIGCHLD fix goes here, if someone will remind me what it is... */ + /* grabbed this from Apache source: */ + /* HP-UX SIGCHLD fix goes here, if someone will remind me what it is... */ signal(SIGCHLD, SIG_DFL); /* Was that it? */ // chdir to script's directory @@ -280,8 +281,8 @@ static int get_exit_status(int pid) { static void read_pipe(String& result, int file, const char *file_spec, String::Untaint_lang lang){ while(true) { char *buf=(char *)result.pool().malloc(MAX_STRING); - size_t size=read(file, buf, MAX_STRING); - if(!size) + ssize_t size=read(file, buf, MAX_STRING); + if(size<=0) break; result.APPEND(buf, size, lang, file_spec, 0); } @@ -301,7 +302,7 @@ static void append_env_pair(const Hash:: string << key << "=" << *static_cast(value); char ***env_ref=static_cast(info); - **env_ref=string.cstr(); (*env_ref)++; + **env_ref=string.cstr(String::UL_UNSPECIFIED); (*env_ref)++; #endif } @@ -330,7 +331,7 @@ int pa_exec( if(env) { String string(env->pool()); env->for_each(append_env_pair, &string); - env_cstr=string.cstr(); + env_cstr=string.cstr(String::UL_UNSPECIFIED); } if(DWORD error=CreateHiddenConsoleProcess(cmd, env_cstr, &pi, &hInWrite, &hOutRead, &hErrRead)) { char szErrorDesc[MAX_STRING]; @@ -374,7 +375,7 @@ from http://www.apache.org/websrc/cvsweb int pipe_write, pipe_read, pipe_err; char *file_spec_cstr=file_spec.cstr(String::UL_FILE_SPEC); -#ifdef NO_FOREIGN_GROUP_FILES +#ifdef PA_SAFE_MODE if(!forced_allow) { struct stat finfo; if(stat(file_spec_cstr, &finfo)!=0) @@ -383,10 +384,11 @@ from http://www.apache.org/websrc/cvsweb "stat failed: %s (%d), actual filename '%s'", strerror(errno), errno, file_spec_cstr); - if(finfo.st_gid/*foreign?*/!=getegid()) - throw Exception("parser.runtime", - &file_spec, - "parser executing files of foreign group is disabled [recompile parser without --disable-foreign-group-files configure option], actual filename '%s'", + if(finfo.st_uid/*foreign?*/!=geteuid() + && finfo.st_gid/*foreign?*/!=getegid()) + throw Exception("parser.runtime", + &file_spec, + "parser is in safe mode: executing files of foreign group and user disabled [recompile parser with --disable-safe-mode configure option], actual filename '%s'", file_spec_cstr); } #endif @@ -412,14 +414,15 @@ from http://www.apache.org/websrc/cvsweb *env_ref=0; } - int pid=execve_piped( + pid_t pid=execve_piped( file_spec_cstr, argv_cstrs, env_cstrs, &pipe_write, &pipe_read, &pipe_err); - if(pid) { + if(pid>0) { // in child const char *in_cstr=in.cstr(); - write(pipe_write, in_cstr, in.size()); + if(*in_cstr) // there is some in data + write(pipe_write, in_cstr, in.size()); close(pipe_write); read_pipe(out, pipe_read, file_spec_cstr, String::UL_AS_IS); close(pipe_read); @@ -430,7 +433,7 @@ from http://www.apache.org/websrc/cvsweb } else throw Exception(0, &file_spec, - "pipe error"); + "%s error: %s (%d)", pid<0?"fork":"pipe", strerror(errno), errno); #endif return 0;