summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-12-24 07:05:53 -0800
committerMarcel Holtmann <marcel@holtmann.org>2009-12-24 07:05:53 -0800
commitda5d569557a805dd3f4cc4c0d4cd582481b4c7cd (patch)
tree01dd92069bce2f5868f6a907f8e86c9d497032f4 /src
parentc7fdd26c2410fc18195baa313700a47fa76fec67 (diff)
downloadconnman-da5d569557a805dd3f4cc4c0d4cd582481b4c7cd.tar.gz
connman-da5d569557a805dd3f4cc4c0d4cd582481b4c7cd.tar.bz2
connman-da5d569557a805dd3f4cc4c0d4cd582481b4c7cd.zip
Fix permissions of newly created /etc/resolv.conf
Diffstat (limited to 'src')
-rw-r--r--src/resolver.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/resolver.c b/src/resolver.c
index fa6880c8..59adeab4 100644
--- a/src/resolver.c
+++ b/src/resolver.c
@@ -338,30 +338,46 @@ static int resolvfile_append(const char *interface, const char *domain,
{
char *cmd;
int fd, len, err;
+ mode_t old_umask;
DBG("interface %s server %s", interface, server);
if (interface == NULL)
return -ENOENT;
+ old_umask = umask(022);
+
fd = open("/etc/resolv.conf", O_RDWR | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (fd < 0)
- return -errno;
+ if (fd < 0) {
+ err = -errno;
+ goto done;
+ }
+
+ if (ftruncate(fd, 0) < 0) {
+ err = -errno;
+ goto failed;
+ }
- err = ftruncate(fd, 0);
+ err = 0;
cmd = g_strdup_printf("# Generated by Connection Manager\n"
"options edns0\n"
"nameserver %s\n", server);
len = write(fd, cmd, strlen(cmd));
+ if (len < 0)
+ err = -errno;
g_free(cmd);
+failed:
close(fd);
- return 0;
+done:
+ umask(old_umask);
+
+ return err;
}
static int resolvfile_remove(const char *interface, const char *domain,