On Fri, Feb 13, 2009 at 11:20:49AM -0800, Erik Hovland wrote:
diff --git a/src/dvd_reader.c b/src/dvd_reader.c index 65900f7..66289e7 100644 --- a/src/dvd_reader.c +++ b/src/dvd_reader.c @@ -421,14 +421,29 @@ dvd_reader_t *DVDOpen( const char *ppath ) int cdir = open( ".", O_RDONLY );
if( cdir >= 0 ) { - chdir( path_copy ); + if ( chdir( path_copy ) == -1 ) { + close( cdir ); + return NULL; + } new_path = malloc(PATH_MAX+1); if(!new_path) { free(path); return NULL; } - getcwd(new_path, PATH_MAX ); - fchdir( cdir ); + if ( getcwd( new_path, PATH_MAX ) == NULL ) { + free( path ); + close( cdir ); + free( path_copy ); + free( new_path ); + return NULL; + } + if ( fchdir( cdir ) == -1 ) { + free( path ); + close( cdir ); + free( path_copy ); + free( new_path ); + return NULL; + } close( cdir ); free( path_copy ); path_copy = new_path;
Obviously there are a whole lot of free/close etc. missing, and with more returns that IMO becomes completely unmaintainable. I think this is a perfect place for something like "goto error" which does all the necessary cleanup. Afterwards the error checks can be added.