1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
$NetBSD: patch-aj,v 1.1 2005/09/19 19:42:11 adrianp Exp $
--- libgadu-0.1/libgadu.c.orig 2004-03-30 23:44:07.000000000 +0100
+++ libgadu-0.1/libgadu.c
@@ -378,7 +378,7 @@ int gg_read(struct gg_session *sess, cha
*/
int gg_write(struct gg_session *sess, const char *buf, int length)
{
- int res;
+ int res = 0;
#ifdef __GG_LIBGADU_HAVE_OPENSSL
if (sess->ssl) {
@@ -415,7 +415,8 @@ void *gg_recv_packet(struct gg_session *
{
struct gg_header h;
char *buf = NULL;
- int ret = 0, offset, size = 0;
+ int ret = 0;
+ unsigned int offset, size = 0;
gg_debug(GG_DEBUG_FUNCTION, "** gg_recv_packet(%p);\n", sess);
@@ -477,7 +478,7 @@ void *gg_recv_packet(struct gg_session *
memcpy(&h, sess->recv_buf, sizeof(h));
/* jakie¶ sensowne limity na rozmiar pakietu */
- if (h.length < 0 || h.length > 65535) {
+ if (h.length > 65535) {
gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() invalid packet length (%d)\n", h.length);
errno = ERANGE;
return NULL;
@@ -503,11 +504,18 @@ void *gg_recv_packet(struct gg_session *
while (size > 0) {
ret = gg_read(sess, buf + sizeof(h) + offset, size);
gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() body recv(%d,%p,%d) = %d\n", sess->fd, buf + sizeof(h) + offset, size, ret);
+ if (!ret) {
+ gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() failed: connection broken\n");
+ errno = ECONNRESET;
+ return NULL;
+ }
if (ret > -1 && ret <= size) {
offset += ret;
size -= ret;
} else if (ret == -1) {
+ int errno2 = errno;
gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() body recv() failed (errno=%d, %s)\n", errno, strerror(errno));
+ errno = errno2;
if (errno == EAGAIN) {
gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() %d bytes received, %d left\n", offset, size);
sess->recv_buf = buf;
@@ -558,9 +566,9 @@ int gg_send_packet(struct gg_session *se
{
struct gg_header *h;
char *tmp;
- int tmp_length;
+ unsigned int tmp_length;
void *payload;
- int payload_length;
+ unsigned int payload_length;
va_list ap;
int res;
@@ -584,7 +592,9 @@ int gg_send_packet(struct gg_session *se
while (payload) {
char *tmp2;
- payload_length = va_arg(ap, int);
+ if (payload_length < 0)
+ gg_debug(GG_DEBUG_MISC, "// gg_send_packet() invalid payload length (%d)\n", payload_length);
+ payload_length = va_arg(ap, unsigned int);
if (payload_length < 0)
gg_debug(GG_DEBUG_MISC, "// gg_send_packet() invalid payload length (%d)\n", payload_length);
@@ -1150,7 +1160,7 @@ int gg_image_reply(struct gg_session *se
struct gg_send_msg s;
const char *tmp;
char buf[1910];
- int res;
+ int res = -1;
gg_debug(GG_DEBUG_FUNCTION, "** gg_image_reply(%p, %d, \"%s\", %p, %d);\n", sess, recipient, filename, image, size);
|