Mercurial > mplayer.hg
changeset 6223:7833c711d62b
avoids malloc()ing a negative number (== very big size_t)
some vobsub's trigger this case and cause a:
"MPlayer interrupted by signal 2 in module: decode_video"
author | pl |
---|---|
date | Wed, 29 May 2002 00:32:52 +0000 |
parents | 1a83bd7ff76e |
children | 79b2b4c3c435 |
files | spudec.c |
diffstat | 1 files changed, 14 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/spudec.c Tue May 28 21:52:37 2002 +0000 +++ b/spudec.c Wed May 29 00:32:52 2002 +0000 @@ -133,13 +133,21 @@ unsigned int first_y, last_y; unsigned char *image; unsigned char *aimage; + for (fy = 0; fy < this->image_size && !this->aimage[fy]; fy++); for (ly = this->stride * this->height-1; ly && !this->aimage[ly]; ly--); first_y = fy / this->stride; last_y = ly / this->stride; //printf("first_y: %d, last_y: %d\n", first_y, last_y); this->start_row += first_y; - this->height = last_y - first_y +1; + + // Some subtitles trigger this condition + if (last_y + 1 > first_y ) { + this->height = last_y - first_y +1; + } else { + this->height = 0; + } + //printf("new h %d new start %d (sz %d st %d)---\n\n", this->height, this->start_row, this->image_size, this->stride); image = malloc(2 * this->stride * this->height); if(image){ @@ -150,9 +158,12 @@ free(this->image); this->image = image; this->aimage = aimage; + } else { + // We'll get NULL if 0 byte is requested and it's not an error + if (this->stride && this->height ) { + fprintf(stderr,"Fatal: update_spu: malloc requested %d bytes\n", 2 * this->stride * this->height); + } } - else - perror("Fatal: update_spu: malloc"); } static void spudec_process_data(spudec_handle_t *this)