]> git.proxmox.com Git - libgit2.git/commitdiff
config: lock the file for write before reading
authorEdward Thomson <ethomson@microsoft.com>
Mon, 27 Apr 2015 19:38:44 +0000 (15:38 -0400)
committerEdward Thomson <ethomson@edwardthomson.com>
Mon, 4 May 2015 12:41:37 +0000 (07:41 -0500)
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.

src/config_file.c

index c6c9ef5e252a8dd54a9184cca591cbba4c75bee7..713183a9610f39a772e68609e051f8241070f47c 100644 (file)
@@ -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 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 */
        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
                reader->eof = 0;
                data_start = reader->read_ptr;
        } else {
+               git_filebuf_cleanup(&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, '.');
        name = ldot + 1;
        section = git__strndup(key, ldot - key);