Handle IPC server allocation failures

master
Drew DeVault 8 years ago
parent 8cef81d6f2
commit 31b002b6d5

@ -106,7 +106,7 @@ void ipc_terminate(void) {
struct sockaddr_un *ipc_user_sockaddr(void) { struct sockaddr_un *ipc_user_sockaddr(void) {
struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un)); struct sockaddr_un *ipc_sockaddr = malloc(sizeof(struct sockaddr_un));
if (ipc_sockaddr == NULL) { if (ipc_sockaddr == NULL) {
sway_abort("can't malloc ipc_sockaddr"); sway_abort("Can't allocate ipc_sockaddr");
} }
ipc_sockaddr->sun_family = AF_UNIX; ipc_sockaddr->sun_family = AF_UNIX;
@ -119,7 +119,7 @@ struct sockaddr_un *ipc_user_sockaddr(void) {
} }
if (path_size <= snprintf(ipc_sockaddr->sun_path, path_size, if (path_size <= snprintf(ipc_sockaddr->sun_path, path_size,
"%s/sway-ipc.%i.%i.sock", dir, getuid(), getpid())) { "%s/sway-ipc.%i.%i.sock", dir, getuid(), getpid())) {
sway_abort("socket path won't fit into ipc_sockaddr->sun_path"); sway_abort("Socket path won't fit into ipc_sockaddr->sun_path");
} }
return ipc_sockaddr; return ipc_sockaddr;
@ -148,13 +148,13 @@ int ipc_handle_connection(int fd, uint32_t mask, void *data) {
int client_fd = accept(ipc_socket, NULL, NULL); int client_fd = accept(ipc_socket, NULL, NULL);
if (client_fd == -1) { if (client_fd == -1) {
sway_log_errno(L_INFO, "Unable to accept IPC client connection"); sway_log_errno(L_ERROR, "Unable to accept IPC client connection");
return 0; return 0;
} }
int flags; int flags;
if ((flags=fcntl(client_fd, F_GETFD)) == -1 || fcntl(client_fd, F_SETFD, flags|FD_CLOEXEC) == -1) { if ((flags=fcntl(client_fd, F_GETFD)) == -1 || fcntl(client_fd, F_SETFD, flags|FD_CLOEXEC) == -1) {
sway_log_errno(L_INFO, "Unable to set CLOEXEC on IPC client socket"); sway_log_errno(L_ERROR, "Unable to set CLOEXEC on IPC client socket");
close(client_fd); close(client_fd);
return 0; return 0;
} }
@ -171,6 +171,11 @@ int ipc_handle_connection(int fd, uint32_t mask, void *data) {
} }
struct ipc_client* client = malloc(sizeof(struct ipc_client)); struct ipc_client* client = malloc(sizeof(struct ipc_client));
if (!client) {
sway_log(L_ERROR, "Unable to allocate ipc client");
close(client_fd);
return 0;
}
client->payload_length = 0; client->payload_length = 0;
client->fd = client_fd; client->fd = client_fd;
client->subscribed_events = 0; client->subscribed_events = 0;
@ -187,7 +192,7 @@ int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data) {
struct ipc_client *client = data; struct ipc_client *client = data;
if (mask & WLC_EVENT_ERROR) { if (mask & WLC_EVENT_ERROR) {
sway_log(L_INFO, "IPC Client socket error, removing client"); sway_log(L_ERROR, "IPC Client socket error, removing client");
client->fd = -1; client->fd = -1;
ipc_client_disconnect(client); ipc_client_disconnect(client);
return 0; return 0;
@ -291,6 +296,12 @@ void ipc_get_pixels(wlc_handle output) {
char response_header[9]; char response_header[9];
memset(response_header, 0, sizeof(response_header)); memset(response_header, 0, sizeof(response_header));
char *data = malloc(sizeof(response_header) + size->w * size->h * 4); char *data = malloc(sizeof(response_header) + size->w * size->h * 4);
if (!data) {
sway_log(L_ERROR, "Unable to allocate pixels for get_pixels");
ipc_client_disconnect(client);
free(req);
continue;
}
wlc_pixels_read(WLC_RGBA8888, &req->geo, &g_out, data + sizeof(response_header)); wlc_pixels_read(WLC_RGBA8888, &req->geo, &g_out, data + sizeof(response_header));
response_header[0] = 1; response_header[0] = 1;
@ -318,7 +329,7 @@ void ipc_client_handle_command(struct ipc_client *client) {
char *buf = malloc(client->payload_length + 1); char *buf = malloc(client->payload_length + 1);
if (!buf) { if (!buf) {
sway_log_errno(L_INFO, "Out of memory"); sway_log_errno(L_INFO, "Unable to allocate IPC payload");
ipc_client_disconnect(client); ipc_client_disconnect(client);
return; return;
} }
@ -497,6 +508,10 @@ void ipc_client_handle_command(struct ipc_client *client) {
goto exit_cleanup; goto exit_cleanup;
} }
struct get_pixels_request *req = malloc(sizeof(struct get_pixels_request)); struct get_pixels_request *req = malloc(sizeof(struct get_pixels_request));
if (!req) {
sway_log(L_ERROR, "Unable to allocate get_pixels request");
goto exit_cleanup;
}
req->client = client; req->client = client;
req->output = output->handle; req->output = output->handle;
req->geo = g; req->geo = g;

Loading…
Cancel
Save