@@ -233,12 +233,14 @@ void show_usage(char *appname, struct config_file *config, bool full)
233233
234234int main (int argc , char * * argv )
235235{
236- struct ltfs_volume * vol ;
236+ struct ltfs_volume * vol = NULL ;
237237 struct other_check_opts opt ;
238238 int ret , log_level , syslog_level , i , cmd_args_len ;
239- char * lang = NULL , * cmd_args ;
239+ char * lang = NULL , * cmd_args = NULL ;
240240 const char * config_file = NULL ;
241- void * message_handle ;
241+ void * message_handle = NULL ;
242+ bool ltfs_initialized = false;
243+ bool message_plugin_loaded = false;
242244
243245 int fuse_argc = argc ;
244246 char * * fuse_argv = calloc (fuse_argc , sizeof (char * ));
@@ -248,7 +250,8 @@ int main(int argc, char **argv)
248250 for (i = 0 ; i < fuse_argc ; ++ i ) {
249251 fuse_argv [i ] = arch_strdup (argv [i ]);
250252 if (! fuse_argv [i ]) {
251- return LTFSCK_OPERATIONAL_ERROR ;
253+ ret = LTFSCK_OPERATIONAL_ERROR ;
254+ goto cleanup ;
252255 }
253256 }
254257 struct fuse_args args = FUSE_ARGS_INIT (fuse_argc , fuse_argv );
@@ -260,7 +263,8 @@ int main(int argc, char **argv)
260263 ret = setenv ("LANG" , "en_US.UTF-8" , 1 );
261264 if (ret ) {
262265 fprintf (stderr , "LTFS9016E Cannot set the LANG environment variable\n" );
263- return LTFSCK_OPERATIONAL_ERROR ;
266+ ret = LTFSCK_OPERATIONAL_ERROR ;
267+ goto cleanup ;
264268 }
265269 }
266270
@@ -271,22 +275,27 @@ int main(int argc, char **argv)
271275 ret = ltfs_init (LTFS_INFO , true, false);
272276 if (ret < 0 ) {
273277 ltfsmsg (LTFS_ERR , 10000E , ret );
274- return LTFSCK_OPERATIONAL_ERROR ;
278+ ret = LTFSCK_OPERATIONAL_ERROR ;
279+ goto cleanup ;
275280 }
281+ ltfs_initialized = true;
276282
277283 /* Setup signal handler to terminate cleanly */
278284 ret = ltfs_set_signal_handlers ();
279285 if (ret < 0 ) {
280286 ltfsmsg (LTFS_ERR , 10013E );
281- return LTFSCK_OPERATIONAL_ERROR ;
287+ ret = LTFSCK_OPERATIONAL_ERROR ;
288+ goto cleanup ;
282289 }
283290
284291 /* Register messages with libltfs */
285292 ret = ltfsprintf_load_plugin ("bin_ltfsck" , bin_ltfsck_dat , & message_handle );
286293 if (ret < 0 ) {
287294 ltfsmsg (LTFS_ERR , 10012E , ret );
288- return LTFSCK_OPERATIONAL_ERROR ;
295+ ret = LTFSCK_OPERATIONAL_ERROR ;
296+ goto cleanup ;
289297 }
298+ message_plugin_loaded = true;
290299
291300 /* Set up default format options and load the config file. */
292301 memset (& opt , 0 , sizeof (struct other_check_opts ));
@@ -295,6 +304,12 @@ int main(int argc, char **argv)
295304 opt .erase_history = false;
296305 opt .traverse_mode = TRAVERSE_BACKWARD ;
297306 opt .salvage_points = false;
307+ opt .backend_path = NULL ;
308+ opt .str_gen = NULL ;
309+ opt .kmi_backend_name = NULL ;
310+ opt .devname = NULL ;
311+ opt .prg_name = NULL ;
312+ opt .config = NULL ;
298313
299314 /* Check for a config file path given on the command line */
300315 while (true) {
@@ -306,7 +321,8 @@ int main(int argc, char **argv)
306321 config_file = arch_strdup (optarg );
307322 if (!config_file ) {
308323 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: config_file" );
309- return LTFSCK_OPERATIONAL_ERROR ;
324+ ret = LTFSCK_OPERATIONAL_ERROR ;
325+ goto cleanup ;
310326 }
311327 break ;
312328 }
@@ -316,7 +332,8 @@ int main(int argc, char **argv)
316332 ret = config_file_load (config_file , & opt .config );
317333 if (ret < 0 ) {
318334 ltfsmsg (LTFS_ERR , 10008E , ret );
319- return LTFSCK_OPERATIONAL_ERROR ;
335+ ret = LTFSCK_OPERATIONAL_ERROR ;
336+ goto cleanup ;
320337 }
321338
322339 /* Parse all command line arguments */
@@ -342,7 +359,8 @@ int main(int argc, char **argv)
342359 opt .backend_path = arch_strdup (optarg );
343360 if (!opt .backend_path ) {
344361 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: backend path" );
345- return LTFSCK_OPERATIONAL_ERROR ;
362+ ret = LTFSCK_OPERATIONAL_ERROR ;
363+ goto cleanup ;
346364 }
347365 break ;
348366 case 'g' :
@@ -352,7 +370,8 @@ int main(int argc, char **argv)
352370 opt .str_gen = arch_strdup (optarg );
353371 if (!opt .str_gen ) {
354372 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: generation string" );
355- return LTFSCK_OPERATIONAL_ERROR ;
373+ ret = LTFSCK_OPERATIONAL_ERROR ;
374+ goto cleanup ;
356375 }
357376 break ;
358377 case 'v' :
@@ -367,7 +386,8 @@ int main(int argc, char **argv)
367386 opt .kmi_backend_name = arch_strdup (optarg );
368387 if (!opt .kmi_backend_name ) {
369388 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: KMI backend name" );
370- return LTFSCK_OPERATIONAL_ERROR ;
389+ ret = LTFSCK_OPERATIONAL_ERROR ;
390+ goto cleanup ;
371391 }
372392 break ;
373393 case '+' :
@@ -412,22 +432,26 @@ int main(int argc, char **argv)
412432 break ;
413433 case 'h' :
414434 show_usage (argv [0 ], opt .config , false);
415- return 0 ;
435+ ret = 0 ;
436+ goto cleanup ;
416437 case 'p' :
417438 show_usage (argv [0 ], opt .config , true);
418- return 0 ;
439+ ret = 0 ;
440+ goto cleanup ;
419441 case 'o' :
420442 /* ignore -o here to parse them by fuse */
421443 ++ num_of_o ;
422444 break ;
423445 case 'V' :
424446 ltfsresult (16108 I , "ltfsck" , PACKAGE_VERSION );
425447 ltfsresult (16108 I , "LTFS Format Specification" , LTFS_INDEX_VERSION_STR );
426- return 0 ;
448+ ret = 0 ;
449+ goto cleanup ;
427450 case '?' :
428451 default :
429452 show_usage (argv [0 ], opt .config , false);
430- return LTFSCK_USAGE_SYNTAX_ERROR ;
453+ ret = LTFSCK_USAGE_SYNTAX_ERROR ;
454+ goto cleanup ;
431455 }
432456 }
433457
@@ -436,12 +460,14 @@ int main(int argc, char **argv)
436460 const char * default_backend = config_file_get_default_plugin ("tape" , opt .config );
437461 if (! default_backend ) {
438462 ltfsmsg (LTFS_ERR , 10009E );
439- return LTFSCK_OPERATIONAL_ERROR ;
463+ ret = LTFSCK_OPERATIONAL_ERROR ;
464+ goto cleanup ;
440465 }
441466 opt .backend_path = arch_strdup (default_backend );
442467 if (!opt .backend_path ) {
443468 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: default backend path" );
444- return LTFSCK_OPERATIONAL_ERROR ;
469+ ret = LTFSCK_OPERATIONAL_ERROR ;
470+ goto cleanup ;
445471 }
446472 }
447473 if (! opt .kmi_backend_name ) {
@@ -453,7 +479,8 @@ int main(int argc, char **argv)
453479
454480 if (!opt .kmi_backend_name ) {
455481 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: default KMI backend" );
456- return LTFSCK_OPERATIONAL_ERROR ;
482+ ret = LTFSCK_OPERATIONAL_ERROR ;
483+ goto cleanup ;
457484 }
458485 }
459486 if (opt .kmi_backend_name && strcmp (opt .kmi_backend_name , "none" ) == 0 )
@@ -463,7 +490,8 @@ int main(int argc, char **argv)
463490 if (opt .quiet && (opt .trace || opt .fulltrace )) {
464491 ltfsmsg (LTFS_ERR , 9013E );
465492 show_usage (argv [0 ], opt .config , false);
466- return LTFSCK_OPERATIONAL_ERROR ;
493+ ret = LTFSCK_OPERATIONAL_ERROR ;
494+ goto cleanup ;
467495 } else if (opt .quiet ) {
468496 log_level = LTFS_WARN ;
469497 syslog_level = LTFS_NONE ;
@@ -494,7 +522,8 @@ int main(int argc, char **argv)
494522 if (!cmd_args ) {
495523 /* Memory allocation failed */
496524 ltfsmsg (LTFS_ERR , 10001E , "ltfsck (arguments)" );
497- return LTFSCK_OPERATIONAL_ERROR ;
525+ ret = LTFSCK_OPERATIONAL_ERROR ;
526+ goto cleanup ;
498527 }
499528 arch_strcat (cmd_args , cmd_args_len , argv [0 ]);
500529 for (i = 1 ; i < argc ; i ++ ) {
@@ -515,42 +544,64 @@ int main(int argc, char **argv)
515544 ret = ltfs_volume_alloc ("ltfsck" , & vol );
516545 if (ret < 0 ) {
517546 ltfsmsg (LTFS_ERR , 16001E );
518- return LTFSCK_OPERATIONAL_ERROR ;
547+ ret = LTFSCK_OPERATIONAL_ERROR ;
548+ goto cleanup ;
519549 }
520550
521551 if (argv [optind + num_of_o ]) {
522552 opt .devname = arch_strdup (argv [optind + num_of_o ]);
523553 if (!opt .devname ) {
524554 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: device name" );
525- return LTFSCK_OPERATIONAL_ERROR ;
555+ ret = LTFSCK_OPERATIONAL_ERROR ;
556+ goto cleanup ;
526557 }
527558 }
528559
529560 opt .prg_name = arch_strdup (argv [0 ]);
530561 if (!opt .prg_name ) {
531562 ltfsmsg (LTFS_ERR , 10001E , "ltfsck: program name" );
532- return LTFSCK_OPERATIONAL_ERROR ;
563+ ret = LTFSCK_OPERATIONAL_ERROR ;
564+ goto cleanup ;
533565 }
534566
535567 if (_ltfsck_validate_options (& opt )) {
536568 ltfsmsg (LTFS_ERR , 16002E );
537569 show_usage (argv [0 ], opt .config , false);
538- return LTFSCK_USAGE_SYNTAX_ERROR ;
570+ ret = LTFSCK_USAGE_SYNTAX_ERROR ;
571+ goto cleanup ;
539572 }
540573
541574 ret = ltfs_fs_init ();
542- if (ret )
543- return LTFSCK_OPERATIONAL_ERROR ;
575+ if (ret ) {
576+ ret = LTFSCK_OPERATIONAL_ERROR ;
577+ goto cleanup ;
578+ }
544579
545580 ret = ltfsck (vol , & opt , & args );
546581
582+ cleanup :
583+ /* Free all allocated resources */
584+ if (fuse_argv ) {
585+ for (i = 0 ; i < fuse_argc ; ++ i ) {
586+ free (fuse_argv [i ]);
587+ }
588+ free (fuse_argv );
589+ }
590+ free (cmd_args );
547591 free (opt .prg_name );
548592 free (opt .backend_path );
549593 free (opt .kmi_backend_name );
550594 free (opt .devname );
551- config_file_free (opt .config );
552- ltfsprintf_unload_plugin (message_handle );
553- ltfs_finish ();
595+ free (opt .str_gen );
596+ if (config_file )
597+ free ((void * )config_file );
598+ if (opt .config )
599+ config_file_free (opt .config );
600+ if (message_plugin_loaded )
601+ ltfsprintf_unload_plugin (message_handle );
602+ if (ltfs_initialized )
603+ ltfs_finish ();
604+
554605 return ret ;
555606}
556607
0 commit comments