Commit 055f1c02 authored by Peter Korsgaard's avatar Peter Korsgaard
Browse files

uclibc: add upstream 0.9.33 fixes

Upstream has a large number of patches lined up for the next 0.9.33.x bugfix
release;

http://git.uclibc.org/uClibc/log/?h=0.9.33



Add them here, as atleast some of them are quite critical (E.G. the eventfd
issue gets triggered by recent glib versions).

I've skipped the microblaze and xtensa fixes as we don't currently support
those with 0.9.33.2.

Drop uclibc-0002-Add-definition-of-MSG_WAITFORONE-and-MSG_CMSG_CMSG_CLOEXE.patch
as that is a subset of uclibc-0035-socket.h-pull-socket_type.h-from-eglibc.patch

Signed-off-by: default avatarPeter Korsgaard <jacmet@sunsite.dk>
parent 66c0d5d0
Loading
Loading
Loading
Loading
+0 −39
Original line number Diff line number Diff line
From e95694dfd24779acaab0bb1500f182e46f8a518d Mon Sep 17 00:00:00 2001
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Date: Sat, 13 Jul 2013 17:13:55 +0200
Subject: [PATCH 2/8] Add definition of MSG_WAITFORONE and MSG_CMSG_CLOEXEC

From yocto:
http://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-core/uclibc/uclibc-0.9.33/define-MSG_CMSG_CLOEXEC.patch

Upstream-Status: Pending

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 libc/sysdeps/linux/common/bits/socket.h | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/libc/sysdeps/linux/common/bits/socket.h b/libc/sysdeps/linux/common/bits/socket.h
index 7e12733..338fd92 100644
--- a/libc/sysdeps/linux/common/bits/socket.h
+++ b/libc/sysdeps/linux/common/bits/socket.h
@@ -235,8 +235,15 @@ enum
 #define	MSG_ERRQUEUE	MSG_ERRQUEUE
     MSG_NOSIGNAL	= 0x4000, /* Do not generate SIGPIPE.  */
 #define	MSG_NOSIGNAL	MSG_NOSIGNAL
-    MSG_MORE		= 0x8000  /* Sender will send more.  */
+    MSG_MORE		= 0x8000,  /* Sender will send more.  */
 #define	MSG_MORE	MSG_MORE
+    MSG_WAITFORONE      = 0x10000, /* Wait for at least one packet to return.*/
+#define MSG_WAITFORONE  MSG_WAITFORONE
+
+    MSG_CMSG_CLOEXEC    = 0x40000000    /* Set close_on_exit for file
+                                           descriptor received through
+                                           SCM_RIGHTS.  */
+#define MSG_CMSG_CLOEXEC MSG_CMSG_CLOEXEC
   };
 
 
-- 
1.8.1.2
+64 −0
Original line number Diff line number Diff line
From 7810e4f8027b5c4c8ceec6fefec4eb779362ebb5 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Sun, 10 Jun 2012 09:36:23 -0700
Subject: [PATCH] eventfd: Implement eventfd2 and fix eventfd

eventfd: evntfd assumes to take two arguments instead it
should be one evntfd expects two therefore implement both syscalls with
correct parameters

Thanks Eugene Rudoy for reporting it and also providing the patch

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 libc/sysdeps/linux/common/eventfd.c |   16 ++++++++++++++--
 libc/sysdeps/linux/common/stubs.c   |    2 +-
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/libc/sysdeps/linux/common/eventfd.c b/libc/sysdeps/linux/common/eventfd.c
index cc3f3f0..96597ab 100644
--- a/libc/sysdeps/linux/common/eventfd.c
+++ b/libc/sysdeps/linux/common/eventfd.c
@@ -7,12 +7,24 @@
  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  */
 
+#include <errno.h>
 #include <sys/syscall.h>
 #include <sys/eventfd.h>
 
 /*
  * eventfd()
  */
-#ifdef __NR_eventfd
-_syscall2(int, eventfd, int, count, int, flags)
+#if defined __NR_eventfd || defined __NR_eventfd2
+int eventfd (int count, int flags)
+{
+#if defined __NR_eventfd2
+  return INLINE_SYSCALL (eventfd2, 2, count, flags);
+#elif defined __NR_eventfd
+  if (flags != 0) {
+     __set_errno (EINVAL);
+    return -1;
+  }
+  return INLINE_SYSCALL (eventfd, 1, count);
+#endif
+}
 #endif
diff --git a/libc/sysdeps/linux/common/stubs.c b/libc/sysdeps/linux/common/stubs.c
index 4d1e26c..7af14c1 100644
--- a/libc/sysdeps/linux/common/stubs.c
+++ b/libc/sysdeps/linux/common/stubs.c
@@ -93,7 +93,7 @@ make_stub(epoll_ctl)
 make_stub(epoll_wait)
 #endif
 
-#if !defined __NR_eventfd && defined __UCLIBC_LINUX_SPECIFIC__
+#if !defined __NR_eventfd && !defined __NR_eventfd2 && defined __UCLIBC_LINUX_SPECIFIC__
 make_stub(eventfd)
 #endif
 
-- 
1.7.10.4
+219 −0
Original line number Diff line number Diff line
From 342a3d861fde5651ee53486addbacddcec6a0a58 Mon Sep 17 00:00:00 2001
From: Natanael Copa <natanael.copa@gmail.com>
Date: Sat, 4 Aug 2012 19:32:45 +0200
Subject: [PATCH] pread/pwrite: backport fix

pread/pwrite syscalls has been renamed to pread64/pwrite in 2.6 kernel.

There was a fallback function using lseek for kernels who did not have
this syscall (pre 2.1.60). This is broken in many ways.

uclibc have been using the broken fallback due to they forgot to rename
pread syscall.

This got detected with git-1.7.11 which introduced threaded index-pack
which broke in similar ways a windows (msys).

This issue in uclibc have been reported upstream and fixed in git master
so this patch does not need to be upstreamed. It might be an idea to
backport it properly for 0.9.33 branch though.

Signed-off-by: Natanael Copa <natanael.copa@gmail.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
---
 libc/sysdeps/linux/common/pread_write.c |  143 ++++---------------------------
 1 file changed, 19 insertions(+), 124 deletions(-)

diff --git a/libc/sysdeps/linux/common/pread_write.c b/libc/sysdeps/linux/common/pread_write.c
index 88e6957..baf8691 100644
--- a/libc/sysdeps/linux/common/pread_write.c
+++ b/libc/sysdeps/linux/common/pread_write.c
@@ -17,6 +17,7 @@
 #include <unistd.h>
 #include <stdint.h>
 #include <endian.h>
+#include <sysdep-cancel.h>
 
 extern __typeof(pread) __libc_pread;
 extern __typeof(pwrite) __libc_pwrite;
@@ -27,15 +28,17 @@ extern __typeof(pwrite64) __libc_pwrite64;
 
 #include <bits/kernel_types.h>
 
-#ifdef __NR_pread
-
-# define __NR___syscall_pread __NR_pread
+# define __NR___syscall_pread __NR_pread64
 static __inline__ _syscall5(ssize_t, __syscall_pread, int, fd, void *, buf,
 		size_t, count, off_t, offset_hi, off_t, offset_lo)
 
 ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
 {
-	return __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, offset));
+	int oldtype = LIBC_CANCEL_ASYNC ();
+	int result = __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, offset));
+	LIBC_CANCEL_RESET (oldtype);
+	return result;
+
 }
 weak_alias(__libc_pread,pread)
 
@@ -44,22 +47,24 @@ ssize_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset)
 {
 	uint32_t low = offset & 0xffffffff;
 	uint32_t high = offset >> 32;
-	return __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(high, low));
+	int oldtype = LIBC_CANCEL_ASYNC ();
+	int result = __syscall_pread(fd, buf, count, __LONG_LONG_PAIR(high, low));
+	LIBC_CANCEL_RESET (oldtype);
+	return result;
 }
 weak_alias(__libc_pread64,pread64)
 # endif /* __UCLIBC_HAS_LFS__  */
 
-#endif /* __NR_pread */
-
-#ifdef __NR_pwrite
-
-# define __NR___syscall_pwrite __NR_pwrite
+# define __NR___syscall_pwrite __NR_pwrite64
 static __inline__ _syscall5(ssize_t, __syscall_pwrite, int, fd, const void *, buf,
 		size_t, count, off_t, offset_hi, off_t, offset_lo)
 
 ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
 {
-	return __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, offset));
+	int oldtype = LIBC_CANCEL_ASYNC ();
+	int result = __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(offset >> 31, offset));
+	LIBC_CANCEL_RESET (oldtype);
+	return result;
 }
 weak_alias(__libc_pwrite,pwrite)
 
@@ -68,120 +73,10 @@ ssize_t __libc_pwrite64(int fd, const void *buf, size_t count, off64_t offset)
 {
 	uint32_t low = offset & 0xffffffff;
 	uint32_t high = offset >> 32;
-	return __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(high, low));
-}
-weak_alias(__libc_pwrite64,pwrite64)
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /* __NR_pwrite */
-
-#if ! defined __NR_pread || ! defined __NR_pwrite
-
-static ssize_t __fake_pread_write(int fd, void *buf,
-		size_t count, off_t offset, int do_pwrite)
-{
-	int save_errno;
-	ssize_t result;
-	off_t old_offset;
-
-	/* Since we must not change the file pointer preserve the
-	 * value so that we can restore it later.  */
-	if ((old_offset=lseek(fd, 0, SEEK_CUR)) == (off_t) -1)
-		return -1;
-
-	/* Set to wanted position.  */
-	if (lseek(fd, offset, SEEK_SET) == (off_t) -1)
-		return -1;
-
-	if (do_pwrite == 1) {
-		/* Write the data.  */
-		result = write(fd, buf, count);
-	} else {
-		/* Read the data.  */
-		result = read(fd, buf, count);
-	}
-
-	/* Now we have to restore the position.  If this fails we
-	 * have to return this as an error.  */
-	save_errno = errno;
-	if (lseek(fd, old_offset, SEEK_SET) == (off_t) -1)
-	{
-		if (result == -1)
-			__set_errno(save_errno);
-		return -1;
-	}
-	__set_errno(save_errno);
-	return(result);
-}
-
-# ifdef __UCLIBC_HAS_LFS__
-
-static ssize_t __fake_pread_write64(int fd, void *buf,
-		size_t count, off64_t offset, int do_pwrite)
-{
-	int save_errno;
-	ssize_t result;
-	off64_t old_offset;
-
-	/* Since we must not change the file pointer preserve the
-	 * value so that we can restore it later.  */
-	if ((old_offset=lseek64(fd, 0, SEEK_CUR)) == (off64_t) -1)
-		return -1;
-
-	/* Set to wanted position.  */
-	if (lseek64(fd, offset, SEEK_SET) == (off64_t) -1)
-		return -1;
-
-	if (do_pwrite == 1) {
-		/* Write the data.  */
-		result = write(fd, buf, count);
-	} else {
-		/* Read the data.  */
-		result = read(fd, buf, count);
-	}
-
-	/* Now we have to restore the position. */
-	save_errno = errno;
-	if (lseek64(fd, old_offset, SEEK_SET) == (off64_t) -1) {
-		if (result == -1)
-			__set_errno (save_errno);
-		return -1;
-	}
-	__set_errno (save_errno);
+	int oldtype = LIBC_CANCEL_ASYNC ();
+	int result = __syscall_pwrite(fd, buf, count, __LONG_LONG_PAIR(high, low));
+	LIBC_CANCEL_RESET (oldtype);
 	return result;
 }
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /*  ! defined __NR_pread || ! defined __NR_pwrite */
-
-#ifndef __NR_pread
-ssize_t __libc_pread(int fd, void *buf, size_t count, off_t offset)
-{
-	return __fake_pread_write(fd, buf, count, offset, 0);
-}
-weak_alias(__libc_pread,pread)
-
-# ifdef __UCLIBC_HAS_LFS__
-ssize_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset)
-{
-	return __fake_pread_write64(fd, buf, count, offset, 0);
-}
-weak_alias(__libc_pread64,pread64)
-# endif /* __UCLIBC_HAS_LFS__  */
-#endif /* ! __NR_pread */
-
-#ifndef __NR_pwrite
-ssize_t __libc_pwrite(int fd, const void *buf, size_t count, off_t offset)
-{
-	/* we won't actually be modifying the buffer,
-	 *just cast it to get rid of warnings */
-	return __fake_pread_write(fd, (void*)buf, count, offset, 1);
-}
-weak_alias(__libc_pwrite,pwrite)
-
-# ifdef __UCLIBC_HAS_LFS__
-ssize_t __libc_pwrite64(int fd, const void *buf, size_t count, off64_t offset)
-{
-	return __fake_pread_write64(fd, (void*)buf, count, offset, 1);
-}
 weak_alias(__libc_pwrite64,pwrite64)
 # endif /* __UCLIBC_HAS_LFS__  */
-#endif /* ! __NR_pwrite */
-- 
1.7.10.4
+61 −0
Original line number Diff line number Diff line
From 93b8ce8886e30986be31c1403b606b6367dc258a Mon Sep 17 00:00:00 2001
From: "Peter S. Mazinger" <ps.m@gmx.net>
Date: Tue, 26 Apr 2011 23:03:44 +0200
Subject: [PATCH] add posix_madvise.c

Signed-off-by: Peter S. Mazinger <ps.m@gmx.net>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
 libc/sysdeps/linux/common/Makefile.in     |    2 +-
 libc/sysdeps/linux/common/posix_madvise.c |   25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 libc/sysdeps/linux/common/posix_madvise.c

diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in
index 3b5763c..b39082b 100644
--- a/libc/sysdeps/linux/common/Makefile.in
+++ b/libc/sysdeps/linux/common/Makefile.in
@@ -81,7 +81,7 @@ CSRC-$(UCLIBC_HAS_REALTIME) += clock_getres.c clock_gettime.c clock_settime.c \
 	sched_get_priority_max.c sched_get_priority_min.c sched_getscheduler.c \
 	sched_rr_get_interval.c sched_setparam.c sched_setscheduler.c sigqueue.c
 # clock_getcpuclockid|clock_nanosleep|mq_timedreceive|mq_timedsend|posix_fadvise|posix_fallocate|posix_madvise|posix_memalign|posix_mem_offset|posix_spawnattr_destroy|posix_spawnattr_init|posix_spawnattr_getflags|posix_spawnattr_setflags|posix_spawnattr_getpgroup|posix_spawnattr_setpgroup|posix_spawnattr_getschedparam|posix_spawnattr_setschedparam|posix_spawnattr_getschedpolicy|posix_spawnattr_setschedpolicy|posix_spawnattr_getsigdefault|posix_spawnattr_setsigdefault|posix_spawnattr_getsigmask|posix_spawnattr_setsigmask|posix_spawnattr_init|posix_spawnattr_setflags|posix_spawnattr_setpgroup|posix_spawnattr_setschedparam|posix_spawnattr_setschedpolicy|posix_spawnattr_setsigdefault|posix_spawnattr_setsigmask|posix_spawn_file_actions_addclose|posix_spawn_file_actions_addopen|posix_spawn_file_actions_adddup2|posix_spawn_file_actions_addopen|posix_spawn_file_actions_destroy|posix_spawn_file_actions_init|posix_spawn_file_actions_init|posix_spawn|posix_spawnp|posix_spawnp|posix_typed_mem_get_info|pthread_mutex_timedlock|sem_timedwait
-CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c
+CSRC-$(UCLIBC_HAS_ADVANCED_REALTIME) += posix_fadvise64.c posix_fadvise.c posix_madvise.c
 CSRC-$(UCLIBC_SUSV4_LEGACY) += utime.c
 CSRC-$(UCLIBC_HAS_EPOLL) += epoll.c
 CSRC-$(UCLIBC_HAS_XATTR) += xattr.c
diff --git a/libc/sysdeps/linux/common/posix_madvise.c b/libc/sysdeps/linux/common/posix_madvise.c
new file mode 100644
index 0000000..2f95bcb
--- /dev/null
+++ b/libc/sysdeps/linux/common/posix_madvise.c
@@ -0,0 +1,25 @@
+/* vi: set sw=4 ts=4: */
+/* Licensed under the LGPL v2.1, see the file LICENSE in this tarball. */
+
+#include <sys/mman.h>
+#include <sys/syscall.h>
+
+#if defined __NR_madvise && defined __USE_XOPEN2K && defined __UCLIBC_HAS_ADVANCED_REALTIME__
+int posix_madvise(void *addr, size_t len, int advice)
+{
+	int result;
+	/* We have one problem: the kernel's MADV_DONTNEED does not
+	 * correspond to POSIX's POSIX_MADV_DONTNEED.  The former simply
+	 * discards changes made to the memory without writing it back to
+	 * disk, if this would be necessary.  The POSIX behaviour does not
+	 * allow this.  There is no functionality mapping for the POSIX
+	 * behaviour so far so we ignore that advice for now. */
+	if (advice == POSIX_MADV_DONTNEED)
+		return 0;
+
+	/* this part might use madvise function */
+	INTERNAL_SYSCALL_DECL (err);
+	result = INTERNAL_SYSCALL (madvise, err, 3, addr, len, advice);
+	return INTERNAL_SYSCALL_ERRNO (result, err);
+}
+#endif
-- 
1.7.10.4
+38 −0
Original line number Diff line number Diff line
From ffd9e147b120e9c2bf30ba4861860f1bc59362c5 Mon Sep 17 00:00:00 2001
From: Stas Sergeev <stsp@users.sourceforge.net>
Date: Thu, 14 Jun 2012 01:00:02 +0200
Subject: [PATCH] nptl: sh: fix race condition in lll_wait_tid

Make a local copy of the tid value to avoid a race condition,
as the value could have been changed to 0, thus using a pointer
it would have been passed to the lll_futex_wait modified.

Signed-off-by: Stas Sergeev <stsp@users.sourceforge.net>
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
(cherry picked from commit 0dcc13bf7a61b1d0708e5dd103d5515e0ffec79a)

Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
---
 libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
index d10cd61..b83d863 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
@@ -396,9 +396,9 @@ extern int __lll_unlock_wake (int *__futex, int private) attribute_hidden;
 
 #define lll_wait_tid(tid) \
   do {									      \
-    __typeof (tid) *__tid = &(tid);					      \
-    while (*__tid != 0)							      \
-      lll_futex_wait (__tid, *__tid, LLL_SHARED);			      \
+    __typeof (tid) __tid;						      \
+    while ((__tid = (tid)) != 0)						      \
+      lll_futex_wait (&(tid), __tid, LLL_SHARED);			      \
   } while (0)
 
 extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime)
-- 
1.7.10.4
Loading