From: Markos Chandras <[email protected]>
Signed-off-by: Markos Chandras <[email protected]>
---
libc/sysdeps/linux/common/sendfile.c | 44 +++++++++++++++++++++++++++++++--
1 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/libc/sysdeps/linux/common/sendfile.c
b/libc/sysdeps/linux/common/sendfile.c
index 89bab9f..c80df6e 100644
--- a/libc/sysdeps/linux/common/sendfile.c
+++ b/libc/sysdeps/linux/common/sendfile.c
@@ -8,16 +8,54 @@
*/
#include <sys/syscall.h>
+#include <stddef.h>
#include <unistd.h>
#include <sys/sendfile.h>
-#ifdef __NR_sendfile
+#if defined(__NR_sendfile64) && ! defined(__NR_sendfile)
+ssize_t sendfile(int out_fd, int in_fd, __off_t* offset, size_t count)
+{
+ __off64_t off64, *off;
+ ssize_t res;
+ /*
+ * Check if valids fd and valid pointers were passed
+ * This does not prevent the user from passing
+ * an arbitrary pointer causing a segfault or
+ * other security issues
+ */
+
+ if (in_fd < 0 || out_fd < 0) {
+ __set_errno(EBADF);
+ return -1;
+ }
+
+ if (offset == NULL || (int)offset < 0) {
+ __set_errno(EFAULT);
+ return -1;
+ }
+
+ if (offset) {
+ off = &off64;
+ off64 = *offset;
+ } else {
+ off = NULL;
+ }
+
+ res = INLINE_SYSCALL(sendfile64, 4, out_fd, in_fd, off, count);
+
+ if (res >= 0)
+ *offset = off64;
+
+ return res;
+}
+
+#elif defined(__NR_sendfile)
_syscall4(ssize_t, sendfile, int, out_fd, int, in_fd, __off_t *, offset,
size_t, count)
-#if ! defined __NR_sendfile64 && defined __UCLIBC_HAS_LFS__
+#if ! defined(__NR_sendfile64) && defined(__UCLIBC_HAS_LFS__)
strong_alias(sendfile,sendfile64)
#endif
-#endif /* __NR_sendfile */
+#endif
--
1.7.1
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc