Commit 9c26de0f by Edward Thomson Committed by Edward Thomson

config: lock the file for write before reading

When writing a configuration file, we want to take a lock on the
new file (eg, `config.lock`) before opening the configuration file
(`config`) for reading so that we can prevent somebody from changing
the contents underneath us.
parent 5a70df94
...@@ -1789,7 +1789,12 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p ...@@ -1789,7 +1789,12 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p
struct reader *reader = git_array_get(cfg->readers, 0); struct reader *reader = git_array_get(cfg->readers, 0);
struct write_data write_data; struct write_data write_data;
/* TODO: take the lock before reading */ /* Lock the file */
if ((result = git_filebuf_open(
&file, cfg->file_path, 0, GIT_CONFIG_FILE_MODE)) < 0) {
git_buf_free(&reader->buffer);
return result;
}
/* We need to read in our own config file */ /* We need to read in our own config file */
result = git_futils_readbuffer(&reader->buffer, cfg->file_path); result = git_futils_readbuffer(&reader->buffer, cfg->file_path);
...@@ -1805,16 +1810,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p ...@@ -1805,16 +1810,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p
reader->eof = 0; reader->eof = 0;
data_start = reader->read_ptr; data_start = reader->read_ptr;
} else { } else {
git_filebuf_cleanup(&file);
return -1; /* OS error when reading the file */ return -1; /* OS error when reading the file */
} }
/* Lock the file */
if ((result = git_filebuf_open(
&file, cfg->file_path, 0, GIT_CONFIG_FILE_MODE)) < 0) {
git_buf_free(&reader->buffer);
return result;
}
ldot = strrchr(key, '.'); ldot = strrchr(key, '.');
name = ldot + 1; name = ldot + 1;
section = git__strndup(key, ldot - key); section = git__strndup(key, ldot - key);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment