]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug #359503 continued. adjtimex syscall missing on arm64.
authorMark Wielaard <mark@klomp.org>
Wed, 14 Sep 2016 11:47:26 +0000 (11:47 +0000)
committerMark Wielaard <mark@klomp.org>
Wed, 14 Sep 2016 11:47:26 +0000 (11:47 +0000)
Enable adjtimex syscall on arm64 and fix bug if argument is a bad pointer.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15953

coregrind/m_syswrap/syswrap-arm64-linux.c
coregrind/m_syswrap/syswrap-linux.c

index ab167f6e99c869c068c8705813bd174989f518a7..00b013819a983bd9136380e503cd2ce9109869f2 100644 (file)
@@ -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
index 3523817ede79b7eca476b03c003e69625c8d392b..36fadbba8c04ea62aeb8fe629d8e896ed4568390 100644 (file)
@@ -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));
 }