Skip to content

Commit dafc88b

Browse files
Serge E. HallynJunio C Hamano
authored andcommitted
cleanups: prevent leak of two strduped strings in config.c
Config_filename and lockfile are strduped and then leaked in git_config_set_multivar. Signed-off-by: Serge E. Hallyn <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent ecc13e7 commit dafc88b

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

config.c

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ int git_config_set_multivar(const char* key, const char* value,
420420
{
421421
int i;
422422
int fd, in_fd;
423+
int ret;
423424
char* config_filename = strdup(git_path("config"));
424425
char* lock_file = strdup(git_path("config.lock"));
425426
const char* last_dot = strrchr(key, '.');
@@ -429,9 +430,10 @@ int git_config_set_multivar(const char* key, const char* value,
429430
* key name separated by a dot, we have to know where the dot is.
430431
*/
431432

432-
if (last_dot == NULL) {
433+
if (last_dot == NULL) {
433434
fprintf(stderr, "key does not contain a section: %s\n", key);
434-
return 2;
435+
ret = 2;
436+
goto out_free;
435437
}
436438
store.baselen = last_dot - key;
437439

@@ -447,7 +449,8 @@ int git_config_set_multivar(const char* key, const char* value,
447449
(i == store.baselen+1 && !isalpha(key[i])))) {
448450
fprintf(stderr, "invalid key: %s\n", key);
449451
free(store.key);
450-
return 1;
452+
ret = 1;
453+
goto out_free;
451454
} else
452455
store.key[i] = tolower(key[i]);
453456
store.key[i] = 0;
@@ -460,7 +463,8 @@ int git_config_set_multivar(const char* key, const char* value,
460463
if (fd < 0) {
461464
fprintf(stderr, "could not lock config file\n");
462465
free(store.key);
463-
return -1;
466+
ret = -1;
467+
goto out_free;
464468
}
465469

466470
/*
@@ -475,13 +479,15 @@ int git_config_set_multivar(const char* key, const char* value,
475479
strerror(errno));
476480
close(fd);
477481
unlink(lock_file);
478-
return 3; /* same as "invalid config file" */
482+
ret = 3; /* same as "invalid config file" */
483+
goto out_free;
479484
}
480485
/* if nothing to unset, error out */
481486
if (value == NULL) {
482487
close(fd);
483488
unlink(lock_file);
484-
return 5;
489+
ret = 5;
490+
goto out_free;
485491
}
486492

487493
store.key = (char*)key;
@@ -507,7 +513,8 @@ int git_config_set_multivar(const char* key, const char* value,
507513
fprintf(stderr, "Invalid pattern: %s\n",
508514
value_regex);
509515
free(store.value_regex);
510-
return 6;
516+
ret = 6;
517+
goto out_free;
511518
}
512519
}
513520

@@ -528,7 +535,8 @@ int git_config_set_multivar(const char* key, const char* value,
528535
regfree(store.value_regex);
529536
free(store.value_regex);
530537
}
531-
return 3;
538+
ret = 3;
539+
goto out_free;
532540
}
533541

534542
free(store.key);
@@ -542,7 +550,8 @@ int git_config_set_multivar(const char* key, const char* value,
542550
(store.seen > 1 && multi_replace == 0)) {
543551
close(fd);
544552
unlink(lock_file);
545-
return 5;
553+
ret = 5;
554+
goto out_free;
546555
}
547556

548557
fstat(in_fd, &st);
@@ -593,10 +602,18 @@ int git_config_set_multivar(const char* key, const char* value,
593602

594603
if (rename(lock_file, config_filename) < 0) {
595604
fprintf(stderr, "Could not rename the lock file?\n");
596-
return 4;
605+
ret = 4;
606+
goto out_free;
597607
}
598608

599-
return 0;
609+
ret = 0;
610+
611+
out_free:
612+
if (config_filename)
613+
free(config_filename);
614+
if (lock_file)
615+
free(lock_file);
616+
return ret;
600617
}
601618

602619

0 commit comments

Comments
 (0)