X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fxpmdec.c;h=922dfc0f672dd1876b8cb638b6caaf68e5624e8a;hb=0181162bb54ce62ec212436a12d059726d8cd1df;hp=03172e4aadab48562365ac4bf211a6076cfb7add;hpb=64425e005edf3bdd77c34c078c3e74ab5ecef557;p=ffmpeg diff --git a/libavcodec/xpmdec.c b/libavcodec/xpmdec.c index 03172e4aada..922dfc0f672 100644 --- a/libavcodec/xpmdec.c +++ b/libavcodec/xpmdec.c @@ -26,6 +26,10 @@ #include "avcodec.h" #include "internal.h" +#define MIN_ELEMENT ' ' +#define MAX_ELEMENT 0xfe +#define NB_ELEMENTS (MAX_ELEMENT - MIN_ELEMENT + 1) + typedef struct XPMContext { uint32_t *pixels; int pixels_size; @@ -290,10 +294,10 @@ static int ascii2index(const uint8_t *cpixel, int cpp) int n = 0, m = 1, i; for (i = 0; i < cpp; i++) { - if (*p < ' ' || *p > '~') + if (*p < MIN_ELEMENT || *p > MAX_ELEMENT) return AVERROR_INVALIDDATA; - n += (*p++ - ' ') * m; - m *= 95; + n += (*p++ - MIN_ELEMENT) * m; + m *= NB_ELEMENTS; } return n; } @@ -307,6 +311,7 @@ static int xpm_decode_frame(AVCodecContext *avctx, void *data, int ncolors, cpp, ret, i, j; int64_t size; uint32_t *dst; + int width, height; avctx->pix_fmt = AV_PIX_FMT_BGRA; @@ -328,12 +333,12 @@ static int xpm_decode_frame(AVCodecContext *avctx, void *data, ptr += mod_strcspn(ptr, "\""); if (sscanf(ptr, "\"%u %u %u %u\",", - &avctx->width, &avctx->height, &ncolors, &cpp) != 4) { + &width, &height, &ncolors, &cpp) != 4) { av_log(avctx, AV_LOG_ERROR, "missing image parameters\n"); return AVERROR_INVALIDDATA; } - if ((ret = ff_set_dimensions(avctx, avctx->width, avctx->height)) < 0) + if ((ret = ff_set_dimensions(avctx, width, height)) < 0) return ret; if ((ret = ff_get_buffer(avctx, p, 0)) < 0) @@ -346,7 +351,7 @@ static int xpm_decode_frame(AVCodecContext *avctx, void *data, size = 1; for (i = 0; i < cpp; i++) - size *= 95; + size *= NB_ELEMENTS; if (ncolors <= 0 || ncolors > size) { av_log(avctx, AV_LOG_ERROR, "invalid number of colors: %d\n", ncolors);