]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Handle adjtimex being called in adjtime mode correctly. Closes #219538.
authorTom Hughes <tom@compton.nu>
Mon, 21 Dec 2009 11:29:54 +0000 (11:29 +0000)
committerTom Hughes <tom@compton.nu>
Mon, 21 Dec 2009 11:29:54 +0000 (11:29 +0000)
Validate the constant field with ADJ_TAI is used in an adjtimex call.

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

coregrind/m_syswrap/syswrap-linux.c
include/vki/vki-linux.h

index c8c44aab64e3c0ec0353610d844275dd39b9d3c7..a8ef616e6a680bc8ec37e21f6093b173865b63c5 100644 (file)
@@ -623,18 +623,23 @@ PRE(sys_adjtimex)
    PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
    PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
 
-#define ADJX(bit,field)                                \
-   if (tx->modes & bit)                                        \
+#define ADJX(bits,field)                               \
+   if (tx->modes & (bits))                              \
       PRE_MEM_READ( "adjtimex(timex->"#field")",       \
                    (Addr)&tx->field, sizeof(tx->field))
 
-   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, 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));
index 073227152f884987d07dc4c06760504350c120ce..c906a39b3f519a2db9accb6fd3bafd8b727d0877 100644 (file)
@@ -283,8 +283,11 @@ struct vki_timex {
 #define VKI_ADJ_ESTERROR               0x0008  /* estimated time error */
 #define VKI_ADJ_STATUS                 0x0010  /* clock status */
 #define VKI_ADJ_TIMECONST              0x0020  /* pll time constant */
+#define VKI_ADJ_TAI                    0x0080  /* set TAI offset */
 #define VKI_ADJ_TICK                   0x4000  /* tick value */
+#define VKI_ADJ_ADJTIME                        0x8000  /* switch between adjtime/adjtimex modes */
 //#define VKI_ADJ_OFFSET_SINGLESHOT    0x8001  /* old-fashioned adjtime */
+#define VKI_ADJ_OFFSET_READONLY                0x2000  /* read-only adjtime */
 
 //----------------------------------------------------------------------
 // From linux-2.6.8.1/include/linux/times.h