From: Markos Chandras <markos.chand...@imgtec.com> Signed-off-by: Markos Chandras <markos.chand...@imgtec.com> --- libc/sysdeps/linux/common/statfs.c | 49 ++++++++++++++++++++++++++++++++++++ 1 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/libc/sysdeps/linux/common/statfs.c b/libc/sysdeps/linux/common/statfs.c index d24bc9d..9f96b4d 100644 --- a/libc/sysdeps/linux/common/statfs.c +++ b/libc/sysdeps/linux/common/statfs.c @@ -12,7 +12,54 @@ #include <sys/param.h> #include <sys/vfs.h> +#if defined(__NR_statfs64) && ! defined(__NR_statfs) + +int __libc_statfs(const char* path, struct statfs* buf) +{ + struct statfs64 b; + int err; + + /* + * See if pointer has a sane value. + * This does not prevent the user from + * passing an arbitrary possitive value + * that can lead to a segfault or potential + * security problems + */ + + if (buf == NULL || (int)buf < 0) { + __set_errno(EFAULT); + return -1; + } + + err = INLINE_SYSCALL(statfs64, 3, path, sizeof(b), &b); + + if (err < 0) + return -1; + + buf->f_type = b.f_type; + buf->f_bsize = b.f_bsize; + buf->f_blocks = b.f_blocks; + buf->f_bfree = b.f_bfree; + buf->f_bavail = b.f_bavail; + buf->f_files = b.f_files; + buf->f_ffree = b.f_ffree; + buf->f_namelen = b.f_namelen; + buf->f_frsize = b.f_frsize; + buf->f_fsid = b.f_fsid; + memcpy(buf->f_spare, b.f_spare, sizeof(b.f_spare)); + + return err; +} +#if defined __UCLIBC_LINUX_SPECIFIC__ || defined __UCLIBC_HAS_THREADS_NATIVE__ +/* statfs is used by NPTL, so it must exported in case */ +weak_alias(__libc_statfs,statfs) +#endif + +/* For systems which have both, prefer the old one */ +#else extern __typeof(statfs) __libc_statfs attribute_hidden; + #define __NR___libc_statfs __NR_statfs _syscall2(int, __libc_statfs, const char *, path, struct statfs *, buf) @@ -20,3 +67,5 @@ _syscall2(int, __libc_statfs, const char *, path, struct statfs *, buf) /* statfs is used by NPTL, so it must exported in case */ weak_alias(__libc_statfs,statfs) #endif + +#endif -- 1.7.1 _______________________________________________ uClibc mailing list uClibc@uclibc.org http://lists.busybox.net/mailman/listinfo/uclibc