comparison src/secure_save.c @ 311:8a6650589829

Preserve permissions of the destination file when using secure save.
author zas_
date Fri, 11 Apr 2008 16:02:33 +0000
parents 4b25b3b30f35
children a955b7fd626b
comparison
equal deleted inserted replaced
310:4b25b3b30f35 311:8a6650589829
9 * This software comes with no warranty of any kind, use at your own risk! 9 * This software comes with no warranty of any kind, use at your own risk!
10 */ 10 */
11 11
12 #include <glib/gstdio.h> 12 #include <glib/gstdio.h>
13 #include <errno.h> 13 #include <errno.h>
14 #include <utime.h>
14 15
15 #include "main.h" 16 #include "main.h"
16 #include "secure_save.h" 17 #include "secure_save.h"
17 18
18 /* ABOUT SECURE SAVE */ 19 /* ABOUT SECURE SAVE */
79 secsave_errno = SS_ERR_OUT_OF_MEM; 80 secsave_errno = SS_ERR_OUT_OF_MEM;
80 goto end; 81 goto end;
81 } 82 }
82 83
83 ssi->secure_save = TRUE; 84 ssi->secure_save = TRUE;
85 ssi->preserve_perms = TRUE;
84 86
85 ssi->file_name = g_strdup(file_name); 87 ssi->file_name = g_strdup(file_name);
86 if (!ssi->file_name) { 88 if (!ssi->file_name) {
87 secsave_errno = SS_ERR_OUT_OF_MEM; 89 secsave_errno = SS_ERR_OUT_OF_MEM;
88 goto free_f; 90 goto free_f;
254 secsave_errno = SS_ERR_OTHER; 256 secsave_errno = SS_ERR_OTHER;
255 goto free; 257 goto free;
256 } 258 }
257 259
258 if (ssi->secure_save && ssi->file_name && ssi->tmp_file_name) { 260 if (ssi->secure_save && ssi->file_name && ssi->tmp_file_name) {
261 struct stat st;
262
259 /* FIXME: Race condition on ssi->file_name. The file 263 /* FIXME: Race condition on ssi->file_name. The file
260 * named ssi->file_name may have changed since 264 * named ssi->file_name may have changed since
261 * secure_open() call (where we stat() file and 265 * secure_open() call (where we stat() file and
262 * more..). */ 266 * more..). */
267 #ifndef NO_UNIX_SOFTLINKS
268 if (g_lstat(ssi->file_name, &st) == 0)
269 #else
270 if (g_stat(ssi->file_name, &st) == 0)
271 #endif
272 {
273 /* set the dest file attributes to that of source (ignoring errors) */
274 if (ssi->preserve_perms)
275 {
276 chown(ssi->tmp_file_name, st.st_uid, st.st_gid);
277 chmod(ssi->tmp_file_name, st.st_mode);
278 }
279
280 if (ssi->preserve_mtime)
281 {
282 struct utimbuf tb;
283
284 tb.actime = st.st_atime;
285 tb.modtime = st.st_mtime;
286 utime(ssi->tmp_file_name, &tb);
287 }
288 }
263 if (debug > 2) g_printf("rename %s -> %s", ssi->tmp_file_name, ssi->file_name); 289 if (debug > 2) g_printf("rename %s -> %s", ssi->tmp_file_name, ssi->file_name);
264 if (g_rename(ssi->tmp_file_name, ssi->file_name) == -1) { 290 if (g_rename(ssi->tmp_file_name, ssi->file_name) == -1) {
265 ret = errno; 291 ret = errno;
266 secsave_errno = SS_ERR_RENAME; 292 secsave_errno = SS_ERR_RENAME;
267 goto free; 293 goto free;