Permalink
Browse files

Fix a major parenthesis bug in EVUTIL_UPCAST.

Fortunately, this didn't hurt anything previously, since we had no actual users of the macro where the offset of the base type wasn't 0.

svn:r1488
  • Loading branch information...
1 parent 5f1d6e6 commit 8283b2f0dcba87974db767e4838434896a92d402 Nick Mathewson committed Nov 2, 2009
Showing with 26 additions and 1 deletion.
  1. +25 −0 test/regress_util.c
  2. +1 −1 util-internal.h
View
@@ -465,6 +465,30 @@ test_evutil_strlcpy(void *arg)
;
}
+struct example_struct {
+ long a;
+ const char *b;
+ long c;
+};
+
+static void
+test_evutil_upcast(void *arg)
+{
+ struct example_struct es1;
+ const char **cp;
+ es1.a = 5;
+ es1.b = "Hello";
+ es1.c = -99;
+
+ tt_int_op(evutil_offsetof(struct example_struct, b), ==, sizeof(long));
+
+ cp = &es1.b;
+ tt_ptr_op(EVUTIL_UPCAST(cp, struct example_struct, b), ==, &es1);
+
+end:
+ ;
+
+}
struct testcase_t util_testcases[] = {
{ "ipv4_parse", regress_ipv4_parse, 0, NULL, NULL },
@@ -475,6 +499,7 @@ struct testcase_t util_testcases[] = {
{ "evutil_casecmp", test_evutil_casecmp, 0, NULL, NULL },
{ "strlcpy", test_evutil_strlcpy, 0, NULL, NULL },
{ "log", test_evutil_log, TT_FORK, NULL, NULL },
+ { "upcast", test_evutil_upcast, 0, NULL, NULL },
END_OF_TESTCASES,
};
View
@@ -130,7 +130,7 @@ extern const char EVUTIL_TOLOWER_TABLE[];
}
*/
#define EVUTIL_UPCAST(ptr, type, field) \
- ((type *)((char*)ptr) - evutil_offsetof(type, field))
+ ((type *)(((char*)(ptr)) - evutil_offsetof(type, field)))
int evutil_socket_connect(evutil_socket_t *fd_ptr, struct sockaddr *sa, int socklen);

0 comments on commit 8283b2f

Please sign in to comment.