From: Nick Mathewson Date: Mon, 2 Nov 2009 19:30:25 +0000 (+0000) Subject: Fix a major parenthesis bug in EVUTIL_UPCAST. X-Git-Tag: release-2.0.3-alpha~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8283b2f0dcba87974db767e4838434896a92d402;p=libevent 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 --- diff --git a/test/regress_util.c b/test/regress_util.c index 52a43913..0ca2b067 100644 --- a/test/regress_util.c +++ b/test/regress_util.c @@ -465,6 +465,30 @@ end: ; } +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, }; diff --git a/util-internal.h b/util-internal.h index 853f2200..dc112116 100644 --- a/util-internal.h +++ b/util-internal.h @@ -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);