Skip to content

Commit 71cfff6

Browse files
committed
update: Added cleanup section for memory-safe behaviour on ltfsck
1 parent b376c22 commit 71cfff6

1 file changed

Lines changed: 82 additions & 31 deletions

File tree

src/utils/ltfsck.c

Lines changed: 82 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,14 @@ void show_usage(char *appname, struct config_file *config, bool full)
233233

234234
int 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(16108I, "ltfsck", PACKAGE_VERSION);
425447
ltfsresult(16108I, "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

Comments
 (0)