@@ -28,12 +28,12 @@ void *patch_delta(void *src_buf, unsigned long src_size,
2828 top = delta_buf + delta_size ;
2929
3030 /* make sure the orig file size matches what we expect */
31- size = get_delta_hdr_size (& data );
31+ size = get_delta_hdr_size (& data , top );
3232 if (size != src_size )
3333 return NULL ;
3434
3535 /* now the result size */
36- size = get_delta_hdr_size (& data );
36+ size = get_delta_hdr_size (& data , top );
3737 dst_buf = malloc (size + 1 );
3838 if (!dst_buf )
3939 return NULL ;
@@ -52,21 +52,37 @@ void *patch_delta(void *src_buf, unsigned long src_size,
5252 if (cmd & 0x20 ) cp_size |= (* data ++ << 8 );
5353 if (cmd & 0x40 ) cp_size |= (* data ++ << 16 );
5454 if (cp_size == 0 ) cp_size = 0x10000 ;
55+ if (cp_off + cp_size < cp_size ||
56+ cp_off + cp_size > src_size ||
57+ cp_size > size )
58+ goto bad ;
5559 memcpy (out , src_buf + cp_off , cp_size );
5660 out += cp_size ;
57- } else {
61+ size -= cp_size ;
62+ } else if (cmd ) {
63+ if (cmd > size )
64+ goto bad ;
5865 memcpy (out , data , cmd );
5966 out += cmd ;
6067 data += cmd ;
68+ size -= cmd ;
69+ } else {
70+ /*
71+ * cmd == 0 is reserved for future encoding
72+ * extensions. In the mean time we must fail when
73+ * encountering them (might be data corruption).
74+ */
75+ goto bad ;
6176 }
6277 }
6378
6479 /* sanity check */
65- if (data != top || out - dst_buf != size ) {
80+ if (data != top || size != 0 ) {
81+ bad :
6682 free (dst_buf );
6783 return NULL ;
6884 }
6985
70- * dst_size = size ;
86+ * dst_size = out - dst_buf ;
7187 return dst_buf ;
7288}
0 commit comments