Skip to content

Commit

Permalink
Merge pull request #109 from opentechinstitute/bad-free
Browse files Browse the repository at this point in the history
better memory safety in dispatcher_cb
  • Loading branch information
jheretic committed Aug 18, 2014
2 parents 17459f1 + 14339de commit 346c0e1
Showing 1 changed file with 16 additions and 16 deletions.
32 changes: 16 additions & 16 deletions src/daemon.c
Expand Up @@ -713,54 +713,54 @@ int dispatcher_cb(co_obj_t *self, co_obj_t *fd) {
char respbuf[RESPONSE_MAX];
memset(respbuf, '\0', sizeof(respbuf));
size_t resplen = 0;
co_obj_t *request = NULL;
co_obj_t *request = NULL, *response = NULL;
uint8_t *type = NULL;
uint32_t *id = NULL;
int ret = 0;
co_obj_t *nil = co_nil_create(0);
CHECK_MEM(nil);

/* Incoming message on socket */
reqlen = sock->receive((co_obj_t*)sock, fd, reqbuf, sizeof(reqbuf));
DEBUG("Received %d bytes.", (int)reqlen);
if(reqlen == 0) {
INFO("Received connection.");
co_obj_free(nil);
return 1;
}
if (reqlen < 0) {
INFO("Connection recvd() -1");
sock->hangup((co_obj_t*)sock, fd);
co_obj_free(nil);
return 1;
}
/* If it's a commotion message type, parse the header, target and payload */
CHECK(co_list_import(&request, reqbuf, reqlen) > 0, "Failed to import request.");
co_obj_data((char **)&type, co_list_element(request, 0));
CHECK(*type == 0, "Not a valid request.");
CHECK(co_obj_data((char **)&id, co_list_element(request, 1)) == sizeof(uint32_t), "Not a valid request ID.");
co_obj_t *ret = NULL;
if(co_cmd_exec(co_list_element(request, 2), &ret, co_list_element(request, 3)))
if(co_cmd_exec(co_list_element(request, 2), &response, co_list_element(request, 3)))
{
resplen = co_response_alloc(respbuf, sizeof(respbuf), *id, nil, ret);
resplen = co_response_alloc(respbuf, sizeof(respbuf), *id, nil, response);
sock->send(fd, respbuf, resplen);
}
else
{
if(ret == NULL)
if(response == NULL)
{
ret = co_tree16_create();
co_tree_insert(ret, "error", sizeof("error"), co_str8_create("Incorrect command.", sizeof("Incorrect command."), 0));
response = co_tree16_create();
co_tree_insert(response, "error", sizeof("error"), co_str8_create("Incorrect command.", sizeof("Incorrect command."), 0));
}
resplen = co_response_alloc(respbuf, sizeof(respbuf), *id, ret, nil);
resplen = co_response_alloc(respbuf, sizeof(respbuf), *id, response, nil);
sock->send(fd, respbuf, resplen);
}

co_obj_free(nil);
co_obj_free(request);
co_obj_free(ret);
return 1;
ret = 1;
error:
co_obj_free(nil);
co_obj_free(request);
co_obj_free(ret);
return 1;
if (nil) co_obj_free(nil);
if (request) co_obj_free(request);
if (response) co_obj_free(response);
return ret;
}

/**
Expand Down

0 comments on commit 346c0e1

Please sign in to comment.