From: Mark Wielaard Date: Wed, 14 Sep 2016 11:47:26 +0000 (+0000) Subject: Bug #359503 continued. adjtimex syscall missing on arm64. X-Git-Tag: svn/VALGRIND_3_12_0~70 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=219f3152bcc21faac20973912194031037bb29ab;p=thirdparty%2Fvalgrind.git Bug #359503 continued. adjtimex syscall missing on arm64. Enable adjtimex syscall on arm64 and fix bug if argument is a bad pointer. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15953 --- diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index ab167f6e99..00b013819a 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -1023,7 +1023,7 @@ static SyscallTableEntry syscall_main_table[] = { 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 @@ static SyscallTableEntry syscall_main_table[] = { //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 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 3523817ede..36fadbba8c 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -808,26 +808,29 @@ PRE(sys_adjtimex) 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)); + + if (ML_(safe_to_deref) (tx, sizeof(struct vki_timex))) { + 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 (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); - } + 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)); }