Merge branch 'jk/maint-config-bogus-section' into maint
"git config --rename-section" to rename an existing section into a bogus one did not check the new name. By Jeff King * jk/maint-config-bogus-section: config: reject bogus section names for --rename-section
This commit is contained in:
commit
4c8ad06e7c
24
config.c
24
config.c
@ -1552,20 +1552,42 @@ static int section_name_match (const char *buf, const char *name)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int section_name_is_ok(const char *name)
|
||||||
|
{
|
||||||
|
/* Empty section names are bogus. */
|
||||||
|
if (!*name)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Before a dot, we must be alphanumeric or dash. After the first dot,
|
||||||
|
* anything goes, so we can stop checking.
|
||||||
|
*/
|
||||||
|
for (; *name && *name != '.'; name++)
|
||||||
|
if (*name != '-' && !isalnum(*name))
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* if new_name == NULL, the section is removed instead */
|
/* if new_name == NULL, the section is removed instead */
|
||||||
int git_config_rename_section_in_file(const char *config_filename,
|
int git_config_rename_section_in_file(const char *config_filename,
|
||||||
const char *old_name, const char *new_name)
|
const char *old_name, const char *new_name)
|
||||||
{
|
{
|
||||||
int ret = 0, remove = 0;
|
int ret = 0, remove = 0;
|
||||||
char *filename_buf = NULL;
|
char *filename_buf = NULL;
|
||||||
struct lock_file *lock = xcalloc(sizeof(struct lock_file), 1);
|
struct lock_file *lock;
|
||||||
int out_fd;
|
int out_fd;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
FILE *config_file;
|
FILE *config_file;
|
||||||
|
|
||||||
|
if (new_name && !section_name_is_ok(new_name)) {
|
||||||
|
ret = error("invalid section name: %s", new_name);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (!config_filename)
|
if (!config_filename)
|
||||||
config_filename = filename_buf = git_pathdup("config");
|
config_filename = filename_buf = git_pathdup("config");
|
||||||
|
|
||||||
|
lock = xcalloc(sizeof(struct lock_file), 1);
|
||||||
out_fd = hold_lock_file_for_update(lock, config_filename, 0);
|
out_fd = hold_lock_file_for_update(lock, config_filename, 0);
|
||||||
if (out_fd < 0) {
|
if (out_fd < 0) {
|
||||||
ret = error("could not lock config file %s", config_filename);
|
ret = error("could not lock config file %s", config_filename);
|
||||||
|
@ -550,6 +550,14 @@ EOF
|
|||||||
|
|
||||||
test_expect_success "rename succeeded" "test_cmp expect .git/config"
|
test_expect_success "rename succeeded" "test_cmp expect .git/config"
|
||||||
|
|
||||||
|
test_expect_success 'renaming empty section name is rejected' '
|
||||||
|
test_must_fail git config --rename-section branch.zwei ""
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'renaming to bogus section is rejected' '
|
||||||
|
test_must_fail git config --rename-section branch.zwei "bogus name"
|
||||||
|
'
|
||||||
|
|
||||||
cat >> .git/config << EOF
|
cat >> .git/config << EOF
|
||||||
[branch "zwei"] a = 1 [branch "vier"]
|
[branch "zwei"] a = 1 [branch "vier"]
|
||||||
EOF
|
EOF
|
||||||
|
Loading…
Reference in New Issue
Block a user