summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-02-26 09:55:04 +0000
committerEric Andersen <andersen@codepoet.org>2002-02-26 09:55:04 +0000
commitd2c7fef231d4dbf8eef58e26c65d5372a7ff07ed (patch)
tree8e7b8c4fa0f835d95933ecfeccfb25cc847564e0
parent033c0d7edcb04845b31ca09ae87f9c25acab975d (diff)
Patch from Miles Bader to restrict common truncate64/ftruncate64
syscalls to 64-bit systems, since we can't be sure that the _syscall macros can cope with 64 bit args on 32 bit arches.
-rw-r--r--libc/sysdeps/linux/common/syscalls.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c
index bfb7c6771..3bf540b20 100644
--- a/libc/sysdeps/linux/common/syscalls.c
+++ b/libc/sysdeps/linux/common/syscalls.c
@@ -1039,12 +1039,13 @@ _syscall1(int, setfsgid, gid_t, gid);
#endif
//#define __NR__llseek 140
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L__llseek
-extern int _llseek(int fd, off_t hoff, off_t loff, loff_t *res, int whence);
+#ifdef __UCLIBC_HAVE_LFS__
+extern int _llseek(int fd, off_t offset_hi, off_t offset_lo,
+ loff_t *result, int whence);
-_syscall5(int, _llseek, int, fd, off_t, hoff, off_t, loff, loff_t *, res,
- int, whence);
+_syscall5(int, _llseek, int, fd, off_t, offset_hi, off_t, offset_lo,
+ loff_t *, result, int, whence);
loff_t __libc_lseek64(int fd, loff_t offset, int whence)
{
@@ -1409,25 +1410,41 @@ _syscall4(ssize_t,sendfile, int, out_fd, int, in_fd, off_t *, offset, size_t, co
//#define __NR_truncate64 193
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L_truncate64
+#ifdef __UCLIBC_HAVE_LFS__
+#include <bits/wordsize.h>
+/* We only implement truncate64/ftruncate64 on 64-bit systems, because
+ * Using _syscall2 to pass 64-bit arguments generally only works on 64-bit
+ * systems, so we only implement truncate64/ftruncate64 in that case. Ports
+ * for processors with shorter word-lengths should define their own custom
+ * versions instead. */
+#if __WORDSIZE >= 64
#include <unistd.h>
_syscall2(int, truncate64, const char *, path, __off64_t, length);
-#endif
+#endif /* __WORDSIZE >= 64 */
#endif /* __UCLIBC_HAVE_LFS__ */
+#endif
//#define __NR_ftruncate64 194
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L_ftruncate64
+#ifdef __UCLIBC_HAVE_LFS__
+#include <bits/wordsize.h>
+/* We only implement truncate64/ftruncate64 on 64-bit systems, because
+ * Using _syscall2 to pass 64-bit arguments generally only works on 64-bit
+ * systems, so we only implement truncate64/ftruncate64 in that case. Ports
+ * for processors with shorter word-lengths should define their own custom
+ * versions instead. */
+#if __WORDSIZE >= 64
#include <unistd.h>
_syscall2(int, ftruncate64, int, fd, __off64_t, length);
-#endif
+#endif /* __WORDSIZE >= 64 */
#endif /* __UCLIBC_HAVE_LFS__ */
+#endif
//#define __NR_stat64 195
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L___stat64
+#ifdef __UCLIBC_HAVE_LFS__
#include <unistd.h>
#include "statfix64.h"
#define __NR___stat64 __NR_stat64
@@ -1449,12 +1466,12 @@ int stat64(const char *file_name, struct libc_stat64 *buf)
{
return(__xstat64(0, file_name, buf));
}
-#endif
#endif /* __UCLIBC_HAVE_LFS__ */
+#endif
//#define __NR_lstat64 196
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L___lstat64
+#ifdef __UCLIBC_HAVE_LFS__
#include <unistd.h>
#include "statfix64.h"
#define __NR___lstat64 __NR_lstat64
@@ -1476,12 +1493,12 @@ int lstat64(const char *file_name, struct libc_stat64 *buf)
{
return(__lxstat64(0, file_name, buf));
}
-#endif
#endif /* __UCLIBC_HAVE_LFS__ */
+#endif
//#define __NR_fstat64 197
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L___fstat64
+#ifdef __UCLIBC_HAVE_LFS__
#include <unistd.h>
#include "statfix64.h"
#define __NR___fstat64 __NR_fstat64
@@ -1503,8 +1520,8 @@ int fstat64(int filedes, struct libc_stat64 *buf)
{
return(__fxstat64(0, filedes, buf));
}
-#endif
#endif /* __UCLIBC_HAVE_LFS__ */
+#endif
//#define __NR_lchown32 198
@@ -1538,18 +1555,18 @@ _syscall2(int, pivot_root, const char *, new_root, const char *, put_old)
//#define __NR_madvise1 219 /* delete when C lib stub is removed */
//#define __NR_getdents64 220
-#ifdef __UCLIBC_HAVE_LFS__
#ifdef L_getdents64
+#ifdef __UCLIBC_HAVE_LFS__
#include <unistd.h>
#include <dirent.h>
_syscall3(int, getdents64, int, fd, char *, dirp, size_t, count);
-#endif
#endif /* __UCLIBC_HAVE_LFS__ */
+#endif
//#define __NR_fcntl64 221
+#ifdef L__fcntl64
#ifdef __UCLIBC_HAVE_LFS__
#define __NR__fcntl64 __NR_fcntl64
-#ifdef L__fcntl64
#include <stdarg.h>
#include <fcntl.h>
extern int _fcntl64(int fd, int cmd, long arg);