This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.21-369-g88ed594


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  88ed594f5d431d855256edbe7e886c8cf4b575dc (commit)
      from  654055e09332a0be9a2f0439dbc052e6a82f448a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=88ed594f5d431d855256edbe7e886c8cf4b575dc

commit 88ed594f5d431d855256edbe7e886c8cf4b575dc
Author: Roland McGrath <roland@hack.frob.com>
Date:   Tue May 19 15:04:41 2015 -0700

    BZ#18434: Fix sem_post EOVERFLOW check for [!__HAVE_64B_ATOMICS].

diff --git a/ChangeLog b/ChangeLog
index 231f165..5ea3db5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2015-05-19  Roland McGrath  <roland@hack.frob.com>
+
+	[BZ #18434]
+	* nptl/tst-sem15.c: New file.
+	* nptl/Makefile (tests): Add it.
+	* nptl/sem_post.c (__new_sem_post) [!__HAVE_64B_ATOMICS]:
+	s/<</>>/ to fix typo in EOVERFLOW check.
+	* sysdeps/sparc/sparc32/sem_post.c (__new_sem_post): Likewise.
+
 2015-05-19  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
 	* manual/strings.texi (envz_remove): Fix typo in safety
diff --git a/nptl/Makefile b/nptl/Makefile
index d784c8d..fe1ba05 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -228,6 +228,7 @@ tests = tst-typesizes \
 	tst-key1 tst-key2 tst-key3 tst-key4 \
 	tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
 	tst-sem8 tst-sem9 tst-sem10 tst-sem11 tst-sem12 tst-sem13 tst-sem14 \
+	tst-sem15 \
 	tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \
 	tst-align tst-align3 \
 	tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \
diff --git a/nptl/sem_post.c b/nptl/sem_post.c
index 6e495ed..b6d30b5 100644
--- a/nptl/sem_post.c
+++ b/nptl/sem_post.c
@@ -84,14 +84,14 @@ __new_sem_post (sem_t *sem)
   unsigned int v = atomic_load_relaxed (&isem->value);
   do
     {
-      if ((v << SEM_VALUE_SHIFT) == SEM_VALUE_MAX)
+      if ((v >> SEM_VALUE_SHIFT) == SEM_VALUE_MAX)
 	{
 	  __set_errno (EOVERFLOW);
 	  return -1;
 	}
     }
-  while (!atomic_compare_exchange_weak_release (&isem->value,
-      &v, v + (1 << SEM_VALUE_SHIFT)));
+  while (!atomic_compare_exchange_weak_release
+	 (&isem->value, &v, v + (1 << SEM_VALUE_SHIFT)));
 
   /* If there is any potentially blocked waiter, wake one of them.  */
   if ((v & SEM_NWAITERS_MASK) != 0)
diff --git a/nptl/tst-sem15.c b/nptl/tst-sem15.c
new file mode 100644
index 0000000..3df9561
--- /dev/null
+++ b/nptl/tst-sem15.c
@@ -0,0 +1,99 @@
+/* Test for SEM_VALUE_MAX overflow detection: BZ #18434.
+   Copyright (C) 2015 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
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <limits.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static int
+do_test (void)
+{
+  sem_t s;
+
+  if (sem_init (&s, 0, SEM_VALUE_MAX))
+    {
+      printf ("sem_init: %m\n");
+      return 1;
+    }
+
+  int result = 0;
+
+  int value = 0xdeadbeef;
+  if (sem_getvalue (&s, &value))
+    {
+      printf ("sem_getvalue: %m\n");
+      result = 1;
+    }
+  else
+    {
+      printf ("sem_getvalue after init: %d\n", value);
+      if (value != SEM_VALUE_MAX)
+	{
+	  printf ("\tshould be %d\n", SEM_VALUE_MAX);
+	  result = 1;
+	}
+    }
+
+  errno = 0;
+  if (sem_post(&s) == 0)
+    {
+      puts ("sem_post at SEM_VALUE_MAX succeeded!");
+      result = 1;
+    }
+  else
+    {
+      printf ("sem_post at SEM_VALUE_MAX: %m (%d)\n", errno);
+      if (errno != EOVERFLOW)
+	{
+	  printf ("\tshould be %s (EOVERFLOW = %d)\n",
+		  strerror (EOVERFLOW), EOVERFLOW);
+	  result = 1;
+	}
+    }
+
+  value = 0xbad1d00d;
+  if (sem_getvalue (&s, &value))
+    {
+      printf ("sem_getvalue: %m\n");
+      result = 1;
+    }
+  else
+    {
+      printf ("sem_getvalue after post: %d\n", value);
+      if (value != SEM_VALUE_MAX)
+	{
+	  printf ("\tshould be %d\n", SEM_VALUE_MAX);
+	  result = 1;
+	}
+    }
+
+  if (sem_destroy (&s))
+    {
+      printf ("sem_destroy: %m\n");
+      result = 1;
+    }
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/sysdeps/sparc/sparc32/sem_post.c b/sysdeps/sparc/sparc32/sem_post.c
index 64cd851..c9f85a0 100644
--- a/sysdeps/sparc/sparc32/sem_post.c
+++ b/sysdeps/sparc/sparc32/sem_post.c
@@ -60,19 +60,19 @@ __new_sem_post (sem_t *sem)
   int private = isem->private;
   unsigned int v;
 
-  __sparc32_atomic_do_lock24(&isem->pad);
+  __sparc32_atomic_do_lock24 (&isem->pad);
 
   v = isem->value;
-  if ((v << SEM_VALUE_SHIFT) == SEM_VALUE_MAX)
+  if ((v >> SEM_VALUE_SHIFT) == SEM_VALUE_MAX)
     {
-      __sparc32_atomic_do_unlock24(&isem->pad);
+      __sparc32_atomic_do_unlock24 (&isem->pad);
 
       __set_errno (EOVERFLOW);
       return -1;
     }
   isem->value = v + (1 << SEM_VALUE_SHIFT);
 
-  __sparc32_atomic_do_unlock24(&isem->pad);
+  __sparc32_atomic_do_unlock24 (&isem->pad);
 
   if ((v & SEM_NWAITERS_MASK) != 0)
     futex_wake (&isem->value, 1, private);

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                        |    9 ++++
 nptl/Makefile                    |    1 +
 nptl/sem_post.c                  |    6 +-
 nptl/tst-sem15.c                 |   99 ++++++++++++++++++++++++++++++++++++++
 sysdeps/sparc/sparc32/sem_post.c |    8 ++--
 5 files changed, 116 insertions(+), 7 deletions(-)
 create mode 100644 nptl/tst-sem15.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]