diff --git a/main/config.c b/main/config.c
index 1a59a8fd81d0791c118e912c3e78fabd1f572b6b..5f37945d95eef0c5c2958f3e0579b314c352c7f9 100644
--- a/main/config.c
+++ b/main/config.c
@@ -1996,21 +1996,27 @@ static void inclfile_destroy(void *obj)
 	ast_free(o->fname);
 }
 
-
-static struct inclfile *set_fn(char *fn, int fn_size, const char *file, const char *configfile, struct ao2_container *fileset)
+static void make_fn(char *fn, size_t fn_size, const char *file, const char *configfile)
 {
-	struct inclfile lookup;
-	struct inclfile *fi;
-
 	if (ast_strlen_zero(file)) {
-		if (configfile[0] == '/')
+		if (configfile[0] == '/') {
 			ast_copy_string(fn, configfile, fn_size);
-		else
+		} else {
 			snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, configfile);
-	} else if (file[0] == '/')
+		}
+	} else if (file[0] == '/') {
 		ast_copy_string(fn, file, fn_size);
-	else
+	} else {
 		snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, file);
+	}
+}
+
+static struct inclfile *set_fn(char *fn, size_t fn_size, const char *file, const char *configfile, struct ao2_container *fileset)
+{
+	struct inclfile lookup;
+	struct inclfile *fi;
+
+	make_fn(fn, fn_size, file, configfile);
 	lookup.fname = fn;
 	fi = ao2_find(fileset, &lookup, OBJ_POINTER);
 	if (fi) {
@@ -2119,11 +2125,29 @@ int ast_config_text_file_save(const char *configfile, const struct ast_config *c
 		return -1;
 	}
 
-	/* reset all the output flags, in case this isn't our first time saving this data */
+	/* Check all the files for write access before attempting to modify any of them */
 	for (incl = cfg->includes; incl; incl = incl->next) {
+		/* reset all the output flags in case this isn't our first time saving this data */
 		incl->output = 0;
+		/* now make sure we have write access */
+		if (!incl->exec) {
+			make_fn(fn, sizeof(fn), incl->included_file, configfile);
+			if (access(fn, R_OK | W_OK)) {
+				ast_log(LOG_ERROR, "Unable to write %s (%s)\n", fn, strerror(errno));
+				return -1;
+			}
+		}
 	}
 
+	/* now make sure we have write access to the main config file */
+	make_fn(fn, sizeof(fn), 0, configfile);
+	if (access(fn, R_OK | W_OK)) {
+		ast_log(LOG_ERROR, "Unable to write %s (%s)\n", fn, strerror(errno));
+		return -1;
+	}
+
+	/* Now that we know we have write access to all files, it's safe to start truncating them */
+
 	/* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions)
 	   are all truncated to zero bytes and have that nice header*/
 	for (incl = cfg->includes; incl; incl = incl->next) {
@@ -2135,8 +2159,7 @@ int ast_config_text_file_save(const char *configfile, const struct ast_config *c
 				gen_header(f, configfile, fn, generator);
 				fclose(f); /* this should zero out the file */
 			} else {
-				ast_debug(1, "Unable to open for writing: %s\n", fn);
-				ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno));
+				ast_log(LOG_ERROR, "Unable to write %s (%s)\n", fn, strerror(errno));
 			}
 			if (fi) {
 				ao2_ref(fi, -1);
@@ -2169,8 +2192,7 @@ int ast_config_text_file_save(const char *configfile, const struct ast_config *c
 			fi = set_fn(fn, sizeof(fn), cat->file, configfile, fileset);
 			f = fopen(fn, "a");
 			if (!f) {
-				ast_debug(1, "Unable to open for writing: %s\n", fn);
-				ast_verb(2, "Unable to write %s (%s)\n", fn, strerror(errno));
+				ast_log(LOG_ERROR, "Unable to write %s (%s)\n", fn, strerror(errno));
 				if (fi) {
 					ao2_ref(fi, -1);
 				}