Browse Source

fix broken lseek on x32 (x86_64/ILP32) with offsets larger than LONG_MAX

this is analogous to commit 918c5fa0fc656e49b1ab9ce47183a23e3a36bc00
which fixed the corresponding issue for mips n32.
Rich Felker 5 years ago
parent
commit
1a28c6eade
1 changed files with 15 additions and 0 deletions
  1. 15 0
      src/unistd/x32/lseek.c

+ 15 - 0
src/unistd/x32/lseek.c

@@ -0,0 +1,15 @@
+#include <unistd.h>
+#include "syscall.h"
+
+off_t __lseek(int fd, off_t offset, int whence)
+{
+	off_t ret;
+	__asm__ __volatile__ ("syscall"
+		: "=a"(ret)
+		: "a"(SYS_lseek), "D"(fd), "S"(offset), "d"(whence)
+		: "rcx", "r11", "memory");
+	return ret < 0 ? __syscall_ret(ret) : ret;
+}
+
+weak_alias(__lseek, lseek);
+weak_alias(__lseek, lseek64);