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