From f1ce15d936ea6f0b68ebc21cff169dfd1da2e1c1 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 25 Jul 2012 16:18:33 -0400 Subject: [PATCH 1/5] Set umask before calling mkstemp in unit tests. Found by coverity --- configure.in | 2 ++ test/regress_main.c | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/configure.in b/configure.in index 27cb7ada..70dc29cd 100644 --- a/configure.in +++ b/configure.in @@ -185,6 +185,7 @@ fi dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h stdarg.h inttypes.h stdint.h stddef.h poll.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h sys/param.h sys/ioctl.h sys/select.h sys/devpoll.h port.h netinet/in.h netinet/in6.h sys/socket.h sys/uio.h arpa/inet.h sys/eventfd.h sys/mman.h sys/sendfile.h sys/wait.h netdb.h]) +AC_CHECK_HEADERS([sys/stat.h]) AC_CHECK_HEADERS(sys/sysctl.h, [], [], [ #ifdef HAVE_SYS_PARAM_H #include @@ -284,6 +285,7 @@ AC_HEADER_TIME dnl Checks for library functions. AC_CHECK_FUNCS([gettimeofday vasprintf fcntl clock_gettime strtok_r strsep]) AC_CHECK_FUNCS([getnameinfo strlcpy inet_ntop inet_pton signal sigaction strtoll inet_aton pipe eventfd sendfile mmap splice arc4random arc4random_buf issetugid geteuid getegid getprotobynumber setenv unsetenv putenv sysctl]) +AC_CHECK_FUNCS([umask]) AC_CACHE_CHECK( [for getaddrinfo], diff --git a/test/regress_main.c b/test/regress_main.c index 32557c1e..bbac2b41 100644 --- a/test/regress_main.c +++ b/test/regress_main.c @@ -58,6 +58,9 @@ #endif #include +#ifdef _EVENT_HAVE_SYS_STAT_H +#include +#endif #ifndef WIN32 #include @@ -123,6 +126,9 @@ regress_make_tmpfile(const void *data, size_t datalen) char tmpfilename[32]; int fd; strcpy(tmpfilename, "/tmp/eventtmp.XXXXXX"); +#ifdef _EVENT_HAVE_UMASK + umask(0077); +#endif fd = mkstemp(tmpfilename); if (fd == -1) return (-1); From 4f3732d75eb148f93efae797511213e92467f7a2 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 26 Jul 2012 09:35:43 -0400 Subject: [PATCH 2/5] Fix various check-after-dereference issues in unit tests: found by coverity --- test/regress.c | 4 ++++ test/regress_buffer.c | 11 +++++++++++ test/regress_dns.c | 14 +++++++++----- test/regress_et.c | 2 ++ test/regress_http.c | 8 ++++++-- test/regress_rpc.c | 3 +++ 6 files changed, 35 insertions(+), 7 deletions(-) diff --git a/test/regress.c b/test/regress.c index 65921420..bd294845 100644 --- a/test/regress.c +++ b/test/regress.c @@ -2155,6 +2155,10 @@ test_event_pending(void *ptr) NULL); t = evtimer_new(data->base, timeout_cb, NULL); + tt_assert(r); + tt_assert(w); + tt_assert(t); + evutil_gettimeofday(&now, NULL); event_add(r, NULL); event_add(t, &tv); diff --git a/test/regress_buffer.c b/test/regress_buffer.c index 6a2b6fcc..99a8c0ea 100644 --- a/test/regress_buffer.c +++ b/test/regress_buffer.c @@ -1033,6 +1033,8 @@ test_evbuffer_find(void *ptr) unsigned int i; struct evbuffer * buf = evbuffer_new(); + tt_assert(buf); + /* make sure evbuffer_find doesn't match past the end of the buffer */ evbuffer_add(buf, (u_char*)test1, strlen(test1)); evbuffer_validate(buf); @@ -1074,6 +1076,8 @@ test_evbuffer_ptr_set(void *ptr) struct evbuffer_ptr pos; struct evbuffer_iovec v[1]; + tt_assert(buf); + /* create some chains */ evbuffer_reserve_space(buf, 5000, v, 1); v[0].iov_len = 5000; @@ -1121,6 +1125,9 @@ test_evbuffer_search(void *ptr) struct evbuffer *tmp = evbuffer_new(); struct evbuffer_ptr pos, end; + tt_assert(buf); + tt_assert(tmp); + /* set up our chains */ evbuffer_add_printf(tmp, "hello"); /* 5 chars */ evbuffer_add_buffer(buf, tmp); @@ -1200,6 +1207,10 @@ test_evbuffer_callbacks(void *ptr) struct evbuffer *buf_out2 = evbuffer_new(); struct evbuffer_cb_entry *cb1, *cb2; + tt_assert(buf); + tt_assert(buf_out1); + tt_assert(buf_out2); + cb1 = evbuffer_add_cb(buf, log_change_callback, buf_out1); cb2 = evbuffer_add_cb(buf, log_change_callback, buf_out2); diff --git a/test/regress_dns.c b/test/regress_dns.c index b34fb96c..557a63d6 100644 --- a/test/regress_dns.c +++ b/test/regress_dns.c @@ -1066,6 +1066,7 @@ test_bufferevent_connect_hostname(void *arg) &n_accept, LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_EXEC, -1, (struct sockaddr *)&sin, sizeof(sin)); + tt_assert(listener); listener_port = regress_get_socket_port( evconnlistener_get_fd(listener)); @@ -1211,6 +1212,7 @@ test_getaddrinfo_async(void *arg) int n_dns_questions = 0; struct evdns_base *dns_base = evdns_base_new(data->base, 0); + tt_assert(dns_base); /* for localhost */ evdns_base_load_hosts(dns_base, NULL); @@ -1705,6 +1707,7 @@ testleak_cleanup(const struct testcase_t *testcase, void *env_) { int ok = 0; struct testleak_env_t *env = env_; + tt_assert(env); #ifdef _EVENT_DISABLE_DEBUG_MODE tt_int_op(allocated_chunks, ==, 0); #else @@ -1713,12 +1716,13 @@ testleak_cleanup(const struct testcase_t *testcase, void *env_) #endif ok = 1; end: - if (env->dns_base) - evdns_base_free(env->dns_base, 0); - if (env->base) - event_base_free(env->base); - if (env) + if (env) { + if (env->dns_base) + evdns_base_free(env->dns_base, 0); + if (env->base) + event_base_free(env->base); free(env); + } return ok; } diff --git a/test/regress_et.c b/test/regress_et.c index dee7b936..54ee9326 100644 --- a/test/regress_et.c +++ b/test/regress_et.c @@ -173,7 +173,9 @@ test_edgetriggered_mix_error(void *data_) /* try mixing edge-triggered and level-triggered to make sure it fails*/ ev_et = event_new(base, data->pair[0], EV_READ|EV_ET, read_cb, ev_et); + tt_assert(ev_et); ev_lt = event_new(base, data->pair[0], EV_READ, read_cb, ev_lt); + tt_assert(ev_lt); /* Add edge-triggered, then level-triggered. Get an error. */ tt_int_op(0, ==, event_add(ev_et, NULL)); diff --git a/test/regress_http.c b/test/regress_http.c index f30b2e36..a8b21ce2 100644 --- a/test/regress_http.c +++ b/test/regress_http.c @@ -3213,26 +3213,30 @@ static void http_primitives(void *ptr) { char *escaped = NULL; - struct evhttp *http; + struct evhttp *http = NULL; escaped = evhttp_htmlescape("