X-Git-Url: http://git.draconx.ca/gitweb/liblbx.git/blobdiff_plain/2b32a2f8d9ab7bdc899bb04cac6fb73101400481..567ed0920d13037a60c73b5a596ea45cacbeb001:/src/image.c diff --git a/src/image.c b/src/image.c index 27c8273..24dce99 100644 --- a/src/image.c +++ b/src/image.c @@ -65,7 +65,7 @@ struct lbx_image_priv { unsigned long offsets[]; }; -static struct lbx_image_priv *lbx_img_init(unsigned char hdr[static HDR_LEN]) +static struct lbx_image_priv *lbx_img_init(unsigned char *hdr) { unsigned short nframes = unpack_16_le(hdr+6); struct lbx_image_priv *img; @@ -93,6 +93,12 @@ static struct lbx_image_priv *lbx_img_init(unsigned char hdr[static HDR_LEN]) if (img->flags & FLAG_LOOPING) img->pub.leadin = 0; + if (img->pub.leadin >= img->pub.frames) { + lbx_error_raise(LBX_EFORMAT); + free(img); + return NULL; + } + return img; } @@ -124,7 +130,6 @@ struct lbx_image *lbx_img_open(void *f, const struct lbx_file_ops *fops, */ _lbx_assert(img->wtf == 0); /* version? */ _lbx_assert(img->wtf2 == 0); /* very likely is simply reserved. */ - _lbx_assert(img->pub.frames > img->pub.leadin); _lbx_assert(!(img->flags & ~FLAG_ALL)); /* Read all offsets. Should be merged with identical code in lbx.c */ @@ -308,11 +313,14 @@ long lbx_img_read_row_data(struct lbx_image *pub, void *buf) return -1; } - if (!(img->flags & FLAG_RAW)) { - /* Skip padding byte, if any */ - if (img->currentn % 2) { - if (img->fops->seek(img->f, 1, SEEK_CUR)) - return -1; + if (!(img->flags & FLAG_RAW) && img->currentn % 2) { + unsigned char c; + + /* Skip padding byte */ + if (img->fops->read(&c, 1, img->f) != 1) { + if (img->fops->eof(img->f)) + lbx_error_raise(LBX_EEOF); + return -1; } }