50 lines
1.3 KiB
Diff
50 lines
1.3 KiB
Diff
|
From 4e303b094dc2b6c53739fb65f0e6e9f508a8f99c Mon Sep 17 00:00:00 2001
|
||
|
From: Marek Kasik <mkasik@redhat.com>
|
||
|
Date: Fri, 13 Nov 2015 17:22:31 +0100
|
||
|
Subject: [PATCH] gvdb: Restore permissions on changed files
|
||
|
|
||
|
Restore permissions of files changed in gvdb_table_write_contents().
|
||
|
Since g_file_set_contents() doesn't preserve permissions it can happen
|
||
|
that if user calling e.g. "dconf update" has umask set then
|
||
|
the originally readable file becomes unreadable.
|
||
|
---
|
||
|
gvdb/gvdb-builder.c | 8 ++++++++
|
||
|
1 file changed, 8 insertions(+)
|
||
|
|
||
|
diff --git a/gvdb/gvdb-builder.c b/gvdb/gvdb-builder.c
|
||
|
index 90ea50b..a185cb3 100644
|
||
|
--- a/gvdb/gvdb-builder.c
|
||
|
+++ b/gvdb/gvdb-builder.c
|
||
|
@@ -21,6 +21,7 @@
|
||
|
#include "gvdb-format.h"
|
||
|
|
||
|
#include <glib.h>
|
||
|
+#include <glib/gstdio.h>
|
||
|
#include <fcntl.h>
|
||
|
#if !defined(G_OS_WIN32) || !defined(_MSC_VER)
|
||
|
#include <unistd.h>
|
||
|
@@ -509,13 +510,20 @@ gvdb_table_write_contents (GHashTable *table,
|
||
|
gboolean status;
|
||
|
FileBuilder *fb;
|
||
|
GString *str;
|
||
|
+ GStatBuf buf;
|
||
|
+ gint stat_ret;
|
||
|
|
||
|
fb = file_builder_new (byteswap);
|
||
|
file_builder_add_hash (fb, table, &root);
|
||
|
str = file_builder_serialise (fb, root);
|
||
|
|
||
|
+ stat_ret = g_stat (filename, &buf);
|
||
|
+
|
||
|
status = g_file_set_contents (filename, str->str, str->len, error);
|
||
|
g_string_free (str, TRUE);
|
||
|
|
||
|
+ if (stat_ret == 0)
|
||
|
+ g_chmod (filename, buf.st_mode);
|
||
|
+
|
||
|
return status;
|
||
|
}
|
||
|
--
|
||
|
2.5.0
|
||
|
|