|
Line
Link Here
|
| 0 |
-- src/protocols/gg/common.c |
0 |
++ src/protocols/gg/common.c |
|
Lines 212-217
Link Here
|
| 212 |
{ |
212 |
{ |
| 213 |
int ret; |
213 |
int ret; |
| 214 |
|
214 |
|
|
|
215 |
if (!buf || length < 0) |
| 216 |
return NULL; |
| 217 |
|
| 215 |
gg_debug(GG_DEBUG_FUNCTION, "** gg_read_line(...);\n"); |
218 |
gg_debug(GG_DEBUG_FUNCTION, "** gg_read_line(...);\n"); |
| 216 |
|
219 |
|
| 217 |
for (; length > 1; buf++, length--) { |
220 |
for (; length > 1; buf++, length--) { |
|
Lines 269-275
Link Here
|
| 269 |
const char *p, hex[] = "0123456789abcdef"; |
272 |
const char *p, hex[] = "0123456789abcdef"; |
| 270 |
char *q, *buf; |
273 |
char *q, *buf; |
| 271 |
|
274 |
|
| 272 |
int size = 0; |
275 |
unsigned int size = 0; |
| 273 |
|
276 |
|
| 274 |
if (!str) |
277 |
if (!str) |
| 275 |
str = ""; |
278 |
str = ""; |
| 276 |
-- src/protocols/gg/libgg.c |
279 |
++ src/protocols/gg/libgg.c |
|
Lines 174-186
Link Here
|
| 174 |
* |
174 |
* |
| 175 |
* - sock - po³±czony socket. |
175 |
* - sock - po³±czony socket. |
| 176 |
* |
176 |
* |
| 177 |
* je¶li wyst±pi³ b³±d, zwraca NULL. reszta w errno. |
177 |
* je¶li wyst±pi³ b³±d, zwraca NULL. reszta w errno. nale�y zwr�ci� uwag�, �e gdy |
|
|
178 |
* po��czenie jest nieblokuj�ce, a kod b��du wynosi EAGAIN, nie uda�o si� |
| 179 |
* odczyta� ca�ego pakietu i nie nale�y tego traktowa� jako b��d. |
| 178 |
*/ |
180 |
*/ |
| 179 |
static void *gg_recv_packet(struct gg_session *sess) |
181 |
static void *gg_recv_packet(struct gg_session *sess) |
| 180 |
{ |
182 |
{ |
| 181 |
struct gg_header h; |
183 |
struct gg_header h; |
| 182 |
char *buf = NULL; |
184 |
char *buf = NULL; |
| 183 |
int ret = 0, offset, size = 0; |
185 |
int ret = 0; |
|
|
186 |
unsigned int offset, size = 0; |
| 184 |
int sizeh = sizeof(struct gg_header); |
187 |
int sizeh = sizeof(struct gg_header); |
| 185 |
|
188 |
|
| 186 |
gg_debug(GG_DEBUG_FUNCTION, "** gg_recv_packet(...);\n"); |
189 |
gg_debug(GG_DEBUG_FUNCTION, "** gg_recv_packet(...);\n"); |
|
Lines 209-215
Link Here
|
| 209 |
} |
212 |
} |
| 210 |
|
213 |
|
| 211 |
/* jakie¶ sensowne limity na rozmiar pakietu */ |
214 |
/* jakie¶ sensowne limity na rozmiar pakietu */ |
| 212 |
if (h.length < 0 || h.length > 65535) { |
215 |
if (h.length > 65535) { |
| 213 |
gg_debug(GG_DEBUG_MISC, "-- invalid packet length (%d)\n", h.length); |
216 |
gg_debug(GG_DEBUG_MISC, "-- invalid packet length (%d)\n", h.length); |
| 214 |
errno = ERANGE; |
217 |
errno = ERANGE; |
| 215 |
return NULL; |
218 |
return NULL; |
|
Lines 235-245
Link Here
|
| 235 |
while (size > 0) { |
238 |
while (size > 0) { |
| 236 |
ret = read(sess->fd, buf + sizeh + offset, size); |
239 |
ret = read(sess->fd, buf + sizeh + offset, size); |
| 237 |
gg_debug(GG_DEBUG_MISC, "-- body recv(..., %d) = %d\n", size, ret); |
240 |
gg_debug(GG_DEBUG_MISC, "-- body recv(..., %d) = %d\n", size, ret); |
|
|
241 |
if (!ret) { |
| 242 |
gg_debug(GG_DEBUG_MISC, "// gg_recv_packet() body recv() failed: connection broken\n"); |
| 243 |
errno = ECONNRESET; |
| 244 |
return NULL; |
| 245 |
} |
| 238 |
if (ret > -1 && ret <= size) { |
246 |
if (ret > -1 && ret <= size) { |
| 239 |
offset += ret; |
247 |
offset += ret; |
| 240 |
size -= ret; |
248 |
size -= ret; |
| 241 |
} else if (ret == -1) { |
249 |
} else if (ret == -1) { |
|
|
250 |
int errno2 = errno; |
| 251 |
|
| 242 |
gg_debug(GG_DEBUG_MISC, "-- errno = %d (%s)\n", errno, strerror(errno)); |
252 |
gg_debug(GG_DEBUG_MISC, "-- errno = %d (%s)\n", errno, strerror(errno)); |
|
|
253 |
errno = errno2; |
| 254 |
|
| 243 |
if (errno == EAGAIN) { |
255 |
if (errno == EAGAIN) { |
| 244 |
gg_debug(GG_DEBUG_MISC, "-- %d bytes received, %d left\n", offset, size); |
256 |
gg_debug(GG_DEBUG_MISC, "-- %d bytes received, %d left\n", offset, size); |
| 245 |
sess->recv_buf = buf; |
257 |
sess->recv_buf = buf; |
|
Lines 291-299
Link Here
|
| 291 |
{ |
303 |
{ |
| 292 |
struct gg_header *h; |
304 |
struct gg_header *h; |
| 293 |
char *tmp; |
305 |
char *tmp; |
| 294 |
int tmp_length; |
306 |
unsigned int tmp_length; |
| 295 |
void *payload; |
307 |
void *payload; |
| 296 |
int payload_length; |
308 |
unsigned int payload_length; |
| 297 |
va_list ap; |
309 |
va_list ap; |
| 298 |
int res; |
310 |
int res; |
| 299 |
|
311 |
|
|
Lines 317-327
Link Here
|
| 317 |
while (payload) { |
329 |
while (payload) { |
| 318 |
char *tmp2; |
330 |
char *tmp2; |
| 319 |
|
331 |
|
| 320 |
payload_length = va_arg(ap, int); |
332 |
payload_length = va_arg(ap, unsigned int); |
| 321 |
|
333 |
|
| 322 |
if (payload_length < 0) |
|
|
| 323 |
gg_debug(GG_DEBUG_MISC, "// gg_send_packet() invalid payload length (%d)\n", payload_length); |
| 324 |
|
| 325 |
if (!(tmp2 = realloc(tmp, sizeof(struct gg_header) + tmp_length + payload_length))) { |
334 |
if (!(tmp2 = realloc(tmp, sizeof(struct gg_header) + tmp_length + payload_length))) { |
| 326 |
gg_debug(GG_DEBUG_MISC, "// gg_send_packet() not enough memory for payload\n"); |
335 |
gg_debug(GG_DEBUG_MISC, "// gg_send_packet() not enough memory for payload\n"); |
| 327 |
free(tmp); |
336 |
free(tmp); |