am 0a217de1: Don\'t write to wpa_supplicant.conf directly
* commit '0a217de1802bc5cf785524c1913af7ae3faa9c54':
Don't write to wpa_supplicant.conf directly
diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c
index 5c8f045..ef909a1 100644
--- a/wpa_supplicant/config_file.c
+++ b/wpa_supplicant/config_file.c
@@ -20,6 +20,9 @@
#include "eap_peer/eap_methods.h"
#include "eap_peer/eap.h"
+#ifdef ANDROID
+#include <sys/stat.h>
+#endif
static int newline_terminated(const char *buf, size_t buflen)
{
@@ -1205,12 +1208,21 @@
struct wpa_config_blob *blob;
#endif /* CONFIG_NO_CONFIG_BLOBS */
int ret = 0;
+ int tmp_len = os_strlen(name) + 5; /* allow space for .tmp suffix */
+ char *tmp_name = os_malloc(tmp_len);
- wpa_printf(MSG_DEBUG, "Writing configuration file '%s'", name);
+ if (tmp_name == NULL)
+ tmp_name = (char *)name;
+ else
+ os_snprintf(tmp_name, tmp_len, "%s.tmp", name);
- f = fopen(name, "w");
+ wpa_printf(MSG_DEBUG, "Writing configuration file '%s'", tmp_name);
+
+ f = fopen(tmp_name, "w");
if (f == NULL) {
- wpa_printf(MSG_DEBUG, "Failed to open '%s' for writing", name);
+ wpa_printf(MSG_DEBUG, "Failed to open '%s' for writing", tmp_name);
+ if (tmp_name != name)
+ os_free(tmp_name);
return -1;
}
@@ -1245,6 +1257,17 @@
fclose(f);
+ if (tmp_name != name) {
+ int chmod_ret = 0;
+#ifdef ANDROID
+ chmod_ret = chmod(tmp_name, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+#endif
+ if (chmod_ret != 0 || rename(tmp_name, name) != 0)
+ ret = -1;
+
+ os_free(tmp_name);
+ }
+
wpa_printf(MSG_DEBUG, "Configuration file '%s' written %ssuccessfully",
name, ret ? "un" : "");
return ret;