diff --git a/valgrind-3.13.0-utime.patch b/valgrind-3.13.0-utime.patch new file mode 100644 index 0000000..6706ee3 --- /dev/null +++ b/valgrind-3.13.0-utime.patch @@ -0,0 +1,47 @@ +diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c +index 2336c29..0f8e07a 100644 +--- a/coregrind/m_syswrap/syswrap-linux.c ++++ b/coregrind/m_syswrap/syswrap-linux.c +@@ -5277,8 +5277,25 @@ PRE(sys_utimensat) + int, dfd, char *, filename, struct timespec *, utimes, int, flags); + if (ARG2 != 0) + PRE_MEM_RASCIIZ( "utimensat(filename)", ARG2 ); +- if (ARG3 != 0) +- PRE_MEM_READ( "utimensat(tvp)", ARG3, 2 * sizeof(struct vki_timespec) ); ++ if (ARG3 != 0) { ++ /* If timespec.tv_nsec has the special value UTIME_NOW or UTIME_OMIT ++ then the tv_sec field is ignored. */ ++ struct vki_timespec *times = (struct vki_timespec *)(Addr)ARG3; ++ PRE_MEM_READ( "utimensat(times[0].tv_nsec)", ++ (Addr)×[0].tv_nsec, sizeof(times[0].tv_nsec)); ++ PRE_MEM_READ( "utimensat(times[1].tv_nsec)", ++ (Addr)×[1].tv_nsec, sizeof(times[1].tv_nsec)); ++ if (ML_(safe_to_deref)(times, 2 * sizeof(struct vki_timespec))) { ++ if (times[0].tv_nsec != VKI_UTIME_NOW ++ && times[0].tv_nsec != VKI_UTIME_OMIT) ++ PRE_MEM_READ( "utimensat(times[0].tv_sec)", ++ (Addr)×[0].tv_sec, sizeof(times[0].tv_sec)); ++ if (times[1].tv_nsec != VKI_UTIME_NOW ++ && times[1].tv_nsec != VKI_UTIME_OMIT) ++ PRE_MEM_READ( "utimensat(times[1].tv_sec)", ++ (Addr)×[1].tv_sec, sizeof(times[1].tv_sec)); ++ } ++ } + } + + PRE(sys_newfstatat) +diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h +index 7072080..bf0c1aa 100644 +--- a/include/vki/vki-linux.h ++++ b/include/vki/vki-linux.h +@@ -283,6 +283,10 @@ struct vki_timespec { + long tv_nsec; /* nanoseconds */ + }; + ++/* Special values for vki_timespec.tv_nsec when used with utimensat. */ ++#define VKI_UTIME_NOW ((1l << 30) - 1l) ++#define VKI_UTIME_OMIT ((1l << 30) - 2l) ++ + struct vki_timeval { + vki_time_t tv_sec; /* seconds */ + vki_suseconds_t tv_usec; /* microseconds */ diff --git a/valgrind.spec b/valgrind.spec index ffba5e7..9046b6c 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -3,7 +3,7 @@ Summary: Tool for finding memory management bugs in programs Name: %{?scl_prefix}valgrind Version: 3.13.0 -Release: 27%{?dist} +Release: 28%{?dist} Epoch: 1 License: GPLv2+ URL: http://www.valgrind.org/ @@ -195,6 +195,9 @@ Patch25: valgrind-3.13.0-x86-arch_prctl.patch # bug fixes for xsmincdp, lxssp, stxssp and stxvl instructions. Patch26: valgrind-3.13.0-ppc64-xsmaxcdp.patch +# KDE#397354 utimensat should ignore tv_sec for UTIME_NOW or UTIME_OMIT. +Patch27: valgrind-3.13.0-utime.patch + %if %{build_multilib} # Ensure glibc{,-devel} is installed for both multilib arches BuildRequires: /lib/libc.so.6 /usr/lib/libc.so /lib64/libc.so.6 /usr/lib64/libc.so @@ -353,6 +356,7 @@ Valgrind User Manual for details. %patch24 -p1 %patch25 -p1 %patch26 -p1 +%patch27 -p1 %build CC=gcc @@ -587,6 +591,9 @@ fi %endif %changelog +* Fri Aug 10 2018 Mark Wielaard - 3.13.0-28 +- Add valgrind-3.13.0-utime.patch + * Fri Aug 3 2018 Mark Wielaard - 3.13.0-27 - Add valgrind-3.13.0-ppc64-xsmaxcdp.patch