X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=sys%2Fsrc%2Flibdraw%2Freadimage.c;h=66fac96560224616414b6125a6c3a019ba1898fd;hb=7ade57b678f0799ab0598632403da11fd7271b05;hp=61dbd12a6076ec157110ffd0eb99983622adc246;hpb=a9060cc06bee66e12fe16644511f181a4b0cdbd3;p=plan9front.git diff --git a/sys/src/libdraw/readimage.c b/sys/src/libdraw/readimage.c index 61dbd12a6..66fac9656 100644 --- a/sys/src/libdraw/readimage.c +++ b/sys/src/libdraw/readimage.c @@ -19,11 +19,15 @@ readimage(Display *d, int fd, int dolock) if(readn(fd, hdr, 11) != 11) return nil; - if(memcmp(hdr, "compressed\n", 11) == 0) - return creadimage(d, fd, dolock); + if(memcmp(hdr, "compressed\n", 11) == 0){ + if(i = creadimage(d, fd, dolock)) + goto Done; + return nil; + } + if(readn(fd, hdr+11, 5*12-11) != 5*12-11) return nil; - if(d) + if(d != nil) chunk = d->bufsize - 32; /* a little room for header */ else chunk = 8192; @@ -72,7 +76,9 @@ readimage(Display *d, int fd, int dolock) maxy = r.max.y; l = bytesperline(r, chantodepth(chan)); - if(d){ + if(l > chunk) + chunk = l; + if(d != nil){ if(dolock) lockdisplay(d); i = allocimage(d, r, chan, 0, -1); @@ -85,7 +91,6 @@ readimage(Display *d, int fd, int dolock) if(i == nil) return nil; } - tmp = malloc(chunk); if(tmp == nil) goto Err; @@ -93,10 +98,6 @@ readimage(Display *d, int fd, int dolock) dy = maxy - miny; if(dy*l > chunk) dy = chunk/l; - if(dy <= 0){ - werrstr("readimage: image too wide for buffer"); - goto Err; - } n = dy*l; m = readn(fd, tmp, n); if(m != n){ @@ -115,7 +116,7 @@ readimage(Display *d, int fd, int dolock) for(j=0; j