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 | 79 |
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 @@ | |||
1 | Upstream-Status: Inappropriate [not used] | ||
2 | |||
3 | From 8af1bb4a0d0df9baa80859c5f7f56cbd7634aded Mon Sep 17 00:00:00 2001 | ||
4 | From: Andrzej Zaborowski <balrog@zabor.org> | ||
5 | Date: Wed, 19 Sep 2007 14:06:19 +0200 | ||
6 | Subject: [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 | |||
13 | diff --git a/include/gsmd/gsmd.h b/include/gsmd/gsmd.h | ||
14 | index 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 */ | ||
26 | diff --git a/src/gsmd/usock.c b/src/gsmd/usock.c | ||
27 | index 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 | -- | ||
78 | 1.5.2.1 | ||
79 | |||