diff --git a/bufferevent_sock.c b/bufferevent_sock.c index 53a1fc70..aa3cadfc 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -114,8 +114,9 @@ bufferevent_socket_outbuf_cb(struct evbuffer *buf, !bufev_p->write_suspended) { /* Somebody added data to the buffer, and we would like to * write, and we were not writing. So, start writing. */ - be_socket_add(&bufev->ev_write, &bufev->timeout_write); - /* XXXX handle failure from be_socket_add */ + if (be_socket_add(&bufev->ev_write, &bufev->timeout_write) == -1) { + // Should we log this? + } } } diff --git a/evrpc.c b/evrpc.c index 4ad1be0a..3fe306f4 100644 --- a/evrpc.c +++ b/evrpc.c @@ -339,8 +339,12 @@ static void evrpc_request_cb_closure(void *arg, enum EVRPC_HOOK_RESULT hook_res) { struct evrpc_req_generic *rpc_state = arg; - struct evrpc *rpc = rpc_state->rpc; - struct evhttp_request *req = rpc_state->http_req; + struct evrpc *rpc; + struct evhttp_request *req; + + EVUTIL_ASSERT(rpc_state); + rpc = rpc_state->rpc; + req = rpc_state->http_req; if (hook_res == EVRPC_TERMINATE) goto error; @@ -400,8 +404,13 @@ evrpc_request_done_closure(void *, enum EVRPC_HOOK_RESULT); void evrpc_request_done(struct evrpc_req_generic *rpc_state) { - struct evhttp_request *req = rpc_state->http_req; - struct evrpc *rpc = rpc_state->rpc; + struct evhttp_request *req; + struct evrpc *rpc; + + EVUTIL_ASSERT(rpc_state); + + req = rpc_state->http_req; + rpc = rpc_state->rpc; if (rpc->reply_complete(rpc_state->reply) == -1) { /* the reply was not completely filled in. error out */ @@ -467,7 +476,9 @@ static void evrpc_request_done_closure(void *arg, enum EVRPC_HOOK_RESULT hook_res) { struct evrpc_req_generic *rpc_state = arg; - struct evhttp_request *req = rpc_state->http_req; + struct evhttp_request *req; + EVUTIL_ASSERT(rpc_state); + req = rpc_state->http_req; if (hook_res == EVRPC_TERMINATE) goto error; diff --git a/evutil.c b/evutil.c index a8dfb4c3..4f1c8594 100644 --- a/evutil.c +++ b/evutil.c @@ -459,9 +459,9 @@ evutil_socket_connect(evutil_socket_t *fd_ptr, struct sockaddr *sa, int socklen) int made_fd = 0; if (*fd_ptr < 0) { - made_fd = 1; if ((*fd_ptr = socket(sa->sa_family, SOCK_STREAM, 0)) < 0) goto err; + made_fd = 1; if (evutil_make_socket_nonblocking(*fd_ptr) < 0) { goto err; } diff --git a/sample/dns-example.c b/sample/dns-example.c index 33a49cc7..d8134e83 100644 --- a/sample/dns-example.c +++ b/sample/dns-example.c @@ -173,6 +173,10 @@ main(int c, char **v) { evutil_socket_t sock; struct sockaddr_in my_addr; sock = socket(PF_INET, SOCK_DGRAM, 0); + if (sock == -1) { + perror("socket"); + exit(1); + } evutil_make_socket_nonblocking(sock); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(10053); diff --git a/sample/http-server.c b/sample/http-server.c index 2b2242bb..5196fff1 100644 --- a/sample/http-server.c +++ b/sample/http-server.c @@ -133,7 +133,8 @@ dump_request_cb(struct evhttp_request *req, void *arg) int n; char cbuf[128]; n = evbuffer_remove(buf, cbuf, sizeof(buf)-1); - fwrite(cbuf, 1, n, stdout); + if (n > 0) + fwrite(cbuf, 1, n, stdout); } puts(">>>"); @@ -179,6 +180,8 @@ send_document_cb(struct evhttp_request *req, void *arg) /* We need to decode it, to see what path the user really wanted. */ decoded_path = evhttp_uridecode(path, 0, NULL); + if (decoded_path == NULL) + goto err; /* Don't allow any ".."s in the path, to avoid exposing stuff outside * of the docroot. This test is both overzealous and underzealous: * it forbids aceptable paths like "/this/one..here", but it doesn't diff --git a/test/bench_http.c b/test/bench_http.c index 1ec6ad50..a6aa4b7f 100644 --- a/test/bench_http.c +++ b/test/bench_http.c @@ -91,6 +91,7 @@ main(int argc, char **argv) int c; int use_iocp = 0; unsigned short port = 8080; + char *endptr = NULL; #ifdef _WIN32 WSADATA WSAData; @@ -113,11 +114,23 @@ main(int argc, char **argv) switch (c) { case 'p': - port = atoi(argv[i+1]); + if (i+1 >= argc || !argv[i+1]) { + fprintf(stderr, "Missing port\n"); + exit(1); + } + port = (int)strtol(argv[i+1], &endptr, 10); + if (*endptr != '\0') { + fprintf(stderr, "Bad port\n"); + exit(1); + } break; case 'l': - content_len = atol(argv[i+1]); - if (content_len == 0) { + if (i+1 >= argc || !argv[i+1]) { + fprintf(stderr, "Missing content length\n"); + exit(1); + } + content_len = (size_t)strtol(argv[i+1], &endptr, 10); + if (*endptr != '\0' || content_len == 0) { fprintf(stderr, "Bad content length\n"); exit(1); }