summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2009-04-13 14:22:24 +0200
committerGravatar Nikias Bassen2009-04-13 14:22:24 +0200
commit9932dadfc7ddc65ccb3d2988df1a6dcc9cf536c5 (patch)
tree5e36527dc25154182889bd42bada7590f54a9c9d
parentd6e0cb81973e99aa61c4b36e3e4a4dcd475c1e59 (diff)
downloadusbmuxd-9932dadfc7ddc65ccb3d2988df1a6dcc9cf536c5.tar.gz
usbmuxd-9932dadfc7ddc65ccb3d2988df1a6dcc9cf536c5.tar.bz2
This _should_ fix a race condition that happens when a client is about
to cleanup the stuff that is used by another client that is about to set up a new connection. Increased timeout in sock_stuff from 10 to 20 seconds and decreased the pullbulk recv timeout from 5 to 3 seconds.
-rw-r--r--iphone.c2
-rw-r--r--main.c11
-rw-r--r--sock_stuff.c4
3 files changed, 8 insertions, 9 deletions
diff --git a/iphone.c b/iphone.c
index 6be85e6..662432b 100644
--- a/iphone.c
+++ b/iphone.c
@@ -1086,7 +1086,7 @@ int iphone_mux_pullbulk(iphone_device_t phone)
// start the cursor off just ahead of the leftover.
char* cursor = &phone->usbReceive.buffer[phone->usbReceive.leftover];
// pull in content, note that the amount we can pull is capacity minus leftover
- int readlen = recv_from_phone_timeout(phone, cursor, phone->usbReceive.capacity - phone->usbReceive.leftover, 5000);
+ int readlen = recv_from_phone_timeout(phone, cursor, phone->usbReceive.capacity - phone->usbReceive.leftover, 3000);
if (readlen < 0) {
res = readlen;
//fprintf(stderr, "recv_from_phone_timeout gave us an error.\n");
diff --git a/main.c b/main.c
index 87104d3..eba154e 100644
--- a/main.c
+++ b/main.c
@@ -605,11 +605,11 @@ connect:
if (verbose >= 3) fprintf(stderr, "%s: Setting up connection to usb device #%d on port %d\n", __func__, c_req->device_id, ntohs(c_req->tcp_dport));
// find the device, and open usb connection
+ pthread_mutex_lock(&usbmux_mutex);
phone = NULL;
cur_dev = NULL;
// first check if we already have an open connection
if (devices) {
- pthread_mutex_lock(&usbmux_mutex);
for (i = 0; i < device_count; i++) {
if (devices[i]) {
if (devices[i]->device_id == c_req->device_id) {
@@ -620,7 +620,6 @@ connect:
}
}
}
- pthread_mutex_unlock(&usbmux_mutex);
}
if (!phone) {
// if not found, make a new connection
@@ -629,6 +628,7 @@ connect:
pthread_mutex_lock(&usb_mutex);
if (iphone_get_specific_device(0, c_req->device_id, &phone) != IPHONE_E_SUCCESS) {
pthread_mutex_unlock(&usb_mutex);
+ pthread_mutex_unlock(&usbmux_mutex);
if (verbose >= 1) fprintf(stderr, "%s: device_id %d could not be opened\n", __func__, c_req->device_id);
usbmuxd_send_result(cdata->socket, c_req->header.tag, ENODEV);
goto leave;
@@ -636,7 +636,6 @@ connect:
pthread_mutex_unlock(&usb_mutex);
// create device object
- pthread_mutex_lock(&usbmux_mutex);
if (verbose >= 3) fprintf(stderr, "%s: add to device list\n", __func__);
cur_dev = (struct device_info*)malloc(sizeof(struct device_info));
memset(cur_dev, 0, sizeof(struct device_info));
@@ -655,10 +654,10 @@ connect:
devices[device_count] = cur_dev;
device_count++;
}
- pthread_mutex_unlock(&usbmux_mutex);
} else {
if (verbose >= 3) fprintf(stderr, "%s: reusing usb connection, device_id=%d\n", __func__, c_req->device_id);
}
+ pthread_mutex_unlock(&usbmux_mutex);
// setup connection to iPhone/iPod
// pthread_mutex_lock(&usbmux_mutex);
@@ -712,6 +711,7 @@ leave:
// this has to be freed only if it's not in use anymore as it closes
// the USB connection
+ pthread_mutex_lock(&usbmux_mutex);
if (cur_dev) {
pthread_mutex_lock(&cur_dev->mutex);
if (cur_dev->use_count > 1) {
@@ -733,7 +733,6 @@ leave:
pthread_mutex_destroy(&cur_dev->mutex);
free(cur_dev);
cur_dev = NULL;
- pthread_mutex_lock(&usbmux_mutex);
if (device_count > 1) {
struct device_info **newlist;
int j;
@@ -752,9 +751,9 @@ leave:
devices = NULL;
device_count = 0;
}
- pthread_mutex_unlock(&usbmux_mutex);
}
}
+ pthread_mutex_unlock(&usbmux_mutex);
cdata->dead = 1;
close(cdata->socket);
diff --git a/sock_stuff.c b/sock_stuff.c
index 78249e6..8a06135 100644
--- a/sock_stuff.c
+++ b/sock_stuff.c
@@ -11,7 +11,7 @@
#include <arpa/inet.h>
#include "sock_stuff.h"
-#define RECV_TIMEOUT 10000
+#define RECV_TIMEOUT 20000
static int verbose = 0;
@@ -75,7 +75,7 @@ int connect_unix_socket(const char *filename)
// check if socket file exists...
if (stat(filename, &fst) != 0) {
- if (verbose >= 2) fprintf(stderr, "%s: stat '%s': %s\n", __func__, filename, strerror(errno));
+ if (verbose >= 2) fprintf(stderr, "%s: stat '%s': %s\n", __func__, filename, strerror(errno));
return -1;
}