Merge branch 'jk/write-in-full-fix'
Many codepaths did not diagnose write failures correctly when disks go full, due to their misuse of write_in_full() helper function, which have been corrected. * jk/write-in-full-fix: read_pack_header: handle signed/unsigned comparison in read result config: flip return value of store_write_*() notes-merge: use ssize_t for write_in_full() return value pkt-line: check write_in_full() errors against "< 0" convert less-trivial versions of "write_in_full() != len" avoid "write_in_full(fd, buf, len) != len" pattern get-tar-commit-id: check write_in_full() return against 0 config: avoid "write_in_full(fd, buf, len) < len" pattern
This commit is contained in:
38
config.c
38
config.c
@ -2292,10 +2292,11 @@ static int write_error(const char *filename)
|
||||
return 4;
|
||||
}
|
||||
|
||||
static int store_write_section(int fd, const char *key)
|
||||
static ssize_t write_section(int fd, const char *key)
|
||||
{
|
||||
const char *dot;
|
||||
int i, success;
|
||||
int i;
|
||||
ssize_t ret;
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
||||
dot = memchr(key, '.', store.baselen);
|
||||
@ -2311,15 +2312,16 @@ static int store_write_section(int fd, const char *key)
|
||||
strbuf_addf(&sb, "[%.*s]\n", store.baselen, key);
|
||||
}
|
||||
|
||||
success = write_in_full(fd, sb.buf, sb.len) == sb.len;
|
||||
ret = write_in_full(fd, sb.buf, sb.len);
|
||||
strbuf_release(&sb);
|
||||
|
||||
return success;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int store_write_pair(int fd, const char *key, const char *value)
|
||||
static ssize_t write_pair(int fd, const char *key, const char *value)
|
||||
{
|
||||
int i, success;
|
||||
int i;
|
||||
ssize_t ret;
|
||||
int length = strlen(key + store.baselen + 1);
|
||||
const char *quote = "";
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
@ -2359,10 +2361,10 @@ static int store_write_pair(int fd, const char *key, const char *value)
|
||||
}
|
||||
strbuf_addf(&sb, "%s\n", quote);
|
||||
|
||||
success = write_in_full(fd, sb.buf, sb.len) == sb.len;
|
||||
ret = write_in_full(fd, sb.buf, sb.len);
|
||||
strbuf_release(&sb);
|
||||
|
||||
return success;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t find_beginning_of_line(const char *contents, size_t size,
|
||||
@ -2491,8 +2493,8 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
|
||||
}
|
||||
|
||||
store.key = (char *)key;
|
||||
if (!store_write_section(fd, key) ||
|
||||
!store_write_pair(fd, key, value))
|
||||
if (write_section(fd, key) < 0 ||
|
||||
write_pair(fd, key, value) < 0)
|
||||
goto write_err_out;
|
||||
} else {
|
||||
struct stat st;
|
||||
@ -2602,11 +2604,10 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
|
||||
/* write the first part of the config */
|
||||
if (copy_end > copy_begin) {
|
||||
if (write_in_full(fd, contents + copy_begin,
|
||||
copy_end - copy_begin) <
|
||||
copy_end - copy_begin)
|
||||
copy_end - copy_begin) < 0)
|
||||
goto write_err_out;
|
||||
if (new_line &&
|
||||
write_str_in_full(fd, "\n") != 1)
|
||||
write_str_in_full(fd, "\n") < 0)
|
||||
goto write_err_out;
|
||||
}
|
||||
copy_begin = store.offset[i];
|
||||
@ -2615,18 +2616,17 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
|
||||
/* write the pair (value == NULL means unset) */
|
||||
if (value != NULL) {
|
||||
if (store.state == START) {
|
||||
if (!store_write_section(fd, key))
|
||||
if (write_section(fd, key) < 0)
|
||||
goto write_err_out;
|
||||
}
|
||||
if (!store_write_pair(fd, key, value))
|
||||
if (write_pair(fd, key, value) < 0)
|
||||
goto write_err_out;
|
||||
}
|
||||
|
||||
/* write the rest of the config */
|
||||
if (copy_begin < contents_sz)
|
||||
if (write_in_full(fd, contents + copy_begin,
|
||||
contents_sz - copy_begin) <
|
||||
contents_sz - copy_begin)
|
||||
contents_sz - copy_begin) < 0)
|
||||
goto write_err_out;
|
||||
|
||||
munmap(contents, contents_sz);
|
||||
@ -2803,7 +2803,7 @@ int git_config_rename_section_in_file(const char *config_filename,
|
||||
continue;
|
||||
}
|
||||
store.baselen = strlen(new_name);
|
||||
if (!store_write_section(out_fd, new_name)) {
|
||||
if (write_section(out_fd, new_name) < 0) {
|
||||
ret = write_error(get_lock_file_path(lock));
|
||||
goto out;
|
||||
}
|
||||
@ -2829,7 +2829,7 @@ int git_config_rename_section_in_file(const char *config_filename,
|
||||
if (remove)
|
||||
continue;
|
||||
length = strlen(output);
|
||||
if (write_in_full(out_fd, output, length) != length) {
|
||||
if (write_in_full(out_fd, output, length) < 0) {
|
||||
ret = write_error(get_lock_file_path(lock));
|
||||
goto out;
|
||||
}
|
||||
|
Reference in New Issue
Block a user