]> granicus.if.org Git - php/commitdiff
Fix event log handling in startup phase
authorAnatol Belski <ab@php.net>
Fri, 6 Jul 2018 11:59:14 +0000 (13:59 +0200)
committerAnatol Belski <ab@php.net>
Fri, 6 Jul 2018 14:07:28 +0000 (16:07 +0200)
The log header can be saved in the globals on startup. At the same
time, the log header can be changed per request. In case that
happened, wrong pointer will be free'd on shutdown. It can happen at
any point when zend_error() or similar is called at startup, like for
example in the case of the ini deprecation warnings. Thus, ZMM cannot
be used here.

win32/wsyslog.c

index 6b0f03e8eab05283c4b9accc16cd303c4c40fd4e..73f9969a78ba883e1390eec1a9ca25b237aa19f3 100644 (file)
@@ -66,7 +66,7 @@ void closelog(void)
                PW32G(log_source) = INVALID_HANDLE_VALUE;
        }
        if (PW32G(log_header)) {
-               efree(PW32G(log_header));
+               free(PW32G(log_header));
                PW32G(log_header) = NULL;
        }
 }
@@ -112,7 +112,6 @@ void syslog(int priority, const char *message, ...)
        efree(tmp);
 }
 
-
 /* Emulator for BSD openlog() routine
  * Accepts: identity
  *      options
@@ -121,11 +120,14 @@ void syslog(int priority, const char *message, ...)
 
 void openlog(const char *ident, int logopt, int facility)
 {
+       size_t header_len;
 
        closelog();
 
        PW32G(log_source) = RegisterEventSource(NULL, "PHP-" PHP_VERSION);
-       spprintf(&PW32G(log_header), 0, (logopt & LOG_PID) ? "%s[%d]" : "%s", ident, getpid());
+       header_len = strlen(ident) + 2 + 11;
+       PW32G(log_header) = malloc(header_len*sizeof(char));
+       sprintf_s(PW32G(log_header), header_len, (logopt & LOG_PID) ? "%s[%d]" : "%s", ident, getpid());
 }
 
 /*