@@ -486,7 +486,7 @@ static unsigned char * load_xcf_tile_rle (SDL_RWops * src, Uint32 len, int bpp,
486
486
t = load = (unsigned char * ) SDL_malloc (len );
487
487
reallen = SDL_RWread (src , t , 1 , len );
488
488
489
- data = (unsigned char * ) SDL_malloc ( x * y * bpp );
489
+ data = (unsigned char * ) SDL_calloc ( 1 , x * y * bpp );
490
490
for (i = 0 ; i < bpp ; i ++ ) {
491
491
d = data + i ;
492
492
size = x * y ;
@@ -503,6 +503,12 @@ static unsigned char * load_xcf_tile_rle (SDL_RWops * src, Uint32 len, int bpp,
503
503
t += 2 ;
504
504
}
505
505
506
+ if (((size_t ) (t - load ) + length ) >= len ) {
507
+ break ; /* bogus data */
508
+ } else if (length > size ) {
509
+ break ; /* bogus data */
510
+ }
511
+
506
512
count += length ;
507
513
size -= length ;
508
514
@@ -518,6 +524,12 @@ static unsigned char * load_xcf_tile_rle (SDL_RWops * src, Uint32 len, int bpp,
518
524
t += 2 ;
519
525
}
520
526
527
+ if (((size_t ) (t - load )) >= len ) {
528
+ break ; /* bogus data */
529
+ } else if (length > size ) {
530
+ break ; /* bogus data */
531
+ }
532
+
521
533
count += length ;
522
534
size -= length ;
523
535
@@ -529,6 +541,11 @@ static unsigned char * load_xcf_tile_rle (SDL_RWops * src, Uint32 len, int bpp,
529
541
}
530
542
}
531
543
}
544
+
545
+ if (size > 0 ) {
546
+ break ; /* just drop out, untouched data initialized to zero. */
547
+ }
548
+
532
549
}
533
550
534
551
SDL_free (load );
0 commit comments