Skip to content

Commit

Permalink
Fix race condition with appropriate mutex locking
Browse files Browse the repository at this point in the history
  • Loading branch information
nikias committed Aug 20, 2018
1 parent 0d53ab9 commit db44794
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/usbmux_remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,13 @@ void usbmux_remote_dispose(struct remote_mux *remote)
free(remote);
}

static void usbmux_remote_dispose_locked(struct remote_mux *remote)
{
pthread_mutex_lock(&remote_list_mutex);
usbmux_remote_dispose(remote);
pthread_mutex_unlock(&remote_list_mutex);
}

void usbmux_remote_notify_client_close(struct remote_mux *remote)
{
pthread_mutex_lock(&remote_list_mutex);
Expand Down Expand Up @@ -1142,7 +1149,7 @@ static void remote_process_recv(struct remote_mux *remote)
usbfluxd_log(LL_ERROR, "Receive from usbmux fd %d failed: %s", remote->fd, strerror(errno));
else
usbfluxd_log(LL_INFO, "usbmux %d connection closed", remote->fd);
usbmux_remote_dispose(remote);
usbmux_remote_dispose_locked(remote);
return;
}
remote->ib_size += res;
Expand All @@ -1153,12 +1160,12 @@ static void remote_process_recv(struct remote_mux *remote)
struct usbmuxd_header *hdr = (void*)remote->ib_buf;
if (hdr->length > remote->ib_capacity) {
usbfluxd_log(LL_INFO, "usbmux %d message is too long (%d bytes)", remote->fd, hdr->length);
usbmux_remote_dispose(remote);
usbmux_remote_dispose_locked(remote);
return;
}
if (hdr->length < sizeof(struct usbmuxd_header)) {
usbfluxd_log(LL_ERROR, "usbmux %d message is too short (%d bytes)", remote->fd, hdr->length);
usbmux_remote_dispose(remote);
usbmux_remote_dispose_locked(remote);
return;
}
if (remote->ib_size < hdr->length) {
Expand All @@ -1167,11 +1174,11 @@ static void remote_process_recv(struct remote_mux *remote)
res = recv(remote->fd, remote->ib_buf + remote->ib_size, hdr->length - remote->ib_size, 0);
if (res < 0) {
usbfluxd_log(LL_ERROR, "Receive from usbmux fd %d failed: %s", remote->fd, strerror(errno));
usbmux_remote_dispose(remote);
usbmux_remote_dispose_locked(remote);
return;
} else if(res == 0) {
usbfluxd_log(LL_INFO, "usbmux %d connection closed", remote->fd);
usbmux_remote_dispose(remote);
usbmux_remote_dispose_locked(remote);
return;
}
remote->ib_size += res;
Expand Down

0 comments on commit db44794

Please sign in to comment.