|
|
@ -4130,13 +4130,16 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) |
|
|
|
static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
|
|
|
|
static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
|
|
|
|
{ |
|
|
|
{ |
|
|
|
char *q; |
|
|
|
char *q; |
|
|
|
int cur, limit, old_limit; |
|
|
|
unsigned int cur, limit, old_limit; |
|
|
|
z->zout = zout; |
|
|
|
z->zout = zout; |
|
|
|
if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); |
|
|
|
if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); |
|
|
|
cur = (int) (z->zout - z->zout_start); |
|
|
|
cur = (unsigned int) (z->zout - z->zout_start); |
|
|
|
limit = old_limit = (int) (z->zout_end - z->zout_start); |
|
|
|
limit = old_limit = (unsigned) (z->zout_end - z->zout_start); |
|
|
|
while (cur + n > limit) |
|
|
|
if(UINT_MAX - cur < n) return stbi__err("outofmem", "Out of memory"); |
|
|
|
|
|
|
|
while (cur + n > limit) { |
|
|
|
|
|
|
|
if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); |
|
|
|
limit *= 2; |
|
|
|
limit *= 2; |
|
|
|
|
|
|
|
} |
|
|
|
q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); |
|
|
|
q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); |
|
|
|
STBI_NOTUSED(old_limit); |
|
|
|
STBI_NOTUSED(old_limit); |
|
|
|
if (q == NULL) return stbi__err("outofmem", "Out of memory"); |
|
|
|
if (q == NULL) return stbi__err("outofmem", "Out of memory"); |
|
|
|