-*- coding: utf-8 -*-
Changes with Apache 2.1.8
+ *) mod_cgid: Append .PID to the script socket filename and remove the
+ script socket on exit. [Colm MacCarthaigh, Jim Jagielski]
+
*) mod_cgid: run the get_suexec_identity hook within the request-handler
instead of within cgid. PR 36410. [Colm MacCarthaigh]
<directivesynopsis>
<name>ScriptSock</name>
-<description>The name of the socket to use for communication with
+<description>The filename prefix of the socket to use for communication with
the cgi daemon</description>
<syntax>ScriptSock <var>file-path</var></syntax>
<default>ScriptSock logs/cgisock</default>
<context>virtual host</context></contextlist>
<usage>
- <p>This directive sets the name of the socket to use for
- communication with the CGI daemon. The socket will be opened
+ <p>This directive sets the filename prefix of the socket to use for
+ communication with the CGI daemon, an extension correspondening to
+ the process ID of the server will be appended. The socket will be opened
using the permissions of the user who starts Apache (usually
root). To maintain the security of communications with CGI
scripts, it is important that no other user has permission to
*/
AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring);
+/**
+ * Given a string, append the PID deliminated by delim.
+ * Usually used to create a pid-appended filepath name
+ * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not
+ * a macro, to avoid unistd.h dependency
+ * @param p The pool to allocate memory from
+ * @param string The string to append the PID to
+ * @param delim The string to use to deliminate the string from the PID
+ * @return A copy of the string with the PID appended
+ */
+AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string,
+ const char *delim);
+
/* Misc system hackery */
/**
* Given the name of an object in the file system determine if it is a directory
* up when pconf gets cleaned up
*/
kill(proc->pid, SIGHUP); /* send signal to daemon telling it to die */
+
+ /* Remove the cgi socket, we must do it here in order to try and
+ * guarantee the same permissions as when the socket was created
+ */
+ if (unlink(sockname) < 0 && errno != ENOENT) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, errno, NULL,
+ "Couldn't unlink unix domain socket %s",
+ sockname);
+ }
break;
}
}
apr_signal(SIGCHLD, SIG_IGN);
apr_signal(SIGHUP, daemon_signal_handler);
- if (unlink(sockname) < 0 && errno != ENOENT) {
- ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server,
- "Couldn't unlink unix domain socket %s",
- sockname);
- /* just a warning; don't bail out */
- }
-
/* cgid should use its own suexec doer */
ap_hook_get_suexec_identity(cgid_suexec_id_doer, NULL, NULL,
APR_HOOK_REALLY_FIRST);
static int cgid_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
apr_pool_t *ptemp)
{
- sockname = DEFAULT_SOCKET;
+ sockname = ap_append_pid(pconf, DEFAULT_SOCKET, ".");
return OK;
}
return err;
}
- sockname = ap_server_root_relative(cmd->pool, arg);
+ sockname = ap_append_pid(cmd->pool, arg, ".");
+ sockname = ap_server_root_relative(cmd->pool, sockname);
if (!sockname) {
return apr_pstrcat(cmd->pool, "Invalid Scriptsock path",
static const char *log_pid_tid(request_rec *r, char *a)
{
if (*a == '\0' || !strcmp(a, "pid")) {
- return apr_psprintf(r->pool, "%" APR_PID_T_FMT, getpid());
+ return ap_append_pid(r->pool, "", "");
}
else if (!strcmp(a, "tid")) {
#if APR_HAS_THREADS
if(dir) {
apr_status_t res;
- char buf[512];
+ char * buf = NULL;
int len = strlen(sconf->gprof_dir) - 1;
if(*(dir + len) == '%') {
dir[len] = '\0';
- apr_snprintf(buf, sizeof(buf), "%sgprof.%d", dir, (int)getpid());
+ buf = ap_append_pid(pconf, dir, "gprof.");
}
- else {
- buf[0] = '\0';
- }
- use_dir = ap_server_root_relative(pconf, buf[0] ? buf : dir);
+ use_dir = ap_server_root_relative(pconf, buf ? buf : dir);
res = apr_dir_make(use_dir,
APR_UREAD | APR_UWRITE | APR_UEXECUTE |
APR_GREAD | APR_GEXECUTE |
*outchr = '\0';
return outstring;
}
+
+/*
+ * Given a string, append the PID deliminated by delim.
+ * Usually used to create a pid-appended filepath name
+ * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not
+ * a macro, to avoid unistd.h dependency
+ */
+AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string,
+ const char *delim)
+{
+ return apr_psprintf(p, "%s%s%" APR_PID_T_FMT, string,
+ delim, getpid());
+
+}