summaryrefslogtreecommitdiff
path: root/interface.h
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2015-03-02 13:46:29 -0800
committerGuy Harris <guy@alum.mit.edu>2015-03-02 13:46:29 -0800
commitbc183f0882ee2080e5888a428e5b0823380fc18a (patch)
tree71de04e13ab0152b73fa44e619d8a8d07e803932 /interface.h
parent09b639add17c21a1cce31a1c48a3b95198e0c15b (diff)
downloadtcpdump-bc183f0882ee2080e5888a428e5b0823380fc18a.tar.gz
Fix the pointer tests in the non-ndoified TTEST2() macro as well.
Diffstat (limited to 'interface.h')
-rw-r--r--interface.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/interface.h b/interface.h
index 33ddb776..59c1eefd 100644
--- a/interface.h
+++ b/interface.h
@@ -104,9 +104,21 @@ extern int32_t thiszone; /* seconds offset from gmt to local time */
* that "snapend - (l)" underflows.
*
* The check is for <= rather than < because "l" might be 0.
+ *
+ * We cast the pointers to uintptr_t to make sure that the compiler
+ * doesn't optimize away any of these tests (which it is allowed to
+ * do, as adding an integer to, or subtracting an integer from, a
+ * pointer assumes that the pointer is a pointer to an element of an
+ * array and that the result of the addition or subtraction yields a
+ * pointer to another member of the array, so that, for example, if
+ * you subtract a positive integer from a pointer, the result is
+ * guaranteed to be less than the original pointer value). See
+ *
+ * http://www.kb.cert.org/vuls/id/162289
*/
-#define TTEST2(var, l) (snapend - (l) <= snapend && \
- (const u_char *)&(var) <= snapend - (l))
+#define TTEST2(var, l) \
+ ((uintptr_t)snapend - (l) <= (uintptr_t)snapend && \
+ (uintptr_t)&(var) <= (uintptr_t)snapend - (l))
/* True if "var" was captured */
#define TTEST(var) TTEST2(var, sizeof(var))