summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2018-07-06 13:59:14 +0200
committerAnatol Belski <ab@php.net>2018-07-06 16:07:28 +0200
commit246cb03e261a8fb499a1cdb70d609a19c26a6574 (patch)
treee877da186a931923db7c6fbc0bfc412d8778c2da
parent3847a6fcb63c362548e9434b195232f2dcf7a6c7 (diff)
downloadphp-git-246cb03e261a8fb499a1cdb70d609a19c26a6574.tar.gz
Fix event log handling in startup phase
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.
-rw-r--r--win32/wsyslog.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/win32/wsyslog.c b/win32/wsyslog.c
index 6b0f03e8ea..73f9969a78 100644
--- a/win32/wsyslog.c
+++ b/win32/wsyslog.c
@@ -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());
}
/*