aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog21
-rw-r--r--inet/Makefile2
-rw-r--r--inet/ether_line.c15
-rw-r--r--inet/tst-ether_line.c38
-rw-r--r--nptl/ChangeLog7
-rw-r--r--nptl/sysdeps/pthread/pthread.h2
-rw-r--r--stdio-common/Makefile2
-rw-r--r--stdio-common/bug21.c16
-rw-r--r--stdio-common/vfscanf.c1
-rw-r--r--sysdeps/unix/sysv/linux/bits/sched.h56
10 files changed, 125 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog
index a731b496b4..49fce28b4f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2007-12-07 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #5441]
+ * stdio-common/vfscanf.c (_IO_vfwscanf): Don't free ptrs_to_free
+ structure, it's allocated with alloca.
+ * stdio-common/Makefile (tests): Add bug21.
+ * stdio-common/bug21.c: New file.
+
+2007-12-06 Aurelien Jarno <aurelien@aurel32.net>
+
+ [BZ #5452]
+ * sysdeps/unix/sysv/linux/bits/sched.h: Use __extension__
+ keyword for gcc's braced-groups.
+
+2007-12-07 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #5454]
+ * inet/ether_line.c: Strip hostname of whitespaces.
+ * inet/Makefile (tests): Add tst-ether_line.
+ * inet/tst-ether_line.c: New file.
+
2007-12-03 Ulrich Drepper <drepper@redhat.com>
[BZ #5439]
diff --git a/inet/Makefile b/inet/Makefile
index 2250cc6e8c..d7139c1d7f 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -52,7 +52,7 @@ routines := htonl htons \
aux := check_pf check_native ifreq
tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
- tst-gethnm test-ifaddrs bug-if1 test-inet6_opt
+ tst-gethnm test-ifaddrs bug-if1 test-inet6_opt tst-ether_line
include ../Rules
diff --git a/inet/ether_line.c b/inet/ether_line.c
index 7e871a6bd7..13c5f394cf 100644
--- a/inet/ether_line.c
+++ b/inet/ether_line.c
@@ -61,19 +61,20 @@ ether_line (const char *line, struct ether_addr *addr, char *hostname)
++line;
}
- /* Remove trailing white space. */
- cp = __strchrnul (line, '#');
- while (cp > line && isspace (cp[-1]))
- --cp;
+ /* Skip initial whitespace. */
+ while (isspace (*line))
+ ++line;
- if (cp == line)
+ if (*line == '#' || *line == '\0')
/* No hostname. */
return -1;
+ /* The hostname is up to the next non-space character. */
/* XXX This can cause trouble because the hostname might be too long
but we have no possibility to check it here. */
- memcpy (hostname, line, cp - line);
- hostname [cp - line] = '\0';
+ while (*line != '\0' && *line != '#' && !isspace (*line))
+ *hostname++ = *line++;
+ *hostname = '\0';
return 0;
}
diff --git a/inet/tst-ether_line.c b/inet/tst-ether_line.c
new file mode 100644
index 0000000000..ff0560b16a
--- /dev/null
+++ b/inet/tst-ether_line.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <string.h>
+#include <netinet/ether.h>
+
+
+static int
+do_test (void)
+{
+ struct ether_addr a;
+ char buf[1000];
+ if (ether_line ("00:01:02:03:04:05 aaaaa \n", &a, buf) != 0)
+ {
+ puts ("ether_line failed");
+ return 1;
+ }
+
+ int res = 0;
+ int i;
+ for (i = 0; i < ETH_ALEN; ++i)
+ {
+ printf ("%02x%s",
+ (int) a.ether_addr_octet[i], i + 1 == ETH_ALEN ? "" : ":");
+ if (a.ether_addr_octet[i] != i)
+ {
+ printf ("octet %d is %d, expected %d\n",
+ i, (int) a.ether_addr_octet[i], i);
+ res = 1;
+ }
+ }
+
+ printf (" \"%s\"\n", buf);
+ res |= strcmp (buf, "aaaaa") != 0;
+
+ return res;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 05d95eb3b4..c882028750 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,10 @@
+2007-12-07 Ulrich Drepper <drepper@redhat.com>
+
+ [BZ #5455]
+ * sysdeps/pthread/pthread.h [!__EXCEPTIONS] (pthread_cleanup_pop):
+ Allow label before pthread_cleanup_pop.
+ (pthread_cleanup_pop_restore_np): Likewise.
+
2007-12-04 Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait):
diff --git a/nptl/sysdeps/pthread/pthread.h b/nptl/sysdeps/pthread/pthread.h
index 59126fcf52..f3ab0ae711 100644
--- a/nptl/sysdeps/pthread/pthread.h
+++ b/nptl/sysdeps/pthread/pthread.h
@@ -655,6 +655,7 @@ extern void __pthread_register_cancel (__pthread_unwind_buf_t *__buf)
/* Remove a cleanup handler installed by the matching pthread_cleanup_push.
If EXECUTE is non-zero, the handler function is called. */
# define pthread_cleanup_pop(execute) \
+ do; while (0); /* Empty to allow label before pthread_cleanup_pop. */ \
} while (0); \
__pthread_unregister_cancel (&__cancel_buf); \
if (execute) \
@@ -690,6 +691,7 @@ extern void __pthread_register_cancel_defer (__pthread_unwind_buf_t *__buf)
restores the cancellation type that was in effect when the matching
pthread_cleanup_push_defer was called. */
# define pthread_cleanup_pop_restore_np(execute) \
+ do; while (0); /* Empty to allow label before pthread_cleanup_pop. */ \
} while (0); \
__pthread_unregister_cancel_restore (&__cancel_buf); \
if (execute) \
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index d5b1251993..db622af22b 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -57,7 +57,7 @@ tests := tstscanf test_rdwr test-popen tstgetln test-fseek \
tst-perror tst-sprintf tst-rndseek tst-fdopen tst-fphex bug14 bug15 \
tst-popen tst-unlockedio tst-fmemopen2 tst-put-error tst-fgets \
tst-fwrite bug16 bug17 tst-swscanf tst-sprintf2 bug18 bug18a \
- bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20
+ bug19 bug19a tst-popen2 scanf13 scanf14 scanf15 bug20 bug21
test-srcs = tst-unbputc tst-printf
diff --git a/stdio-common/bug21.c b/stdio-common/bug21.c
new file mode 100644
index 0000000000..d22b9c1a97
--- /dev/null
+++ b/stdio-common/bug21.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+
+static int
+do_test (void)
+{
+ static const char buf[] = " ";
+ char *str;
+
+ int r = sscanf (buf, "%as", &str);
+ printf ("%d %p\n", r, str);
+
+ return r != -1 || str != NULL;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index f550109a90..a03e19c4e3 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -2845,7 +2845,6 @@ _IO_vfscanf_internal (_IO_FILE *s, const char *format, _IO_va_list argptr,
*p->ptrs[cnt] = NULL;
}
p = p->next;
- free (ptrs_to_free);
ptrs_to_free = p;
}
}
diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
index 5eaa2fe528..5387b9cef0 100644
--- a/sysdeps/unix/sysv/linux/bits/sched.h
+++ b/sysdeps/unix/sysv/linux/bits/sched.h
@@ -132,17 +132,21 @@ typedef struct
} while (0)
# endif
# define __CPU_SET_S(cpu, setsize, cpusetp) \
- ({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? ((cpusetp)->__bits[__CPUELT (__cpu)] |= __CPUMASK (__cpu)) : 0; })
+ (__extension__ \
+ ({ size_t __cpu = (cpu); \
+ __cpu < 8 * (setsize) \
+ ? ((cpusetp)->__bits[__CPUELT (__cpu)] |= __CPUMASK (__cpu)) : 0; }))
# define __CPU_CLR_S(cpu, setsize, cpusetp) \
- ({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? ((cpusetp)->__bits[__CPUELT (__cpu)] &= ~__CPUMASK (__cpu)) : 0; })
+ (__extension__ \
+ ({ size_t __cpu = (cpu); \
+ __cpu < 8 * (setsize) \
+ ? ((cpusetp)->__bits[__CPUELT (__cpu)] &= ~__CPUMASK (__cpu)) : 0; }))
# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
- ({ size_t __cpu = (cpu); \
- __cpu < 8 * (setsize) \
- ? (((cpusetp)->__bits[__CPUELT (__cpu)] & __CPUMASK (__cpu))) != 0 : 0; })
+ (__extension__ \
+ ({ size_t __cpu = (cpu); \
+ __cpu < 8 * (setsize) \
+ ? (((cpusetp)->__bits[__CPUELT (__cpu)] & __CPUMASK (__cpu))) != 0 \
+ : 0; }))
# define __CPU_COUNT_S(setsize, cpusetp) \
__sched_cpucount (setsize, cpusetp)
@@ -152,25 +156,27 @@ typedef struct
(__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
# else
# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
- ({ cpu_set_t *__arr1 = (cpusetp1); \
- cpu_set_t *__arr2 = (cpusetp2); \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- size_t __i; \
- for (__i = 0; __i < __imax; ++__i) \
- if (__arr1->__bits[__i] != __arr2->__bits[__i]) \
- break; \
- __i == __imax; })
+ (__extension__ \
+ ({ cpu_set_t *__arr1 = (cpusetp1); \
+ cpu_set_t *__arr2 = (cpusetp2); \
+ size_t __imax = (setsize) / sizeof (__cpu_mask); \
+ size_t __i; \
+ for (__i = 0; __i < __imax; ++__i) \
+ if (__arr1->__bits[__i] != __arr2->__bits[__i]) \
+ break; \
+ __i == __imax; }))
# endif
# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
- ({ cpu_set_t *__dest = (destset); \
- cpu_set_t *__arr1 = (srcset1); \
- cpu_set_t *__arr2 = (srcset2); \
- size_t __imax = (setsize) / sizeof (__cpu_mask); \
- size_t __i; \
- for (__i = 0; __i < __imax; ++__i) \
- __dest->__bits[__i] = __arr1->__bits[__i] op __arr2->__bits[__i]; \
- __dest; })
+ (__extension__ \
+ ({ cpu_set_t *__dest = (destset); \
+ cpu_set_t *__arr1 = (srcset1); \
+ cpu_set_t *__arr2 = (srcset2); \
+ size_t __imax = (setsize) / sizeof (__cpu_mask); \
+ size_t __i; \
+ for (__i = 0; __i < __imax; ++__i) \
+ __dest->__bits[__i] = __arr1->__bits[__i] op __arr2->__bits[__i]; \
+ __dest; }))
# define __CPU_ALLOC_SIZE(count) \
((((count) + __NCPUBITS - 1) / __NCPUBITS) * 8)