From e0d7eb4820adebb81b1e9b39d2b99f42b606cc12 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 23 Jan 2012 10:17:26 +0000 Subject: [PATCH] Bug fix: cdrskin produced a memory fault if interupted before writing began --- cdrskin/cdrskin.c | 30 +++++++++++++++++++++++++----- cdrskin/cdrskin_timestamp.h | 2 +- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cdrskin/cdrskin.c b/cdrskin/cdrskin.c index 80f891d..ccd23aa 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -4071,7 +4071,6 @@ int Cdrskin_abort(struct CdrskiN *skin, int flag) if(ret<=0) { fprintf(stderr, "\ncdrskin: ABORT : Cannot cancel burn session and release drive.\n"); - return(0); } else { fprintf(stderr, "cdrskin: ABORT : Drive is released and library is shut down now.\n"); @@ -4091,6 +4090,15 @@ int Cdrskin_abort_handler(struct CdrskiN *skin, int signum, int flag) struct burn_progress p; enum burn_drive_status drive_status= BURN_DRIVE_GRABBING; +/* + fprintf(stderr, +"cdrskin_DEBUG: Cdrskin_abort_handler: signum=%d, flag=%d, drive_is_busy=%d\n", + signum, flag, skin->drive_is_busy); +*/ + + if(!skin->drive_is_busy) + Cdrskin_abort(skin, 0); /* Never comes back */ + if(getpid()!=skin->control_pid) { if(skin->verbosity>=Cdrskin_verbose_debuG) ClN(fprintf(stderr, @@ -4132,12 +4140,13 @@ int Cdrskin_abort_handler(struct CdrskiN *skin, int signum, int flag) fprintf(stderr,"cdrskin: ABORT : Usually it is done with 4x speed after about a MINUTE\n"); fprintf(stderr,"cdrskin: URGE : But wait at least the normal burning time before any kill -9\n"); } - if(skin->verbosity>=Cdrskin_verbose_debuG) - ClN(fprintf(stderr,"cdrskin_debug: ABORT : Calling burn_abort()\n")); Cdrskin_abort_leveL= -1; - if (!(flag & 1)) - burn_abort(-1, burn_abort_pacifier, "cdrskin: "); + if (!(flag & 1)) { + if(skin->verbosity>=Cdrskin_verbose_debuG) + ClN(fprintf(stderr,"cdrskin_debug: ABORT : Calling burn_abort()\n")); + burn_abort(-1, burn_abort_pacifier, "cdrskin: "); + } fprintf(stderr, "cdrskin: ABORT : Urged drive worker threads to do emergency halt.\n"); return(-2); @@ -5582,6 +5591,8 @@ int Cdrskin_wait_before_action(struct CdrskiN *skin, int flag) } for(i= skin->gracetime-1;i>=0;i--) { usleep(1000000); + if(Cdrskin__is_aborting(0)) + return(0); if(skin->verbosity>=Cdrskin_verbose_progresS) { printf("\b\b\b\b\b\b\b\b\b\b\b\b\b %3d seconds.",i); fflush(stdout); @@ -5813,6 +5824,8 @@ unsupported_format_type:; 1+(do_format==1 || do_format==3 || do_format==4)); #endif /* ! Cdrskin_extra_leaN */ + if(Cdrskin__is_aborting(0)) + {ret= 0; goto ex;} skin->drive_is_busy= 1; if(do_format==0 || do_format==2) { burn_disc_erase(drive,skin->blank_fast); @@ -7012,6 +7025,9 @@ burn_failed:; #ifndef Cdrskin_extra_leaN Cdrskin_wait_before_action(skin,0); + if(burn_is_aborting(0)) + {ret= 0; goto ex;} + if(needs_early_fifo_fill==1) ret= 1; else if(skin->cuefile[0] != 0) @@ -7031,6 +7047,8 @@ fifo_filling_failed:; printf("Starting new track at sector: %d\n",nwa); fflush(stdout); } + if(burn_is_aborting(0)) + {ret= 0; goto ex;} skin->drive_is_busy= 1; burn_disc_write(o, disc); if(skin->preskin->abort_handler==-1) @@ -7079,6 +7097,8 @@ fifo_filling_failed:; exit(1); } + if(Cdrskin__is_aborting(0)) + fifo_disabled= 1; if(skin->fifo==NULL || fifo_disabled) { usleep(20000); } else { diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 5fc48c2..f06eca3 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2012.01.22.182854" +#define Cdrskin_timestamP "2012.01.22.194131"