Sophie

Sophie

distrib > Mandriva > 2007.0 > x86_64 > media > main-updates-src > by-pkgid > 8fda3ecf7b23856f7036f304b55572dc > files > 56

glibc-2.4-7mdv2007.0.src.rpm

2006-06-14  Jakub Jelinek  <jakub@redhat.com>

	[BZ #2766]
	* misc/insremque.c (insque): Handle prev == NULL.
	* misc/Makefile (tests): Add tst-insremque.
	* misc/tst-insremque.c: New test.

--- libc/misc/Makefile	23 Feb 2006 22:50:16 -0000	1.118
+++ libc/misc/Makefile	17 Jun 2006 17:00:58 -0000	1.119
@@ -78,7 +78,7 @@ endif
 gpl2lgpl := error.c error.h
 
 tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
-	 tst-error1 tst-pselect
+	 tst-error1 tst-pselect tst-insremque
 ifeq (no,$(cross-compiling))
 tests: $(objpfx)tst-error1-mem
 endif
--- libc/misc/insremque.c	6 Jul 2001 04:55:36 -0000	1.4
+++ libc/misc/insremque.c	17 Jun 2006 16:59:34 -0000	1.5
@@ -24,12 +24,20 @@
 void
 insque (void *elem, void *prev)
 {
-  struct qelem *next = ((struct qelem *) prev)->q_forw;
-  ((struct qelem *) prev)->q_forw = (struct qelem *) elem;
-  if (next != NULL)
-    next->q_back = (struct qelem *) elem;
-  ((struct qelem *) elem)->q_forw = next;
-  ((struct qelem *) elem)->q_back = (struct qelem *) prev;
+  if (prev == NULL)
+    {
+      ((struct qelem *) elem)->q_forw = NULL;
+      ((struct qelem *) elem)->q_back = NULL;
+    }
+  else
+    {
+      struct qelem *next = ((struct qelem *) prev)->q_forw;
+      ((struct qelem *) prev)->q_forw = (struct qelem *) elem;
+      if (next != NULL)
+	next->q_back = (struct qelem *) elem;
+      ((struct qelem *) elem)->q_forw = next;
+      ((struct qelem *) elem)->q_back = (struct qelem *) prev;
+    }
 }
 
 /* Unlink ELEM from the doubly-linked list that it is in.  */
--- libc/misc/tst-insremque.c	1 Jan 1970 00:00:00 -0000
+++ libc/misc/tst-insremque.c	17 Jun 2006 17:00:08 -0000	1.1
@@ -0,0 +1,61 @@
+#include <search.h>
+#include <stdio.h>
+#include <string.h>
+
+#define CHECK(cond) \
+  do									\
+    if (! (cond))							\
+      {									\
+	printf ("Condition " #cond " not true on line %d\n", __LINE__);	\
+	ret = 1;							\
+      }									\
+  while (0)
+
+static int
+do_test (void)
+{
+  struct qelem elements[4];
+  int ret = 0;
+
+  /* Linear list.  */
+  memset (elements, 0xff, sizeof (elements));
+  insque (&elements[0], NULL);
+  remque (&elements[0]);
+  insque (&elements[0], NULL);
+  insque (&elements[2], &elements[0]);
+  insque (&elements[1], &elements[0]);
+  insque (&elements[3], &elements[2]);
+  remque (&elements[2]);
+  insque (&elements[2], &elements[0]);
+  CHECK (elements[0].q_back == NULL);
+  CHECK (elements[0].q_forw == &elements[2]);
+  CHECK (elements[1].q_back == &elements[2]);
+  CHECK (elements[1].q_forw == &elements[3]);
+  CHECK (elements[2].q_back == &elements[0]);
+  CHECK (elements[2].q_forw == &elements[1]);
+  CHECK (elements[3].q_back == &elements[1]);
+  CHECK (elements[3].q_forw == NULL);
+
+  /* Circular list.  */
+  memset (elements, 0xff, sizeof (elements));
+  elements[0].q_back = &elements[0];
+  elements[0].q_forw = &elements[0];
+  insque (&elements[2], &elements[0]);
+  insque (&elements[1], &elements[0]);
+  insque (&elements[3], &elements[2]);
+  remque (&elements[2]);
+  insque (&elements[2], &elements[0]);
+  CHECK (elements[0].q_back == &elements[3]);
+  CHECK (elements[0].q_forw == &elements[2]);
+  CHECK (elements[1].q_back == &elements[2]);
+  CHECK (elements[1].q_forw == &elements[3]);
+  CHECK (elements[2].q_back == &elements[0]);
+  CHECK (elements[2].q_forw == &elements[1]);
+  CHECK (elements[3].q_back == &elements[1]);
+  CHECK (elements[3].q_forw == &elements[0]);
+
+  return ret;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"