diff options
author | Elliott Hughes <enh@google.com> | 2015-03-18 15:46:48 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2015-03-18 15:46:48 -0700 |
commit | fa495d51b02e1575088ed358614d3baa442f455f (patch) | |
tree | 7d44227f43953a5b99d2fc582f917987a5980f56 /libc/bionic/statvfs.cpp | |
parent | ab12dc70f3ef551c490dcfede76033e57ceee64d (diff) | |
download | bionic-fa495d51b02e1575088ed358614d3baa442f455f.zip bionic-fa495d51b02e1575088ed358614d3baa442f455f.tar.gz bionic-fa495d51b02e1575088ed358614d3baa442f455f.tar.bz2 |
Hide statfs/fstatfs' ST_VALID flag from userspace.
Spotted while debugging the strace 4.10 upgrade.
Change-Id: I1af1be9c9440151f55f74a835e1df71529b0e4fe
Diffstat (limited to 'libc/bionic/statvfs.cpp')
-rw-r--r-- | libc/bionic/statvfs.cpp | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/libc/bionic/statvfs.cpp b/libc/bionic/statvfs.cpp index f1e2833..39ffb64 100644 --- a/libc/bionic/statvfs.cpp +++ b/libc/bionic/statvfs.cpp @@ -21,13 +21,17 @@ // Paper over the fact that 32-bit kernels use fstatfs64/statfs64 with an extra argument, // but 64-bit kernels don't have the "64" bit suffix or the extra size_t argument. #if __LP64__ -# define __fstatfs64(fd,size,buf) fstatfs(fd,buf) -# define __statfs64(path,size,buf) statfs(path,buf) +extern "C" int __fstatfs(int, struct statfs*); +extern "C" int __statfs(const char*, struct statfs*); +# define __fstatfs64(fd,size,buf) __fstatfs(fd,buf) +# define __statfs64(path,size,buf) __statfs(path,buf) #else extern "C" int __fstatfs64(int, size_t, struct statfs*); extern "C" int __statfs64(const char*, size_t, struct statfs*); #endif +// The kernel sets a private ST_VALID flag to signal to the C library whether the +// f_flags field is valid. This flag should not be exposed to users of the C library. #define ST_VALID 0x0020 static void __statfs_to_statvfs(const struct statfs& in, struct statvfs* out) { @@ -40,13 +44,33 @@ static void __statfs_to_statvfs(const struct statfs& in, struct statvfs* out) { out->f_ffree = in.f_ffree; out->f_favail = in.f_ffree; out->f_fsid = in.f_fsid.__val[0] | (static_cast<uint64_t>(in.f_fsid.__val[1]) << 32); - out->f_flag = in.f_flags & ~ST_VALID; + out->f_flag = in.f_flags; out->f_namemax = in.f_namelen; } +int fstatfs(int fd, struct statfs* result) { + int rc = __fstatfs64(fd, sizeof(*result), result); + if (rc != 0) { + return rc; + } + result->f_flags &= ~ST_VALID; + return 0; +} +__strong_alias(fstatfs64, fstatfs); + +int statfs(const char* path, struct statfs* result) { + int rc = __statfs64(path, sizeof(*result), result); + if (rc != 0) { + return rc; + } + result->f_flags &= ~ST_VALID; + return 0; +} +__strong_alias(statfs64, statfs); + int statvfs(const char* path, struct statvfs* result) { struct statfs tmp; - int rc = __statfs64(path, sizeof(tmp), &tmp); + int rc = statfs(path, &tmp); if (rc != 0) { return rc; } @@ -57,7 +81,7 @@ __strong_alias(statvfs64, statvfs); int fstatvfs(int fd, struct statvfs* result) { struct statfs tmp; - int rc = __fstatfs64(fd, sizeof(tmp), &tmp); + int rc = fstatfs(fd, &tmp); if (rc != 0) { return rc; } |