| 447 jsx->rxqueue[0], jsx->rxqueue[1], jsx->rxqueue[2], |
447 jsx->rxqueue[0], jsx->rxqueue[1], jsx->rxqueue[2], |
| 448 jsx->rxqueue[3], jsx->rxqueue[4]); |
448 jsx->rxqueue[3], jsx->rxqueue[4]); |
| 449 close(source); |
449 close(source); |
| 450 purple_xfer_cancel_remote(xfer); |
450 purple_xfer_cancel_remote(xfer); |
| 451 return; |
451 return; |
| 452 } else if(jsx->rxlen - 5 < jsx->rxqueue[4] + 2) { |
452 } else if(jsx->rxlen - 5 < (size_t)jsx->rxqueue[4] + 2) { |
| 453 /* Upper-bound of 257 (jsx->rxlen = 5, jsx->rxqueue[4] = 0xFF) */ |
453 /* Upper-bound of 257 (jsx->rxlen = 5, jsx->rxqueue[4] = 0xFF) */ |
| 454 unsigned short to_read = jsx->rxqueue[4] + 2 - (jsx->rxlen - 5); |
454 unsigned short to_read = jsx->rxqueue[4] + 2 - (jsx->rxlen - 5); |
| 455 purple_debug_info("jabber", "reading %u bytes for DST.ADDR + port num (trying to read %hu now)\n", |
455 purple_debug_info("jabber", "reading %u bytes for DST.ADDR + port num (trying to read %hu now)\n", |
| 456 jsx->rxqueue[4] + 2, to_read); |
456 jsx->rxqueue[4] + 2, to_read); |
| 457 len = read(source, buffer, to_read); |
457 len = read(source, buffer, to_read); |
| 466 memcpy(jsx->rxqueue + jsx->rxlen, buffer, len); |
466 memcpy(jsx->rxqueue + jsx->rxlen, buffer, len); |
| 467 jsx->rxlen += len; |
467 jsx->rxlen += len; |
| 468 } |
468 } |
| 469 |
469 |
| 470 /* Have we not read all of DST.ADDR and the following 2-byte port number? */ |
470 /* Have we not read all of DST.ADDR and the following 2-byte port number? */ |
| 471 if(jsx->rxlen - 5 < jsx->rxqueue[4] + 2) |
471 if(jsx->rxlen - 5 < (size_t)jsx->rxqueue[4] + 2) |
| 472 return; |
472 return; |
| 473 |
473 |
| 474 purple_input_remove(purple_xfer_get_watcher(xfer)); |
474 purple_input_remove(purple_xfer_get_watcher(xfer)); |
| 475 purple_xfer_set_watcher(xfer, 0); |
475 purple_xfer_set_watcher(xfer, 0); |
| 476 |
476 |
| 586 } |
586 } |
| 587 jsx->rxqueue = g_realloc(jsx->rxqueue, len + jsx->rxlen); |
587 jsx->rxqueue = g_realloc(jsx->rxqueue, len + jsx->rxlen); |
| 588 memcpy(jsx->rxqueue + jsx->rxlen, buffer, len); |
588 memcpy(jsx->rxqueue + jsx->rxlen, buffer, len); |
| 589 jsx->rxlen += len; |
589 jsx->rxlen += len; |
| 590 return; |
590 return; |
| 591 } else if(jsx->rxlen - 2 < jsx->rxqueue[1]) { |
591 } else if(jsx->rxlen - 2 < (size_t)jsx->rxqueue[1]) { |
| 592 /* Has a maximum value of 255 (jsx->rxlen = 2, jsx->rxqueue[1] = 0xFF) */ |
592 /* Has a maximum value of 255 (jsx->rxlen = 2, jsx->rxqueue[1] = 0xFF) */ |
| 593 unsigned short to_read = jsx->rxqueue[1] - (jsx->rxlen - 2); |
593 unsigned short to_read = jsx->rxqueue[1] - (jsx->rxlen - 2); |
| 594 purple_debug_info("jabber", "reading %u bytes for auth methods (trying to read %hu now)\n", |
594 purple_debug_info("jabber", "reading %u bytes for auth methods (trying to read %hu now)\n", |
| 595 jsx->rxqueue[1], to_read); |
595 jsx->rxqueue[1], to_read); |
| 596 len = read(source, buffer, to_read); |
596 len = read(source, buffer, to_read); |
| 604 memcpy(jsx->rxqueue + jsx->rxlen, buffer, len); |
604 memcpy(jsx->rxqueue + jsx->rxlen, buffer, len); |
| 605 jsx->rxlen += len; |
605 jsx->rxlen += len; |
| 606 } |
606 } |
| 607 |
607 |
| 608 /* Have we not read all the auth. method bytes? */ |
608 /* Have we not read all the auth. method bytes? */ |
| 609 if(jsx->rxlen -2 < jsx->rxqueue[1]) |
609 if(jsx->rxlen -2 < (size_t)jsx->rxqueue[1]) |
| 610 return; |
610 return; |
| 611 |
611 |
| 612 purple_debug_info("jabber", "checking to make sure we're socks FIVE\n"); |
612 purple_debug_info("jabber", "checking to make sure we're socks FIVE\n"); |
| 613 |
613 |
| 614 if(jsx->rxqueue[0] != 0x05) { |
614 if(jsx->rxqueue[0] != 0x05) { |