diff options
Diffstat (limited to 'meta/recipes-connectivity/gsm/files/0003-Correctly-segment-incoming-usock-data-into-packets.patch')
-rw-r--r-- | meta/recipes-connectivity/gsm/files/0003-Correctly-segment-incoming-usock-data-into-packets.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/meta/recipes-connectivity/gsm/files/0003-Correctly-segment-incoming-usock-data-into-packets.patch b/meta/recipes-connectivity/gsm/files/0003-Correctly-segment-incoming-usock-data-into-packets.patch new file mode 100644 index 0000000000..984acc9369 --- /dev/null +++ b/meta/recipes-connectivity/gsm/files/0003-Correctly-segment-incoming-usock-data-into-packets.patch | |||
@@ -0,0 +1,77 @@ | |||
1 | From 8af1bb4a0d0df9baa80859c5f7f56cbd7634aded Mon Sep 17 00:00:00 2001 | ||
2 | From: Andrzej Zaborowski <balrog@zabor.org> | ||
3 | Date: Wed, 19 Sep 2007 14:06:19 +0200 | ||
4 | Subject: [PATCH] Correctly segment incoming usock data into packets, handler short reads. | ||
5 | |||
6 | --- | ||
7 | include/gsmd/gsmd.h | 2 ++ | ||
8 | src/gsmd/usock.c | 20 ++++++++++++++++---- | ||
9 | 2 files changed, 18 insertions(+), 4 deletions(-) | ||
10 | |||
11 | diff --git a/include/gsmd/gsmd.h b/include/gsmd/gsmd.h | ||
12 | index 6ac9d8e..acec02a 100644 | ||
13 | --- a/include/gsmd/gsmd.h | ||
14 | +++ b/include/gsmd/gsmd.h | ||
15 | @@ -95,6 +95,8 @@ struct gsmd_user { | ||
16 | struct gsmd *gsmd; | ||
17 | struct gsmd_fd gfd; /* the socket */ | ||
18 | u_int32_t subscriptions; /* bitmaks of subscribed event groups */ | ||
19 | + char usock_fifo[1024]; | ||
20 | + int usock_len; | ||
21 | |||
22 | struct llist_head pb_readrg_list; /* our READRG phonebook list */ | ||
23 | struct llist_head pb_find_list; /* our FIND phonebook list */ | ||
24 | diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c | ||
25 | index 32e98d0..bac5f0c 100644 | ||
26 | --- a/src/gsmd/usock.c | ||
27 | +++ b/src/gsmd/usock.c | ||
28 | @@ -1529,14 +1529,15 @@ static int usock_rcv_pcmd(struct gsmd_user *gu, char *buf, int len) | ||
29 | static int gsmd_usock_user_cb(int fd, unsigned int what, void *data) | ||
30 | { | ||
31 | struct gsmd_user *gu = data; | ||
32 | + struct gsmd_msg_hdr *gph; | ||
33 | |||
34 | /* FIXME: check some kind of backlog and limit it */ | ||
35 | |||
36 | if (what & GSMD_FD_READ) { | ||
37 | - char buf[1024]; | ||
38 | int rcvlen; | ||
39 | /* read data from socket, determine what he wants */ | ||
40 | - rcvlen = read(fd, buf, sizeof(buf)); | ||
41 | + rcvlen = read(fd, gu->usock_fifo + gu->usock_len, | ||
42 | + sizeof(gu->usock_fifo) - gu->usock_len); | ||
43 | if (rcvlen == 0) { | ||
44 | DEBUGP("EOF, this client has just vanished\n"); | ||
45 | /* EOF, this client has just vanished */ | ||
46 | @@ -1549,8 +1550,18 @@ static int gsmd_usock_user_cb(int fd, unsigned int what, void *data) | ||
47 | return 0; | ||
48 | } else if (rcvlen < 0) | ||
49 | return rcvlen; | ||
50 | - else | ||
51 | - return usock_rcv_pcmd(gu, buf, rcvlen); | ||
52 | + | ||
53 | + gu->usock_len += rcvlen; | ||
54 | + gph = (struct gsmd_msg_hdr *) gu->usock_fifo; | ||
55 | + while (gu->usock_len >= sizeof(*gph) && | ||
56 | + gu->usock_len >= sizeof(*gph) + gph->len) { | ||
57 | + usock_rcv_pcmd(gu, gu->usock_fifo, gu->usock_len); | ||
58 | + gu->usock_len -= sizeof(*gph) + gph->len; | ||
59 | + memmove(gu->usock_fifo, | ||
60 | + gu->usock_fifo + sizeof(*gph) + | ||
61 | + gph->len, | ||
62 | + gu->usock_len); | ||
63 | + } | ||
64 | } | ||
65 | |||
66 | if (what & GSMD_FD_WRITE) { | ||
67 | @@ -1609,6 +1620,7 @@ static int gsmd_usock_cb(int fd, unsigned int what, void *data) | ||
68 | newuser->gfd.cb = &gsmd_usock_user_cb; | ||
69 | newuser->gsmd = g; | ||
70 | newuser->subscriptions = 0xffffffff; | ||
71 | + newuser->usock_len = 0; | ||
72 | INIT_LLIST_HEAD(&newuser->finished_ucmds); | ||
73 | INIT_LLIST_HEAD(&newuser->pb_readrg_list); | ||
74 | INIT_LLIST_HEAD(&newuser->pb_find_list); | ||
75 | -- | ||
76 | 1.5.2.1 | ||
77 | |||