|
From: <sv...@va...> - 2016-09-14 11:47:34
|
Author: mjw
Date: Wed Sep 14 12:47:26 2016
New Revision: 15953
Log:
Bug #359503 continued. adjtimex syscall missing on arm64.
Enable adjtimex syscall on arm64 and fix bug if argument is a bad pointer.
Modified:
trunk/coregrind/m_syswrap/syswrap-arm64-linux.c
trunk/coregrind/m_syswrap/syswrap-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-arm64-linux.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-arm64-linux.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-arm64-linux.c Wed Sep 14 12:47:26 2016
@@ -1023,7 +1023,7 @@
GENXY(__NR_gettimeofday, sys_gettimeofday), // 169
GENX_(__NR_settimeofday, sys_settimeofday), // 170
-
+ LINXY(__NR_adjtimex, sys_adjtimex), // 171
GENX_(__NR_getpid, sys_getpid), // 172
GENX_(__NR_getppid, sys_getppid), // 173
GENX_(__NR_getuid, sys_getuid), // 174
@@ -1225,7 +1225,6 @@
//ZZ
//ZZ //zz // (__NR_setdomainname, sys_setdomainname), // 121 */*(?)
//ZZ // PLAX_(__NR_modify_ldt, sys_modify_ldt), // 123
-//ZZ //zz LINXY(__NR_adjtimex, sys_adjtimex), // 124
//ZZ //zz
//ZZ LINXY(__NR_sigprocmask, sys_sigprocmask), // 126
//ZZ //zz // Nb: create_module() was removed 2.4-->2.6
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c Wed Sep 14 12:47:26 2016
@@ -808,26 +808,29 @@
struct vki_timex *tx = (struct vki_timex *)ARG1;
PRINT("sys_adjtimex ( %#lx )", ARG1);
PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
- PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
-#define ADJX(bits,field) \
- if (tx->modes & (bits)) \
- PRE_MEM_READ( "adjtimex(timex->"#field")", \
- (Addr)&tx->field, sizeof(tx->field))
+ if (ML_(safe_to_deref) (tx, sizeof(struct vki_timex))) {
+ PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
- if (tx->modes & VKI_ADJ_ADJTIME) {
- if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
- PRE_MEM_READ( "adjtimex(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
- } else {
- ADJX(VKI_ADJ_OFFSET, offset);
- ADJX(VKI_ADJ_FREQUENCY, freq);
- ADJX(VKI_ADJ_MAXERROR, maxerror);
- ADJX(VKI_ADJ_ESTERROR, esterror);
- ADJX(VKI_ADJ_STATUS, status);
- ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
- ADJX(VKI_ADJ_TICK, tick);
- }
+#define ADJX(bits,field) \
+ if (tx->modes & (bits)) \
+ PRE_MEM_READ( "adjtimex(timex->"#field")", \
+ (Addr)&tx->field, sizeof(tx->field))
+
+ if (tx->modes & VKI_ADJ_ADJTIME) {
+ if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
+ PRE_MEM_READ( "adjtimex(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
+ } else {
+ ADJX(VKI_ADJ_OFFSET, offset);
+ ADJX(VKI_ADJ_FREQUENCY, freq);
+ ADJX(VKI_ADJ_MAXERROR, maxerror);
+ ADJX(VKI_ADJ_ESTERROR, esterror);
+ ADJX(VKI_ADJ_STATUS, status);
+ ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
+ ADJX(VKI_ADJ_TICK, tick);
+ }
#undef ADJX
+ }
PRE_MEM_WRITE( "adjtimex(timex)", ARG1, sizeof(struct vki_timex));
}
|