comparison packet.c @ 1057:16584026a1f0 nocircbuffer

allocate buffer and data in a single allocation
author Matt Johnston <matt@ucc.asn.au>
date Sun, 01 Mar 2015 21:16:09 +0800
parents 4d7b4c5526c5
children 686cd3e8e13e
comparison
equal deleted inserted replaced
1056:a2bfd4374878 1057:16584026a1f0
255 ((len - macsize) % blocksize != 0)) { 255 ((len - macsize) % blocksize != 0)) {
256 dropbear_exit("Integrity error (bad packet size %u)", len); 256 dropbear_exit("Integrity error (bad packet size %u)", len);
257 } 257 }
258 258
259 if (len > ses.readbuf->size) { 259 if (len > ses.readbuf->size) {
260 buf_resize(ses.readbuf, len); 260 ses.readbuf = buf_resize(ses.readbuf, len);
261 } 261 }
262 buf_setlen(ses.readbuf, len); 262 buf_setlen(ses.readbuf, len);
263 buf_setpos(ses.readbuf, blocksize); 263 buf_setpos(ses.readbuf, blocksize);
264 return DROPBEAR_SUCCESS; 264 return DROPBEAR_SUCCESS;
265 } 265 }
399 /* Already been increased as large as it can go, 399 /* Already been increased as large as it can go,
400 * yet didn't finish up the decompression */ 400 * yet didn't finish up the decompression */
401 dropbear_exit("bad packet, oversized decompressed"); 401 dropbear_exit("bad packet, oversized decompressed");
402 } 402 }
403 new_size = MIN(RECV_MAX_PAYLOAD_LEN, ret->size + ZLIB_DECOMPRESS_INCR); 403 new_size = MIN(RECV_MAX_PAYLOAD_LEN, ret->size + ZLIB_DECOMPRESS_INCR);
404 buf_resize(ret, new_size); 404 ret = buf_resize(ret, new_size);
405 } 405 }
406 } 406 }
407 } 407 }
408 #endif 408 #endif
409 409
638 TRACE2(("leave writemac")) 638 TRACE2(("leave writemac"))
639 } 639 }
640 640
641 #ifndef DISABLE_ZLIB 641 #ifndef DISABLE_ZLIB
642 /* compresses len bytes from src, outputting to dest (starting from the 642 /* compresses len bytes from src, outputting to dest (starting from the
643 * respective current positions. */ 643 * respective current positions. dest must have sufficient space,
644 * len+ZLIB_COMPRESS_EXPANSION */
644 static void buf_compress(buffer * dest, buffer * src, unsigned int len) { 645 static void buf_compress(buffer * dest, buffer * src, unsigned int len) {
645 646
646 unsigned int endpos = src->pos + len; 647 unsigned int endpos = src->pos + len;
647 int result; 648 int result;
648 649
649 TRACE2(("enter buf_compress")) 650 TRACE2(("enter buf_compress"))
650 651
651 while (1) { 652 dropbear_assert(dest->size - dest->pos >= len+ZLIB_COMPRESS_EXPANSION);
652 653
653 ses.keys->trans.zstream->avail_in = endpos - src->pos; 654 ses.keys->trans.zstream->avail_in = endpos - src->pos;
654 ses.keys->trans.zstream->next_in = 655 ses.keys->trans.zstream->next_in =
655 buf_getptr(src, ses.keys->trans.zstream->avail_in); 656 buf_getptr(src, ses.keys->trans.zstream->avail_in);
656 657
657 ses.keys->trans.zstream->avail_out = dest->size - dest->pos; 658 ses.keys->trans.zstream->avail_out = dest->size - dest->pos;
658 ses.keys->trans.zstream->next_out = 659 ses.keys->trans.zstream->next_out =
659 buf_getwriteptr(dest, ses.keys->trans.zstream->avail_out); 660 buf_getwriteptr(dest, ses.keys->trans.zstream->avail_out);
660 661
661 result = deflate(ses.keys->trans.zstream, Z_SYNC_FLUSH); 662 result = deflate(ses.keys->trans.zstream, Z_SYNC_FLUSH);
662 663
663 buf_setpos(src, endpos - ses.keys->trans.zstream->avail_in); 664 buf_setpos(src, endpos - ses.keys->trans.zstream->avail_in);
664 buf_setlen(dest, dest->size - ses.keys->trans.zstream->avail_out); 665 buf_setlen(dest, dest->size - ses.keys->trans.zstream->avail_out);
665 buf_setpos(dest, dest->len); 666 buf_setpos(dest, dest->len);
666 667
667 if (result != Z_OK) { 668 if (result != Z_OK) {
668 dropbear_exit("zlib error"); 669 dropbear_exit("zlib error");
669 } 670 }
670 671
671 if (ses.keys->trans.zstream->avail_in == 0) { 672 /* fails if destination buffer wasn't large enough */
672 break; 673 dropbear_assert(ses.keys->trans.zstream->avail_in == 0);
673 }
674
675 dropbear_assert(ses.keys->trans.zstream->avail_out == 0);
676
677 /* the buffer has been filled, we must extend. This only happens in
678 * unusual circumstances where the data grows in size after deflate(),
679 * but it is possible */
680 buf_resize(dest, dest->size + ZLIB_COMPRESS_EXPANSION);
681
682 }
683 TRACE2(("leave buf_compress")) 674 TRACE2(("leave buf_compress"))
684 } 675 }
685 #endif 676 #endif