From 400aa020ea599b4319670a1cea7028930aeab588 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 16 Jan 2012 09:03:20 -0500 Subject: [PATCH] Fix locking problem in fmtmsg --- ChangeLog | 8 ++++++++ stdlib/Makefile | 5 +++-- stdlib/bug-fmtmsg1.c | 28 ++++++++++++++++++++++++++++ stdlib/fmtmsg.c | 5 ++++- 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 stdlib/bug-fmtmsg1.c diff --git a/ChangeLog b/ChangeLog index 00faba1ffa..3f06b9a800 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-01-16 Ulrich Drepper + + * stdlib/Makefile (tests): Add bug-fmtmsg1. + * stdlib/bug-fmtmsg1.c: New file. + + * stdlib/fmtmsg.c (init): Add missing unlock. + Patch by Peng Haitao . + 2012-01-12 Marek Polacek * libio/bits/stdio2.h: Do not define gets for ISO C11, ISO C++11, diff --git a/stdlib/Makefile b/stdlib/Makefile index 04c6ac5cae..f9bba3a55d 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-2009, 2011 Free Software Foundation, Inc. +# Copyright (C) 1991-2009, 2011, 2012 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -71,7 +71,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 tst-rand48-2 \ tst-makecontext tst-strtod4 tst-strtod5 tst-qsort2 \ tst-makecontext2 tst-strtod6 tst-unsetenv1 \ - tst-makecontext3 bug-getcontext + tst-makecontext3 bug-getcontext bug-fmtmsg1 include ../Makeconfig @@ -121,6 +121,7 @@ tst-strtod3-ENV = LOCPATH=$(common-objpfx)localedata tst-strtod4-ENV = LOCPATH=$(common-objpfx)localedata tst-strtod5-ENV = LOCPATH=$(common-objpfx)localedata testmb2-ENV = LOCPATH=$(common-objpfx)localedata +bug-fmtmsg1-ENV = SEV_LEVEL=foo,11,newsev # Run a test on the header files we use. tests: $(objpfx)isomac.out diff --git a/stdlib/bug-fmtmsg1.c b/stdlib/bug-fmtmsg1.c new file mode 100644 index 0000000000..04bfaea3ce --- /dev/null +++ b/stdlib/bug-fmtmsg1.c @@ -0,0 +1,28 @@ +#include +#include + + +static int +do_test (void) +{ + /* Ugly, but fmtmsg would otherwise print to stderr which we do not + want. */ + fclose (stderr); + stderr = stdout; + + int e1; + e1 = fmtmsg (MM_PRINT, "label:part", MM_WARNING, "text", "action", "tag"); + + int e2; + e2 = fmtmsg (MM_PRINT, "label2:part2", 11, "text2", "action2", "tag2"); + + addseverity (10, "additional severity"); + + int e3; + e3 = fmtmsg (MM_PRINT, "label3:part3", 10, "text3", "action3", "tag3"); + + return e1 != 0 || e2 != 0 || e3 != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c index 8ee06bfd06..d187bb21b0 100644 --- a/stdlib/fmtmsg.c +++ b/stdlib/fmtmsg.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1997,1999-2003,2005,2006,2011 Free Software Foundation, Inc. +/* Copyright (C) 1997,1999-2003,2005,2006,2011,2012 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -280,6 +281,8 @@ init (void) sevlevel_var = end + (*end == ':' ? 1 : 0); } + + __libc_lock_unlock (lock); } }