comparison mjpeg.c @ 2422:18b8b2dcc037 libavcodec

various security fixes and precautionary checks
author michael
date Wed, 12 Jan 2005 00:16:25 +0000
parents 26560d4fdb1f
children ba01b8552bd4
comparison
equal deleted inserted replaced
2421:e326490f58c4 2422:18b8b2dcc037
657 p->key_frame= 1; 657 p->key_frame= 1;
658 658
659 mjpeg_picture_header(s); 659 mjpeg_picture_header(s);
660 660
661 s->header_bits= put_bits_count(&s->pb); 661 s->header_bits= put_bits_count(&s->pb);
662 662
663 if(avctx->pix_fmt == PIX_FMT_RGBA32){ 663 if(avctx->pix_fmt == PIX_FMT_RGBA32){
664 int x, y, i; 664 int x, y, i;
665 const int linesize= p->linesize[0]; 665 const int linesize= p->linesize[0];
666 uint16_t buffer[2048][4]; 666 uint16_t (*buffer)[4]= s->rd_scratchpad;
667 int left[3], top[3], topleft[3]; 667 int left[3], top[3], topleft[3];
668 668
669 for(i=0; i<3; i++){ 669 for(i=0; i<3; i++){
670 buffer[0][i]= 1 << (9 - 1); 670 buffer[0][i]= 1 << (9 - 1);
671 } 671 }
672 672
673 for(y = 0; y < height; y++) { 673 for(y = 0; y < height; y++) {
674 const int modified_predictor= y ? predictor : 1; 674 const int modified_predictor= y ? predictor : 1;
675 uint8_t *ptr = p->data[0] + (linesize * y); 675 uint8_t *ptr = p->data[0] + (linesize * y);
676 676
677 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < width*3*4){
678 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
679 return -1;
680 }
681
677 for(i=0; i<3; i++){ 682 for(i=0; i<3; i++){
678 top[i]= left[i]= topleft[i]= buffer[0][i]; 683 top[i]= left[i]= topleft[i]= buffer[0][i];
679 } 684 }
680 for(x = 0; x < width; x++) { 685 for(x = 0; x < width; x++) {
681 buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100; 686 buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100;
705 int mb_x, mb_y, i; 710 int mb_x, mb_y, i;
706 const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0]; 711 const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0];
707 const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0]; 712 const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0];
708 713
709 for(mb_y = 0; mb_y < mb_height; mb_y++) { 714 for(mb_y = 0; mb_y < mb_height; mb_y++) {
715 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < mb_width * 4 * 3 * s->mjpeg_hsample[0] * s->mjpeg_vsample[0]){
716 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
717 return -1;
718 }
710 for(mb_x = 0; mb_x < mb_width; mb_x++) { 719 for(mb_x = 0; mb_x < mb_width; mb_x++) {
711 if(mb_x==0 || mb_y==0){ 720 if(mb_x==0 || mb_y==0){
712 for(i=0;i<3;i++) { 721 for(i=0;i<3;i++) {
713 uint8_t *ptr; 722 uint8_t *ptr;
714 int x, y, h, v, linesize; 723 int x, y, h, v, linesize;
1058 av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n"); 1067 av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n");
1059 return -1; 1068 return -1;
1060 } 1069 }
1061 height = get_bits(&s->gb, 16); 1070 height = get_bits(&s->gb, 16);
1062 width = get_bits(&s->gb, 16); 1071 width = get_bits(&s->gb, 16);
1072
1063 dprintf("sof0: picture: %dx%d\n", width, height); 1073 dprintf("sof0: picture: %dx%d\n", width, height);
1074 if(avcodec_check_dimensions(s->avctx, width, height))
1075 return -1;
1064 1076
1065 nb_components = get_bits(&s->gb, 8); 1077 nb_components = get_bits(&s->gb, 8);
1066 if (nb_components <= 0 || 1078 if (nb_components <= 0 ||
1067 nb_components > MAX_COMPONENTS) 1079 nb_components > MAX_COMPONENTS)
1068 return -1; 1080 return -1;
1226 return 0; 1238 return 0;
1227 } 1239 }
1228 1240
1229 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){ 1241 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1230 int i, mb_x, mb_y; 1242 int i, mb_x, mb_y;
1231 uint16_t buffer[2048][4]; 1243 uint16_t buffer[32768][4];
1232 int left[3], top[3], topleft[3]; 1244 int left[3], top[3], topleft[3];
1233 const int linesize= s->linesize[0]; 1245 const int linesize= s->linesize[0];
1234 const int mask= (1<<s->bits)-1; 1246 const int mask= (1<<s->bits)-1;
1247
1248 if((unsigned)s->mb_width > 32768) //dynamic alloc
1249 return -1;
1235 1250
1236 for(i=0; i<3; i++){ 1251 for(i=0; i<3; i++){
1237 buffer[0][i]= 1 << (s->bits + point_transform - 1); 1252 buffer[0][i]= 1 << (s->bits + point_transform - 1);
1238 } 1253 }
1239 for(mb_y = 0; mb_y < s->mb_height; mb_y++) { 1254 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {