This is an automated email from the git hooks/post-receive script.
mreynolds pushed a change to branch 389-ds-base-1.3.8 in repository 389-ds-base.
from de03e74 Ticket 49932 - Crash in delete_passwdPolicy when persistent search connections are terminated unexpectedly new c5e7824 Ticket 49937 - Log buffer exceeded emergency logging msg is not thread-safe
The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference.
Summary of changes: ldap/servers/slapd/log.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
This is an automated email from the git hooks/post-receive script.
mreynolds pushed a commit to branch 389-ds-base-1.3.8 in repository 389-ds-base.
commit c5e78249d6001326ac0303188f64bcd1b1261874 Author: Mark Reynolds mreynolds@redhat.com Date: Wed Sep 5 14:09:21 2018 -0400
Ticket 49937 - Log buffer exceeded emergency logging msg is not thread-safe
Bug Description: Multiple operations making modificatiosn on a DN that is very large can crash the server, because when we do emergency logging, we close and reopen the errors log withgout hold the error log write lock. This causes the FD pointer to be become invalid and triggers a crash.
Fix description: Hold the errors log write lock while closing and reopening the log
https://pagure.io/389-ds-base/issue/49937
Reviewed by: vashirov(Thanks!)
(cherry picked from commit 8ff8cb850be8a93f75aa3007ee2131c026f4962b) --- ldap/servers/slapd/log.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/ldap/servers/slapd/log.c b/ldap/servers/slapd/log.c index 2e4ee03..7dd7154 100644 --- a/ldap/servers/slapd/log.c +++ b/ldap/servers/slapd/log.c @@ -2231,11 +2231,11 @@ vslapd_log_emergency_error(LOGFD fp, const char *msg, int locked) if (logging_hr_timestamps_enabled == 1) { struct timespec tsnow; if (clock_gettime(CLOCK_REALTIME, &tsnow) != 0) { - syslog(LOG_EMERG, "vslapd_log_emergency_error, Unable to determine system time for message :: %s", msg); + syslog(LOG_EMERG, "vslapd_log_emergency_error, Unable to determine system time for message :: %s\n", msg); return; } if (format_localTime_hr_log(tsnow.tv_sec, tsnow.tv_nsec, sizeof(tbuf), tbuf, &size) != 0) { - syslog(LOG_EMERG, "vslapd_log_emergency_error, Unable to format system time for message :: %s", msg); + syslog(LOG_EMERG, "vslapd_log_emergency_error, Unable to format system time for message :: %s\n", msg); return; } } else { @@ -2243,14 +2243,14 @@ vslapd_log_emergency_error(LOGFD fp, const char *msg, int locked) time_t tnl; tnl = slapi_current_utc_time(); if (format_localTime_log(tnl, sizeof(tbuf), tbuf, &size) != 0) { - syslog(LOG_EMERG, "vslapd_log_emergency_error, Unable to format system time for message :: %s", msg); + syslog(LOG_EMERG, "vslapd_log_emergency_error, Unable to format system time for message :: %s\n", msg); return; } #ifdef HAVE_CLOCK_GETTIME } #endif
- PR_snprintf(buffer, sizeof(buffer), "%s - EMERG - %s", tbuf, msg); + PR_snprintf(buffer, sizeof(buffer), "%s - EMERG - %s\n", tbuf, msg); size = strlen(buffer);
if (!locked) { @@ -2531,7 +2531,7 @@ vslapd_log_access(char *fmt, va_list ap)
if (SLAPI_LOG_BUFSIZ - blen < vlen) { /* We won't be able to fit the message in! Uh-oh! */ - /* Should we actually just do the snprintf, and warn that message was trunced? */ + /* Should we actually just do the snprintf, and warn that message was truncated? */ log__error_emergency("Insufficent buffer capacity to fit timestamp and message!", 1, 0); return -1; } @@ -4486,6 +4486,13 @@ log__error_emergency(const char *errstr, int reopen, int locked) if (!reopen) { return; } + if (!locked) { + /* + * Take the lock because we are closing and reopening the error log (fd), + * and we don't want any other threads trying to use this fd + */ + LOG_ERROR_LOCK_WRITE(); + } if (NULL != loginfo.log_error_fdes) { LOG_CLOSE(loginfo.log_error_fdes); } @@ -4494,7 +4501,10 @@ log__error_emergency(const char *errstr, int reopen, int locked) PRErrorCode prerr = PR_GetError(); syslog(LOG_ERR, "Failed to reopen errors log file, " SLAPI_COMPONENT_NAME_NSPR " error %d (%s)\n", prerr, slapd_pr_strerror(prerr)); } else { - vslapd_log_emergency_error(loginfo.log_error_fdes, errstr, locked); + vslapd_log_emergency_error(loginfo.log_error_fdes, errstr, 1 /* locked */); + } + if (!locked) { + LOG_ERROR_UNLOCK_WRITE(); } return; }
389-commits@lists.fedoraproject.org