From 7724defcf8873116fe4efab256596861eef21a94 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 24 Feb 2012 21:18:04 -0500 Subject: Fix locking in fmtmsg --- ChangeLog | 6 ++- stdlib/fmtmsg.c | 119 ++++++++++++++++++++++++++++++-------------------------- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/ChangeLog b/ChangeLog index 27a6337..2105c8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,11 @@ +2012-02-24 Ulrich Drepper + + * stdlib/fmtmsg.c (fmtmsg): Lock around use of severity list. + Reported by Peng Haitao . + 2012-02-24 Joseph Myers * configure.in: Use -o not -a in test for unsupported multi-arch. - * configure: Regenerated. 2012-02-24 Joseph Myers diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c index 9203317..4c02302 100644 --- a/stdlib/fmtmsg.c +++ b/stdlib/fmtmsg.c @@ -103,7 +103,6 @@ fmtmsg (long int classification, const char *label, int severity, const char *text, const char *action, const char *tag) { __libc_once_define (static, once); - int result = MM_OK; struct severity_info *severity_rec; /* Make sure everything is initialized. */ @@ -124,17 +123,6 @@ fmtmsg (long int classification, const char *label, int severity, return MM_NOTOK; } - for (severity_rec = severity_list; severity_rec != NULL; - severity_rec = severity_rec->next) - if (severity == severity_rec->severity) - /* Bingo. */ - break; - - /* If we don't know anything about the severity level return an error. */ - if (severity_rec == NULL) - return MM_NOTOK; - - #ifdef __libc_ptf_call /* We do not want this call to be cut short by a thread cancellation. Therefore disable cancellation for now. */ @@ -143,54 +131,73 @@ fmtmsg (long int classification, const char *label, int severity, 0); #endif - /* Now we can print. */ - if (classification & MM_PRINT) - { - int do_label = (print & label_mask) && label != MM_NULLLBL; - int do_severity = (print & severity_mask) && severity != MM_NULLSEV; - int do_text = (print & text_mask) && text != MM_NULLTXT; - int do_action = (print & action_mask) && action != MM_NULLACT; - int do_tag = (print & tag_mask) && tag != MM_NULLTAG; - - if (__fxprintf (stderr, "%s%s%s%s%s%s%s%s%s%s\n", - do_label ? label : "", - do_label && (do_severity | do_text | do_action | do_tag) - ? ": " : "", - do_severity ? severity_rec->string : "", - do_severity && (do_text | do_action | do_tag) - ? ": " : "", - do_text ? text : "", - do_text && (do_action | do_tag) ? "\n" : "", - do_action ? "TO FIX: " : "", - do_action ? action : "", - do_action && do_tag ? " " : "", - do_tag ? tag : "") < 0) - /* Oh, oh. An error occurred during the output. */ - result = MM_NOMSG; - } + __libc_lock_lock (lock); - if (classification & MM_CONSOLE) + for (severity_rec = severity_list; severity_rec != NULL; + severity_rec = severity_rec->next) + if (severity == severity_rec->severity) + /* Bingo. */ + break; + + /* If we don't know anything about the severity level return an error. */ + int result = MM_NOTOK; + if (severity_rec != NULL) { - int do_label = label != MM_NULLLBL; - int do_severity = severity != MM_NULLSEV; - int do_text = text != MM_NULLTXT; - int do_action = action != MM_NULLACT; - int do_tag = tag != MM_NULLTAG; - - syslog (LOG_ERR, "%s%s%s%s%s%s%s%s%s%s\n", - do_label ? label : "", - do_label && (do_severity | do_text | do_action | do_tag) - ? ": " : "", - do_severity ? severity_rec->string : "", - do_severity && (do_text | do_action | do_tag) ? ": " : "", - do_text ? text : "", - do_text && (do_action | do_tag) ? "\n" : "", - do_action ? "TO FIX: " : "", - do_action ? action : "", - do_action && do_tag ? " " : "", - do_tag ? tag : ""); + result = MM_OK; + + /* Now we can print. */ + if (classification & MM_PRINT) + { + int do_label = (print & label_mask) && label != MM_NULLLBL; + int do_severity = (print & severity_mask) && severity != MM_NULLSEV; + int do_text = (print & text_mask) && text != MM_NULLTXT; + int do_action = (print & action_mask) && action != MM_NULLACT; + int do_tag = (print & tag_mask) && tag != MM_NULLTAG; + int need_colon = (do_label + && (do_severity | do_text | do_action | do_tag)); + + if (__fxprintf (stderr, "%s%s%s%s%s%s%s%s%s%s\n", + do_label ? label : "", + need_colon ? ": " : "", + do_severity ? severity_rec->string : "", + do_severity && (do_text | do_action | do_tag) + ? ": " : "", + do_text ? text : "", + do_text && (do_action | do_tag) ? "\n" : "", + do_action ? "TO FIX: " : "", + do_action ? action : "", + do_action && do_tag ? " " : "", + do_tag ? tag : "") < 0) + /* Oh, oh. An error occurred during the output. */ + result = MM_NOMSG; + } + + if (classification & MM_CONSOLE) + { + int do_label = label != MM_NULLLBL; + int do_severity = severity != MM_NULLSEV; + int do_text = text != MM_NULLTXT; + int do_action = action != MM_NULLACT; + int do_tag = tag != MM_NULLTAG; + int need_colon = (do_label + && (do_severity | do_text | do_action | do_tag)); + + syslog (LOG_ERR, "%s%s%s%s%s%s%s%s%s%s\n", + do_label ? label : "", + need_colon ? ": " : "", + do_severity ? severity_rec->string : "", + do_severity && (do_text | do_action | do_tag) ? ": " : "", + do_text ? text : "", + do_text && (do_action | do_tag) ? "\n" : "", + do_action ? "TO FIX: " : "", + do_action ? action : "", + do_action && do_tag ? " " : "", + do_tag ? tag : ""); + } } + __libc_lock_unlock (lock); + #ifdef __libc_ptf_call __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); #endif -- cgit v1.1