summaryrefslogtreecommitdiff
path: root/src/unistd
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2019-07-16 23:07:49 -0400
committerRich Felker <dalias@aerifal.cx>2019-07-16 23:07:49 -0400
commit1a28c6eade3046e73da0e80bbb7c377f24f514c7 (patch)
treee4233acc2b90a7c1c7fa9a8723108a0bbd72948d /src/unistd
parent918c5fa0fc656e49b1ab9ce47183a23e3a36bc00 (diff)
downloadmusl-1a28c6eade3046e73da0e80bbb7c377f24f514c7.tar.gz
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.
Diffstat (limited to 'src/unistd')
-rw-r--r--src/unistd/x32/lseek.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/unistd/x32/lseek.c b/src/unistd/x32/lseek.c
new file mode 100644
index 00000000..32636429
--- /dev/null
+++ b/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);