浏览代码

libc/statfs64: Skip conversion code for new architectures

Fixes the following tests in LTP

statfs02_64 ( test case #5 )

The purpose of this test is to pass an invalid pointer to the statfs64
syscall and check if the kernel returns EFAULT or not. However,
uClibc creates a new statfs struct which is then passed to the kernel.
As a result of which, the kernel returns 0 because the newly created
statfs structure is valid. But, when copying the contens of the new
pointer to the old userspace one, the uClibc segfauls because the old
pointer is invalid. Old architectures are doomed to suffer by this
problem but new architectures can use the statfs64 syscall directly
so that the userspace pointer is passed directly to the kernel and get
the correct errno at the end.

Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Markos Chandras 12 年之前
父节点
当前提交
08f8dd1e58
共有 1 个文件被更改,包括 9 次插入0 次删除
  1. 9 0
      libc/misc/statfs/statfs64.c

+ 9 - 0
libc/misc/statfs/statfs64.c

@@ -21,9 +21,11 @@
 #include <string.h>
 #include <string.h>
 #include <stddef.h>
 #include <stddef.h>
 #include <sys/statfs.h>
 #include <sys/statfs.h>
+#include <sys/syscall.h>
 
 
 extern __typeof(statfs) __libc_statfs;
 extern __typeof(statfs) __libc_statfs;
 
 
+#if defined __NR_statfs
 /* Return information about the filesystem on which FILE resides.  */
 /* Return information about the filesystem on which FILE resides.  */
 int statfs64 (const char *file, struct statfs64 *buf)
 int statfs64 (const char *file, struct statfs64 *buf)
 {
 {
@@ -51,4 +53,11 @@ int statfs64 (const char *file, struct statfs64 *buf)
 
 
     return 0;
     return 0;
 }
 }
+#else
+int statfs64 (const char *file, struct statfs64 *buf)
+{
+    return INLINE_SYSCALL(statfs64, 3, file, sizeof(*buf), buf);
+}
+#endif
+
 libc_hidden_def(statfs64)
 libc_hidden_def(statfs64)