|
@@ -1176,8 +1176,10 @@ static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x,
|
|
|
if (result == NULL)
|
|
|
return NULL;
|
|
|
|
|
|
+ // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
|
|
|
+ STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
|
|
|
+
|
|
|
if (ri.bits_per_channel != 8) {
|
|
|
- STBI_ASSERT(ri.bits_per_channel == 16);
|
|
|
result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
|
|
|
ri.bits_per_channel = 8;
|
|
|
}
|
|
@@ -1200,8 +1202,10 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x,
|
|
|
if (result == NULL)
|
|
|
return NULL;
|
|
|
|
|
|
+ // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
|
|
|
+ STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
|
|
|
+
|
|
|
if (ri.bits_per_channel != 16) {
|
|
|
- STBI_ASSERT(ri.bits_per_channel == 8);
|
|
|
result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
|
|
|
ri.bits_per_channel = 16;
|
|
|
}
|
|
@@ -1691,7 +1695,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
|
|
|
STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
|
|
|
STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
|
|
|
STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
|
|
|
- default: STBI_ASSERT(0);
|
|
|
+ default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion");
|
|
|
}
|
|
|
#undef STBI__CASE
|
|
|
}
|
|
@@ -1748,7 +1752,7 @@ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int r
|
|
|
STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
|
|
|
STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
|
|
|
STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
|
|
|
- default: STBI_ASSERT(0);
|
|
|
+ default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion");
|
|
|
}
|
|
|
#undef STBI__CASE
|
|
|
}
|
|
@@ -2057,7 +2061,7 @@ stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
|
|
|
|
|
|
sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB
|
|
|
k = stbi_lrot(j->code_buffer, n);
|
|
|
- STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask)));
|
|
|
+ if (n < 0 || n >= (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))) return 0;
|
|
|
j->code_buffer = k & ~stbi__bmask[n];
|
|
|
k &= stbi__bmask[n];
|
|
|
j->code_bits -= n;
|
|
@@ -4083,7 +4087,8 @@ static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
|
|
|
if (s >= 16) return -1; // invalid code!
|
|
|
// code size is s, so:
|
|
|
b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
|
|
|
- STBI_ASSERT(z->size[b] == s);
|
|
|
+ if (b >= sizeof (z->size)) return -1; // some data was corrupt somewhere!
|
|
|
+ if (z->size[b] != s) return -1; // was originally an assert, but report failure instead.
|
|
|
a->code_buffer >>= s;
|
|
|
a->num_bits -= s;
|
|
|
return z->value[b];
|
|
@@ -4215,11 +4220,12 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a)
|
|
|
c = stbi__zreceive(a,2)+3;
|
|
|
if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
|
|
|
fill = lencodes[n-1];
|
|
|
- } else if (c == 17)
|
|
|
+ } else if (c == 17) {
|
|
|
c = stbi__zreceive(a,3)+3;
|
|
|
- else {
|
|
|
- STBI_ASSERT(c == 18);
|
|
|
+ } else if (c == 18) {
|
|
|
c = stbi__zreceive(a,7)+11;
|
|
|
+ } else {
|
|
|
+ return stbi__err("bad codelengths", "Corrupt PNG");
|
|
|
}
|
|
|
if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
|
|
|
memset(lencodes+n, fill, c);
|
|
@@ -4245,7 +4251,7 @@ static int stbi__parse_uncompressed_block(stbi__zbuf *a)
|
|
|
a->code_buffer >>= 8;
|
|
|
a->num_bits -= 8;
|
|
|
}
|
|
|
- STBI_ASSERT(a->num_bits == 0);
|
|
|
+ if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG");
|
|
|
// now fill header the normal way
|
|
|
while (k < 4)
|
|
|
header[k++] = stbi__zget8(a);
|
|
@@ -4529,7 +4535,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
|
|
|
return stbi__err("invalid filter","Corrupt PNG");
|
|
|
|
|
|
if (depth < 8) {
|
|
|
- STBI_ASSERT(img_width_bytes <= x);
|
|
|
+ if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG");
|
|
|
cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place
|
|
|
filter_bytes = 1;
|
|
|
width = img_width_bytes;
|
|
@@ -5347,7 +5353,9 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
|
|
|
psize = (info.offset - info.extra_read - info.hsz) >> 2;
|
|
|
}
|
|
|
if (psize == 0) {
|
|
|
- STBI_ASSERT(info.offset == (s->img_buffer - s->buffer_start));
|
|
|
+ if (info.offset != (s->img_buffer - s->buffer_start)) {
|
|
|
+ return stbi__errpuc("bad offset", "Corrupt BMP");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (info.bpp == 24 && ma == 0xff000000)
|