summaryrefslogtreecommitdiffstats
path: root/meta/recipes-connectivity/gsm/files/0003-Correctly-segment-incoming-usock-data-into-packets.patch
diff options
context:
space:
mode:
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.patch77
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 @@
1From 8af1bb4a0d0df9baa80859c5f7f56cbd7634aded Mon Sep 17 00:00:00 2001
2From: Andrzej Zaborowski <balrog@zabor.org>
3Date: Wed, 19 Sep 2007 14:06:19 +0200
4Subject: [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
11diff --git a/include/gsmd/gsmd.h b/include/gsmd/gsmd.h
12index 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 */
24diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c
25index 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--
761.5.2.1
77