From: Ulrich Drepper Date: Sat, 25 Feb 2012 02:18:04 +0000 (-0500) Subject: Fix locking in fmtmsg X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8b5394afb420449dde0b4cbefd4032936d96a25;p=thirdparty%2Fglibc.git Fix locking in fmtmsg (cherry picked from commit 7724defcf8873116fe4efab256596861eef21a94) --- diff --git a/ChangeLog b/ChangeLog index edda87616d0..9654d0ac4ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-02-24 Ulrich Drepper + + * stdlib/fmtmsg.c (fmtmsg): Lock around use of severity list. + Reported by Peng Haitao . + 2012-01-27 Ulrich Drepper [BZ #13618] diff --git a/NEWS b/NEWS index 48a98239660..63cf1d15ca7 100644 --- a/NEWS +++ b/NEWS @@ -10,8 +10,8 @@ Version 2.15.1 * The following bugs are resolved with this release: 411, 2547, 2548, 11261, 11365, 11494, 13583, 13618, 13731, 13732, 13733, - 13747, 13748, 13749, 13753, 13754, 13756, 13771, 13773, 13774, 13786, - 14048, 14059, 14167, 14273, 14459, 14621, 14648, 14040, 15073 + 13747, 13748, 13749, 13753, 13754, 13756, 13765, 13771, 13773, 13774, + 13786, 14048, 14059, 14167, 14273, 14459, 14621, 14648, 14040, 15073 Version 2.15 diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c index 8ee06bfd06e..47e409f0833 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