summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzat Khuzhin <a3at.mail@gmail.com>2018-09-14 02:24:44 +0300
committerAzat Khuzhin <a3at.mail@gmail.com>2018-09-14 02:27:13 +0300
commit8483c5351abdd18766232de8431290165717bd57 (patch)
tree4874b7536d6647c528b997fa539ddcb3828c6ba3
parent7af974eeaa7e5cf2f73e3176782c5a788a74f08e (diff)
downloadlibevent-8483c5351abdd18766232de8431290165717bd57.tar.gz
evrpc: avoid NULL dereference on request is not EVHTTP_REQ_POST
Fixes: #660
-rw-r--r--evrpc.c3
-rw-r--r--test/regress_rpc.c48
2 files changed, 50 insertions, 1 deletions
diff --git a/evrpc.c b/evrpc.c
index 2443ab27..68fa1b90 100644
--- a/evrpc.c
+++ b/evrpc.c
@@ -329,7 +329,8 @@ evrpc_request_cb(struct evhttp_request *req, void *arg)
return;
error:
- evrpc_reqstate_free_(rpc_state);
+ if (rpc_state)
+ evrpc_reqstate_free_(rpc_state);
evhttp_send_error(req, HTTP_SERVUNAVAIL, NULL);
return;
}
diff --git a/test/regress_rpc.c b/test/regress_rpc.c
index 2cb2bcd9..87a7efa1 100644
--- a/test/regress_rpc.c
+++ b/test/regress_rpc.c
@@ -879,6 +879,53 @@ end:
evbuffer_free(tmp);
}
+static void
+rpc_invalid_type(void)
+{
+ ev_uint16_t port;
+ struct evhttp *http = NULL;
+ struct evrpc_base *base = NULL;
+ struct evhttp_connection *evcon = NULL;
+ struct evhttp_request *req = NULL;
+
+ rpc_setup(&http, &port, &base);
+
+ evcon = evhttp_connection_new("127.0.0.1", port);
+ tt_assert(evcon);
+
+ /*
+ * At this point, we want to schedule an HTTP POST request
+ * server using our make request method.
+ */
+
+ req = evhttp_request_new(rpc_postrequest_failure, NULL);
+ tt_assert(req);
+
+ /* Add the information that we care about */
+ evhttp_add_header(req->output_headers, "Host", "somehost");
+ evbuffer_add_printf(req->output_buffer, "Some Nonsense");
+
+ if (evhttp_make_request(evcon, req,
+ EVHTTP_REQ_GET,
+ "/.rpc.Message") == -1) {
+ tt_abort();
+ }
+
+ test_ok = 0;
+
+ event_dispatch();
+
+ evhttp_connection_free(evcon);
+
+ rpc_teardown(base);
+
+ tt_assert(test_ok == 1);
+
+end:
+ evhttp_free(http);
+}
+
+
#define RPC_LEGACY(name) \
{ #name, run_legacy_test_fn, TT_FORK|TT_NEED_BASE|TT_LEGACY, \
&legacy_setup, \
@@ -897,6 +944,7 @@ struct testcase_t rpc_testcases[] = {
RPC_LEGACY(basic_client),
RPC_LEGACY(basic_queued_client),
RPC_LEGACY(basic_client_with_pause),
+ RPC_LEGACY(invalid_type),
RPC_LEGACY(client_timeout),
RPC_LEGACY(test),