From: Mark Michelson Date: Mon, 25 Aug 2008 15:52:59 +0000 (+0000) Subject: Fix the logic in config_text_file_save so that if an X-Git-Tag: 1.4.22-rc3~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b7585650d9424bced7904882b5a5ba4ed607df2a;p=thirdparty%2Fasterisk.git Fix the logic in config_text_file_save so that if an UpdateConfig manager action is issued and the file specified in DstFileName does not yet exist, an error is not returned. (closes issue #13341) Reported by: vadim Patches: 13341.patch uploaded by putnopvut (license 60) (with small modification from seanbright) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@139769 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/config.c b/main/config.c index 26404af953..6163f827a4 100644 --- a/main/config.c +++ b/main/config.c @@ -1013,6 +1013,7 @@ int config_text_file_save(const char *configfile, const struct ast_config *cfg, struct ast_comment *cmt; struct stat s; int blanklines = 0; + int stat_result = 0; if (configfile[0] == '/') { snprintf(fntmp, sizeof(fntmp), "%s.XXXXXX", configfile); @@ -1124,10 +1125,11 @@ int config_text_file_save(const char *configfile, const struct ast_config *cfg, close(fd); return -1; } - stat(fn, &s); - fchmod(fd, s.st_mode); + if (!(stat_result = stat(fn, &s))) { + fchmod(fd, s.st_mode); + } fclose(f); - if (unlink(fn) || link(fntmp, fn)) { + if ((!stat_result && unlink(fn)) || link(fntmp, fn)) { if (option_debug) ast_log(LOG_DEBUG, "Unable to open for writing: %s (%s)\n", fn, strerror(errno)); if (option_verbose > 1)