Mercurial > libavcodec.hg
comparison utils.c @ 5522:acaaff7b6fb8 libavcodec
ensure that default_get_buffer() doesnt reuse images if the dimension or
pix_fmt changed
fixes heap overflow, possibly exploitable
| author | michael |
|---|---|
| date | Fri, 10 Aug 2007 19:28:28 +0000 |
| parents | 8a28860d54ba |
| children | 3d10c3e84f96 |
comparison
equal
deleted
inserted
replaced
| 5521:6232e9874f46 | 5522:acaaff7b6fb8 |
|---|---|
| 145 typedef struct InternalBuffer{ | 145 typedef struct InternalBuffer{ |
| 146 int last_pic_num; | 146 int last_pic_num; |
| 147 uint8_t *base[4]; | 147 uint8_t *base[4]; |
| 148 uint8_t *data[4]; | 148 uint8_t *data[4]; |
| 149 int linesize[4]; | 149 int linesize[4]; |
| 150 int width, height; | |
| 151 enum PixelFormat pix_fmt; | |
| 150 }InternalBuffer; | 152 }InternalBuffer; |
| 151 | 153 |
| 152 #define INTERNAL_BUFFER_SIZE 32 | 154 #define INTERNAL_BUFFER_SIZE 32 |
| 153 | 155 |
| 154 #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) | 156 #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) |
| 249 | 251 |
| 250 buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | 252 buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; |
| 251 picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE-1]).last_pic_num; //FIXME ugly hack | 253 picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE-1]).last_pic_num; //FIXME ugly hack |
| 252 (*picture_number)++; | 254 (*picture_number)++; |
| 253 | 255 |
| 256 if(buf->base[0] && (buf->width != w || buf->height != h || buf->pix_fmt != s->pix_fmt)){ | |
| 257 for(i=0; i<4; i++){ | |
| 258 av_freep(&buf->base[i]); | |
| 259 buf->data[i]= NULL; | |
| 260 } | |
| 261 } | |
| 262 | |
| 254 if(buf->base[0]){ | 263 if(buf->base[0]){ |
| 255 pic->age= *picture_number - buf->last_pic_num; | 264 pic->age= *picture_number - buf->last_pic_num; |
| 256 buf->last_pic_num= *picture_number; | 265 buf->last_pic_num= *picture_number; |
| 257 }else{ | 266 }else{ |
| 258 int h_chroma_shift, v_chroma_shift; | 267 int h_chroma_shift, v_chroma_shift; |
| 304 if((s->flags&CODEC_FLAG_EMU_EDGE) || (s->pix_fmt == PIX_FMT_PAL8) || !size[2]) | 313 if((s->flags&CODEC_FLAG_EMU_EDGE) || (s->pix_fmt == PIX_FMT_PAL8) || !size[2]) |
| 305 buf->data[i] = buf->base[i]; | 314 buf->data[i] = buf->base[i]; |
| 306 else | 315 else |
| 307 buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), STRIDE_ALIGN); | 316 buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), STRIDE_ALIGN); |
| 308 } | 317 } |
| 318 buf->width = s->width; | |
| 319 buf->height = s->height; | |
| 320 buf->pix_fmt= s->pix_fmt; | |
| 309 pic->age= 256*256*256*64; | 321 pic->age= 256*256*256*64; |
| 310 } | 322 } |
| 311 pic->type= FF_BUFFER_TYPE_INTERNAL; | 323 pic->type= FF_BUFFER_TYPE_INTERNAL; |
| 312 | 324 |
| 313 for(i=0; i<4; i++){ | 325 for(i=0; i<4; i++){ |
