Handle malloc failure in ipc_recv_response

This commit is contained in:
Drew DeVault 2016-12-15 17:05:12 -05:00
parent 6c0fc20936
commit 9ad1e6b40f
3 changed files with 24 additions and 3 deletions

View file

@ -52,10 +52,18 @@ struct ipc_response *ipc_recv_response(int socketfd) {
} }
struct ipc_response *response = malloc(sizeof(struct ipc_response)); struct ipc_response *response = malloc(sizeof(struct ipc_response));
if (!response) {
goto error_1;
}
total = 0; total = 0;
response->size = data32[0]; response->size = data32[0];
response->type = data32[1]; response->type = data32[1];
char *payload = malloc(response->size + 1); char *payload = malloc(response->size + 1);
if (!payload) {
goto error_2;
}
while (total < response->size) { while (total < response->size) {
ssize_t received = recv(socketfd, payload + total, response->size - total, 0); ssize_t received = recv(socketfd, payload + total, response->size - total, 0);
if (received < 0) { if (received < 0) {
@ -67,6 +75,11 @@ struct ipc_response *ipc_recv_response(int socketfd) {
response->payload = payload; response->payload = payload;
return response; return response;
error_2:
free(response);
error_1:
sway_log(L_ERROR, "Unable to allocate memory for IPC response");
return NULL;
} }
void free_ipc_response(struct ipc_response *response) { void free_ipc_response(struct ipc_response *response) {

View file

@ -88,9 +88,14 @@ void _sway_log(const char *filename, int line, log_importance_t verbosity, const
} }
if (filename && line) { if (filename && line) {
char *file = strdup(filename); const char *file = filename + strlen(filename);
fprintf(stderr, "[%s:%d] ", basename(file), line); while (file != filename && *file != '/') {
free(file); --file;
}
if (*file == '/') {
++file;
}
fprintf(stderr, "[%s:%d] ", file, line);
} }
va_list args; va_list args;

View file

@ -331,6 +331,9 @@ void ipc_bar_init(struct bar *bar, const char *bar_id) {
bool handle_ipc_event(struct bar *bar) { bool handle_ipc_event(struct bar *bar) {
struct ipc_response *resp = ipc_recv_response(bar->ipc_event_socketfd); struct ipc_response *resp = ipc_recv_response(bar->ipc_event_socketfd);
if (!resp) {
return false;
}
switch (resp->type) { switch (resp->type) {
case IPC_EVENT_WORKSPACE: case IPC_EVENT_WORKSPACE:
ipc_update_workspaces(bar); ipc_update_workspaces(bar);