From: Joe Orton Date: Fri, 13 Mar 2020 14:34:18 +0000 (+0000) Subject: * server/log.c (ap_log_pid): Use a temporary file, then rename once X-Git-Tag: 2.5.0-alpha2-ci-test-only~1584 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd10a9352e87a868ad527022bbafdc3b82cc6d0a;p=thirdparty%2Fapache%2Fhttpd.git * server/log.c (ap_log_pid): Use a temporary file, then rename once successfully written; also add error checking. Avoids startup failures if a previous httpd invocation crashed while writing the pidfile. Submitted by: Nicolas Carrier , jorton Github: closes #100, closes #69 PR: 63140 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1875153 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index a2c48e60277..1b31b9c4455 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,11 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.1 + *) core: Use a temporary file when writing the pid file, avoiding + startup failure if an empty pidfile is left over from a + previous crashed or aborted invocation of httpd. PR 63140. + [Nicolas Carrier , Joe Orton] + *) mod_http2: Fixes issue where mod_unique_id would generate non-unique request identifier under load, see . [Michael Kaufmann, Stefan Eissing] diff --git a/docs/log-message-tags/next-number b/docs/log-message-tags/next-number index 90cbf74d5b1..63b3cf1c42d 100644 --- a/docs/log-message-tags/next-number +++ b/docs/log-message-tags/next-number @@ -1 +1 @@ -10231 +10232 diff --git a/server/log.c b/server/log.c index cb84024bbc7..07fb358a2af 100644 --- a/server/log.c +++ b/server/log.c @@ -1524,6 +1524,9 @@ AP_DECLARE(void) ap_log_pid(apr_pool_t *p, const char *filename) pid_t mypid; apr_status_t rv; const char *fname; + char *temp_fname; + apr_fileperms_t perms; + char pidstr[64]; if (!filename) { return; @@ -1552,19 +1555,35 @@ AP_DECLARE(void) ap_log_pid(apr_pool_t *p, const char *filename) fname); } - if ((rv = apr_file_open(&pid_file, fname, - APR_WRITE | APR_CREATE | APR_TRUNCATE, - APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD, p)) - != APR_SUCCESS) { + temp_fname = apr_pstrcat(p, fname, ".XXXXXX", NULL); + rv = apr_file_mktemp(&pid_file, temp_fname, + APR_FOPEN_WRITE | APR_FOPEN_CREATE | APR_FOPEN_TRUNCATE, p); + if (rv != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(00099) - "could not create %s", fname); + "could not create %s", temp_fname); ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, APLOGNO(00100) "%s: could not log pid to file %s", ap_server_argv0, fname); exit(1); } - apr_file_printf(pid_file, "%" APR_PID_T_FMT APR_EOL_STR, mypid); - apr_file_close(pid_file); + + apr_snprintf(pidstr, sizeof pidstr, "%" APR_PID_T_FMT APR_EOL_STR, mypid); + + perms = APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD; + rv = apr_file_perms_set(temp_fname, perms); + if (rv == APR_SUCCESS) + rv = apr_file_write_full(pid_file, pidstr, strlen(pidstr), NULL); + if (rv == APR_SUCCESS) + rv = apr_file_close(pid_file); + if (rv == APR_SUCCESS) + rv = apr_file_rename(temp_fname, fname, p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, APLOGNO(10231) + "%s: Failed creating pid file %s", + ap_server_argv0, temp_fname); + exit(1); + } + saved_pid = mypid; }