forked from OSchip/llvm-project
[sanitizer][mips64] fix MIPS64 kernel_stat_to_stat()
This patch tackles with two issues: Output stat st_[a|m|c]time fields were holding wrong values. st_[a|m|c]time fields should have contained value of seconds and instead these are filled with st_[a|m|c]time_nsec fields which hold nanoseconds. Build fails for MIPS64 if SANITIZER_ANDROID. Recently <sys/stat.h> from bionic introduced st_[a|m|c]time_nsec macros for compatibility with old NDKs and those clashed with the field names of the <asm/stat.h> kernel_stat structure. To fix both issues and make sure sanitizer builds on all platforms, we must un-define all compatibility macros and access the fields directly when copying the 'time' fields. Patch by Miodrag Dinic <miodrag.dinic@imgtec.com> Differential Revision: https://reviews.llvm.org/D35671 llvm-svn: 313360
This commit is contained in:
parent
8b62e0887d
commit
16807db3d4
|
@ -255,6 +255,21 @@ static void stat64_to_stat(struct stat64 *in, struct stat *out) {
|
|||
#endif
|
||||
|
||||
#if defined(__mips64)
|
||||
// Undefine compatibility macros from <sys/stat.h>
|
||||
// so that they would not clash with the kernel_stat
|
||||
// st_[a|m|c]time fields
|
||||
#undef st_atime
|
||||
#undef st_mtime
|
||||
#undef st_ctime
|
||||
#if defined(SANITIZER_ANDROID)
|
||||
// Bionic sys/stat.h defines additional macros
|
||||
// for compatibility with the old NDKs and
|
||||
// they clash with the kernel_stat structure
|
||||
// st_[a|m|c]time_nsec fields.
|
||||
#undef st_atime_nsec
|
||||
#undef st_mtime_nsec
|
||||
#undef st_ctime_nsec
|
||||
#endif
|
||||
static void kernel_stat_to_stat(struct kernel_stat *in, struct stat *out) {
|
||||
internal_memset(out, 0, sizeof(*out));
|
||||
out->st_dev = in->st_dev;
|
||||
|
@ -267,9 +282,23 @@ static void kernel_stat_to_stat(struct kernel_stat *in, struct stat *out) {
|
|||
out->st_size = in->st_size;
|
||||
out->st_blksize = in->st_blksize;
|
||||
out->st_blocks = in->st_blocks;
|
||||
out->st_atime = in->st_atime_nsec;
|
||||
out->st_mtime = in->st_mtime_nsec;
|
||||
out->st_ctime = in->st_ctime_nsec;
|
||||
#if defined(__USE_MISC) || \
|
||||
defined(__USE_XOPEN2K8) || \
|
||||
defined(SANITIZER_ANDROID)
|
||||
out->st_atim.tv_sec = in->st_atime;
|
||||
out->st_atim.tv_nsec = in->st_atime_nsec;
|
||||
out->st_mtim.tv_sec = in->st_mtime;
|
||||
out->st_mtim.tv_nsec = in->st_mtime_nsec;
|
||||
out->st_ctim.tv_sec = in->st_ctime;
|
||||
out->st_ctim.tv_nsec = in->st_ctime_nsec;
|
||||
#else
|
||||
out->st_atime = in->st_atime;
|
||||
out->st_atimensec = in->st_atime_nsec;
|
||||
out->st_mtime = in->st_mtime;
|
||||
out->st_mtimensec = in->st_mtime_nsec;
|
||||
out->st_ctime = in->st_ctime;
|
||||
out->st_atimensec = in->st_ctime_nsec;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue