We were calling fclose() inside config_read_file(), which never called
fopen() itself. It is the caller's responsibility to close the file on
error. Also fix two error cases where the caller forgot to close fclose().
if(fseek(f, 0, SEEK_END) || !(len = ftell(f)) || fseek(f, 0, SEEK_SET)) {
logger(mesh, MESHLINK_ERROR, "Cannot get config file size: %s\n", strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
if(fseek(f, 0, SEEK_END) || !(len = ftell(f)) || fseek(f, 0, SEEK_SET)) {
logger(mesh, MESHLINK_ERROR, "Cannot get config file size: %s\n", strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
if(fread(buf, len, 1, f) != 1) {
logger(mesh, MESHLINK_ERROR, "Cannot read config file: %s\n", strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
if(fread(buf, len, 1, f) != 1) {
logger(mesh, MESHLINK_ERROR, "Cannot read config file: %s\n", strerror(errno));
meshlink_errno = MESHLINK_ESTORAGE;
if(rename(tmp_path, path)) {
logger(mesh, MESHLINK_ERROR, "Failed to rename `%s' to `%s': %s", tmp_path, path, strerror(errno));
if(rename(tmp_path, path)) {
logger(mesh, MESHLINK_ERROR, "Failed to rename `%s' to `%s': %s", tmp_path, path, strerror(errno));
if(fsync(fileno(f))) {
logger(mesh, MESHLINK_ERROR, "Failed to sync `%s': %s", path, strerror(errno));
if(fsync(fileno(f))) {
logger(mesh, MESHLINK_ERROR, "Failed to sync `%s': %s", path, strerror(errno));