jpg: use Breadn() instead if Bread() to guard aganst short reads
This commit is contained in:
parent
c0c9a9927f
commit
d0405d6c24
8 changed files with 28 additions and 29 deletions
|
@ -58,7 +58,7 @@ Bgetheader(Biobuf *b, Header *h)
|
|||
uchar buf[40];
|
||||
|
||||
memset(h, 0, sizeof(*h));
|
||||
if(Bread(b, buf, 6) != 6)
|
||||
if(Breadn(b, buf, 6) != 6)
|
||||
goto eof;
|
||||
if(gets(&buf[0]) != 0)
|
||||
goto header;
|
||||
|
@ -70,7 +70,7 @@ Bgetheader(Biobuf *b, Header *h)
|
|||
icon = mallocz(sizeof(*icon), 1);
|
||||
if(icon == nil)
|
||||
sysfatal("malloc: %r");
|
||||
if(Bread(b, buf, 16) != 16)
|
||||
if(Breadn(b, buf, 16) != 16)
|
||||
goto eof;
|
||||
icon->w = buf[0];
|
||||
icon->h = buf[1];
|
||||
|
@ -195,7 +195,7 @@ Bgeticon(Biobuf *b, Icon *icon)
|
|||
buf = malloc(icon->len);
|
||||
if(buf == nil)
|
||||
return -1;
|
||||
if(Bread(b, buf, icon->len) != icon->len){
|
||||
if(Breadn(b, buf, icon->len) != icon->len){
|
||||
werrstr("unexpected EOF");
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -320,7 +320,7 @@ load_16(Biobuf *b, long width, long height, Rgb* buf, Rgb* clut)
|
|||
for(iy = height; iy; iy--, i += step_up)
|
||||
for(ix = 0; ix < width; ix++, i++) {
|
||||
unsigned val;
|
||||
Bread(b, c, sizeof(c));
|
||||
Breadn(b, c, sizeof(c));
|
||||
val = (unsigned)c[0] + ((unsigned)c[1] << 8);
|
||||
|
||||
buf[i].alpha = 0;
|
||||
|
@ -340,7 +340,7 @@ load_16(Biobuf *b, long width, long height, Rgb* buf, Rgb* clut)
|
|||
} else
|
||||
for(iy = height; iy; iy--, i += step_up)
|
||||
for(ix = 0; ix < width; ix++, i++) {
|
||||
Bread(b, c, sizeof(c));
|
||||
Breadn(b, c, sizeof(c));
|
||||
buf[i].blue = (uchar)((c[0] << 3) & 0xf8);
|
||||
buf[i].green = (uchar)(((((unsigned)c[1] << 6) +
|
||||
(((unsigned)c[0]) >> 2))) & 0xf8);
|
||||
|
@ -406,7 +406,7 @@ load_32(Biobuf *b, long width, long height, Rgb* buf, Rgb* clut)
|
|||
for(iy = height; iy; iy--, i += step_up)
|
||||
for(ix = 0; ix < width; ix++, i++) {
|
||||
ulong val;
|
||||
Bread(b, c, sizeof(c));
|
||||
Breadn(b, c, sizeof(c));
|
||||
val = (ulong)c[0] + ((ulong)c[1] << 8) +
|
||||
((ulong)c[2] << 16) + ((ulong)c[1] << 24);
|
||||
|
||||
|
@ -427,7 +427,7 @@ load_32(Biobuf *b, long width, long height, Rgb* buf, Rgb* clut)
|
|||
} else
|
||||
for(iy = height; iy; iy--, i += step_up)
|
||||
for(ix = 0; ix < width; ix++, i++) {
|
||||
Bread(b, c, nelem(c));
|
||||
Breadn(b, c, nelem(c));
|
||||
buf[i].blue = c[0];
|
||||
buf[i].green = c[1];
|
||||
buf[i].red = c[2];
|
||||
|
|
|
@ -12,7 +12,6 @@ struct Entry{
|
|||
int exten;
|
||||
};
|
||||
|
||||
|
||||
struct Header{
|
||||
Biobuf *fd;
|
||||
char err[256];
|
||||
|
@ -46,7 +45,7 @@ static void readheader(Header*);
|
|||
static void skipextension(Header*);
|
||||
static uchar* readcmap(Header*, int);
|
||||
static uchar* decode(Header*, Rawimage*, Entry*);
|
||||
static void interlace(Header*, Rawimage*);
|
||||
static void interlace(Header*, Rawimage*);
|
||||
|
||||
static
|
||||
void
|
||||
|
@ -222,7 +221,7 @@ static
|
|||
void
|
||||
readheader(Header *h)
|
||||
{
|
||||
if(Bread(h->fd, h->buf, 13) != 13)
|
||||
if(Breadn(h->fd, h->buf, 13) != 13)
|
||||
giferror(h, "ReadGIF: can't read header: %r");
|
||||
memmove(h->vers, h->buf, 6);
|
||||
if(strcmp(h->vers, "GIF87a")!=0 && strcmp(h->vers, "GIF89a")!=0)
|
||||
|
@ -247,7 +246,7 @@ readcmap(Header *h, int size)
|
|||
if(size > 8)
|
||||
giferror(h, "ReadGIF: can't handles %d bits per pixel", size);
|
||||
size = 3*(1<<size);
|
||||
if(Bread(h->fd, h->buf, size) != size)
|
||||
if(Breadn(h->fd, h->buf, size) != size)
|
||||
giferror(h, "ReadGIF: short read on color map");
|
||||
map = malloc(size);
|
||||
if(map == nil)
|
||||
|
@ -263,7 +262,7 @@ readone(Header *h)
|
|||
Rawimage *i;
|
||||
int left, top, width, height;
|
||||
|
||||
if(Bread(h->fd, h->buf, 9) != 9)
|
||||
if(Breadn(h->fd, h->buf, 9) != 9)
|
||||
giferror(h, "ReadGIF: can't read image descriptor: %r");
|
||||
i = malloc(sizeof(Rawimage));
|
||||
if(i == nil)
|
||||
|
@ -295,7 +294,7 @@ readdata(Header *h, uchar *data)
|
|||
giferror(h, "ReadGIF: can't read data: %r");
|
||||
if(nbytes == 0)
|
||||
return 0;
|
||||
n = Bread(h->fd, data, nbytes);
|
||||
n = Breadn(h->fd, data, nbytes);
|
||||
if(n < 0)
|
||||
giferror(h, "ReadGIF: can't read data: %r");
|
||||
if(n != nbytes)
|
||||
|
@ -307,7 +306,7 @@ static
|
|||
void
|
||||
graphiccontrol(Header *h)
|
||||
{
|
||||
if(Bread(h->fd, h->buf, 5+1) != 5+1)
|
||||
if(Breadn(h->fd, h->buf, 5+1) != 5+1)
|
||||
giferror(h, readerr);
|
||||
h->flags = h->buf[1];
|
||||
h->delay = h->buf[2]+(h->buf[3]<<8);
|
||||
|
@ -348,7 +347,7 @@ skipextension(Header *h)
|
|||
default:
|
||||
giferror(h, "ReadGIF: unknown extension");
|
||||
}
|
||||
if(hsize>0 && Bread(h->fd, h->buf, hsize) != hsize)
|
||||
if(hsize>0 && Breadn(h->fd, h->buf, hsize) != hsize)
|
||||
giferror(h, extreaderr);
|
||||
if(!hasdata){
|
||||
/*
|
||||
|
|
|
@ -448,7 +448,7 @@ readsegment(Header *h, int *markerp)
|
|||
case 0:
|
||||
jpgerror(h, "ReadJPG: expecting marker; saw %.2x at offset %lld", m, Boffset(h->fd));
|
||||
}
|
||||
if(Bread(h->fd, tmp, 2) != 2)
|
||||
if(Breadn(h->fd, tmp, 2) != 2)
|
||||
Readerr:
|
||||
jpgerror(h, readerr);
|
||||
n = int2(tmp, 0);
|
||||
|
@ -462,7 +462,7 @@ readsegment(Header *h, int *markerp)
|
|||
h->nbuf = n;
|
||||
}
|
||||
/* accept short reads to cope with some real-world jpegs */
|
||||
if(Bread(h->fd, h->buf, n) < 0)
|
||||
if(Breadn(h->fd, h->buf, n) < 0)
|
||||
goto Readerr;
|
||||
*markerp = m;
|
||||
return n;
|
||||
|
|
|
@ -100,19 +100,19 @@ getchunk(Biobuf *b, char *type, uchar *d, int m)
|
|||
ulong crc = 0, crc2;
|
||||
int n, nr;
|
||||
|
||||
if(Bread(b, buf, 8) != 8)
|
||||
if(Breadn(b, buf, 8) != 8)
|
||||
return -1;
|
||||
n = get4(buf);
|
||||
memmove(type, buf+4, 4);
|
||||
type[4] = 0;
|
||||
if(n > m)
|
||||
sysfatal("getchunk needed %d, had %d", n, m);
|
||||
nr = Bread(b, d, n);
|
||||
nr = Breadn(b, d, n);
|
||||
if(nr != n)
|
||||
sysfatal("getchunk read %d, expected %d", nr, n);
|
||||
crc = blockcrc(crctab, crc, type, 4);
|
||||
crc = blockcrc(crctab, crc, d, n);
|
||||
if(Bread(b, buf, 4) != 4)
|
||||
if(Breadn(b, buf, 4) != 4)
|
||||
sysfatal("getchunk tlr failed");
|
||||
crc2 = get4(buf);
|
||||
if(crc != crc2)
|
||||
|
@ -389,7 +389,7 @@ readslave(Biobuf *b)
|
|||
ZlibW zw;
|
||||
|
||||
buf = pngmalloc(IDATSIZE, 0);
|
||||
Bread(b, buf, sizeof PNGmagic);
|
||||
Breadn(b, buf, sizeof PNGmagic);
|
||||
if(memcmp(PNGmagic, buf, sizeof PNGmagic) != 0)
|
||||
sysfatal("bad PNGmagic");
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@ rdhdr(Biobuf *bp)
|
|||
free(h);
|
||||
return nil;
|
||||
}
|
||||
if(Bread(bp, h->cmap, n) != n){
|
||||
if(Breadn(bp, h->cmap, n) != n){
|
||||
free(h);
|
||||
free(h->cmap);
|
||||
return nil;
|
||||
|
@ -124,7 +124,7 @@ rdhdr(Biobuf *bp)
|
|||
static int
|
||||
luma(Biobuf *bp, uchar *l, int num)
|
||||
{
|
||||
return Bread(bp, l, num);
|
||||
return Breadn(bp, l, num);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -164,7 +164,7 @@ rgba(Biobuf *bp, int bpp, uchar *r, uchar *g, uchar *b, int num)
|
|||
switch(bpp){
|
||||
case 16:
|
||||
for(i = 0; i < num; i++){
|
||||
if(Bread(bp, buf, 2) != 2)
|
||||
if(Breadn(bp, buf, 2) != 2)
|
||||
break;
|
||||
x = buf[0];
|
||||
y = buf[1];
|
||||
|
@ -175,7 +175,7 @@ rgba(Biobuf *bp, int bpp, uchar *r, uchar *g, uchar *b, int num)
|
|||
break;
|
||||
case 24:
|
||||
for(i = 0; i < num; i++){
|
||||
if(Bread(bp, buf, 3) != 3)
|
||||
if(Breadn(bp, buf, 3) != 3)
|
||||
break;
|
||||
*b++ = buf[0];
|
||||
*g++ = buf[1];
|
||||
|
@ -184,7 +184,7 @@ rgba(Biobuf *bp, int bpp, uchar *r, uchar *g, uchar *b, int num)
|
|||
break;
|
||||
case 32:
|
||||
for(i = 0; i < num; i++){
|
||||
if(Bread(bp, buf, 4) != 4)
|
||||
if(Breadn(bp, buf, 4) != 4)
|
||||
break;
|
||||
*b++ = buf[0];
|
||||
*g++ = buf[1];
|
||||
|
|
|
@ -120,7 +120,7 @@ BreadV210(Biobuf *bp, int colourspace)
|
|||
goto Error;
|
||||
|
||||
for(l = 0; l < lines; l++){
|
||||
if(Bread(bp, buf, chunk) == -1)
|
||||
if(Breadn(bp, buf, chunk) == -1)
|
||||
goto Error;
|
||||
|
||||
rd = 0;
|
||||
|
|
|
@ -126,7 +126,7 @@ Breadyuv(Biobuf *bp, int colourspace)
|
|||
goto Error;
|
||||
|
||||
for (l = 0; l < lines; l++) {
|
||||
if (Bread(bp, buf, pixels *2) == -1)
|
||||
if (Breadn(bp, buf, pixels *2) == -1)
|
||||
goto Error;
|
||||
|
||||
base = l*pixels*2;
|
||||
|
@ -137,7 +137,7 @@ Breadyuv(Biobuf *bp, int colourspace)
|
|||
|
||||
if (bits == 10)
|
||||
for (l = 0; l < lines; l++) {
|
||||
if (Bread(bp, buf, pixels / 2) == -1)
|
||||
if (Breadn(bp, buf, pixels / 2) == -1)
|
||||
goto Error;
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue