[hurd,commited,2/8] hurd: Detect 32bit overflow in value returned by lseek

Message ID 20180616010627.29577-2-samuel.thibault@ens-lyon.org
State Committed, archived
Headers

Commit Message

Samuel Thibault June 16, 2018, 1:06 a.m. UTC
  * sysdeps/mach/hurd/lseek.c: Include <errno.h>.
	* sysdeps/mach/hurd/lseek.c (__libc_lseek): Check that the value returned
	by __lseek64 can fit off_t, return EOVERFLOW otherwise.
---
 ChangeLog                 |  3 +++
 sysdeps/mach/hurd/lseek.c | 12 +++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)
  

Patch

diff --git a/ChangeLog b/ChangeLog
index 74c14d4f84..0a2e082d73 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,9 @@ 
 	of sendfile.
 	* sysdeps/mach/hurd/sendfile64.c (sendfile64): Rename to __sendfile64.
 	(sendfile64): New strong alias.
+	* sysdeps/mach/hurd/lseek.c: Include <errno.h>.
+	* sysdeps/mach/hurd/lseek.c (__libc_lseek): Check that the value
+	returned by __lseek64 can fit off_t, return EOVERFLOW otherwise.
 
 2018-06-15  Joseph Myers  <joseph@codesourcery.com>
 
diff --git a/sysdeps/mach/hurd/lseek.c b/sysdeps/mach/hurd/lseek.c
index 6677e01202..0a4077268a 100644
--- a/sysdeps/mach/hurd/lseek.c
+++ b/sysdeps/mach/hurd/lseek.c
@@ -17,12 +17,22 @@ 
 
 #include <unistd.h>
 #include <sys/types.h>
+#include <errno.h>
 
 /* Seek to OFFSET on FD, starting from WHENCE.  */
 off_t
 __libc_lseek (int fd, off_t offset, int whence)
 {
-  return __libc_lseek64 (fd, (off64_t) offset, whence);
+  off64_t res64 = __libc_lseek64 (fd, (off64_t) offset, whence);
+  off_t res = (off_t) res64;
+
+  if (sizeof res != sizeof res64 && res != res64)
+    {
+      __set_errno (EOVERFLOW);
+      return (off_t) -1;
+    }
+
+  return res;
 }
 
 weak_alias (__libc_lseek, __lseek)