summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2012-12-29 16:32:36 +0200
committerEli Zaretskii <eliz@gnu.org>2012-12-29 16:32:36 +0200
commitccad023bc3c70fc8368c00f7ed2f5ec947a4260d (patch)
treec6471cecd468c61a1a81860215f731e265721a88
parentccb1c17e8bf1aa0d21bddd9fa37154a120657f52 (diff)
downloademacs-ccad023bc3c70fc8368c00f7ed2f5ec947a4260d.tar.gz
Fix bug #13298 with failed backups by falling back on set-file-modes.
src/fileio.c (Fset_file_selinux_context, Fset_file_acl): Return t if file's SELinux context or ACLs successfully set, nil otherwise. lisp/files.el (backup-buffer-copy, basic-save-buffer-2): If set-file-extended-attributes fails, fall back on set-file-modes instead of signaling an error. doc/lispref/files.texi (Changing Files): Document the return values of set-file-selinux-context and set-file-acl.
-rw-r--r--doc/lispref/ChangeLog5
-rw-r--r--doc/lispref/files.texi12
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/files.el20
-rw-r--r--src/ChangeLog4
-rw-r--r--src/fileio.c10
6 files changed, 45 insertions, 12 deletions
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog
index 7893424a942..b2f89024726 100644
--- a/doc/lispref/ChangeLog
+++ b/doc/lispref/ChangeLog
@@ -1,3 +1,8 @@
+2012-12-29 Eli Zaretskii <eliz@gnu.org>
+
+ * files.texi (Changing Files): Document the return values of
+ set-file-selinux-context and set-file-acl.
+
2012-12-27 Glenn Morris <rgm@gnu.org>
* files.texi (File Names): Mention Cygwin conversion functions.
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 3faa5f5e257..4317fe42523 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -1703,9 +1703,11 @@ This function sets the SELinux security context of the file
@var{filename} to @var{context}. @xref{File Attributes}, for a brief
description of SELinux contexts. The @var{context} argument should be
a list @code{(@var{user} @var{role} @var{type} @var{range})}, like the
-return value of @code{file-selinux-context}. The function does
-nothing if SELinux is disabled, or if Emacs was compiled without
-SELinux support.
+return value of @code{file-selinux-context}. The function returns
+@code{t} if it succeeds to set the SELinux security context of
+@var{filename}, @code{nil} otherwise. The function does nothing and
+returns @code{nil} if SELinux is disabled, or if Emacs was compiled
+without SELinux support.
@end defun
@defun set-file-acl filename acl-string
@@ -1713,7 +1715,9 @@ This function sets the ACL entries of the file @var{filename} to
@var{acl-string}. @xref{File Attributes}, for a brief description of
ACLs. The @var{acl-string} argument should be a string containing the
textual representation of the desired ACL entries as returned by
-@code{file-acl} (@pxref{File Attributes, file-acl}).
+@code{file-acl} (@pxref{File Attributes, file-acl}). The function
+returns @code{t} if it succeeds to set the ACL entries of
+@var{filename}, @code{nil} otherwise.
@end defun
@node File Names
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index b79d174d35e..0beb4a73185 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2012-12-29 Eli Zaretskii <eliz@gnu.org>
+
+ * files.el (backup-buffer-copy, basic-save-buffer-2): If
+ set-file-extended-attributes fails, fall back on set-file-modes
+ instead of signaling an error. (Bug#13298)
+
2012-12-29 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el: Support other commands triggering
diff --git a/lisp/files.el b/lisp/files.el
index f076530fbc8..fb82d0dbe1f 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -4019,10 +4019,12 @@ BACKUPNAME is the backup file name, which is the old file renamed."
nil)))
;; Reset the umask.
(set-default-file-modes umask)))
- (and modes
- (set-file-modes to-name (logand modes #o1777)))
- (and extended-attributes
- (set-file-extended-attributes to-name extended-attributes)))
+ ;; If set-file-extended-attributes fails, fall back on set-file-modes.
+ (unless (and extended-attributes
+ (with-demoted-errors
+ (set-file-extended-attributes to-name extended-attributes)))
+ (and modes
+ (set-file-modes to-name (logand modes #o1777)))))
(defvar file-name-version-regexp
"\\(?:~\\|\\.~[-[:alnum:]:#@^._]+\\(?:~[[:digit:]]+\\)?~\\)"
@@ -4737,8 +4739,14 @@ Before and after saving the buffer, this function runs
(setq setmodes (list (file-modes buffer-file-name)
(file-extended-attributes buffer-file-name)
buffer-file-name))
- (set-file-modes buffer-file-name (logior (car setmodes) 128))
- (set-file-extended-attributes buffer-file-name (nth 1 setmodes)))))
+ ;; If set-file-extended-attributes fails, fall back on
+ ;; set-file-modes.
+ (unless
+ (with-demoted-errors
+ (set-file-extended-attributes buffer-file-name
+ (nth 1 setmodes)))
+ (set-file-modes buffer-file-name
+ (logior (car setmodes) 128))))))
(let (success)
(unwind-protect
(progn
diff --git a/src/ChangeLog b/src/ChangeLog
index 76f6865972c..f40f936d13a 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
2012-12-29 Eli Zaretskii <eliz@gnu.org>
+ * fileio.c (Fset_file_selinux_context, Fset_file_acl): Return t if
+ file's SELinux context or ACLs successfully set, nil otherwise.
+ (Bug#13298)
+
* w32proc.c (reader_thread): Avoid passing NULL handles to
SetEvent and WaitForSingleObject.
diff --git a/src/fileio.c b/src/fileio.c
index 9f70c790592..e824a7abcc5 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2996,8 +2996,10 @@ DEFUN ("set-file-selinux-context", Fset_file_selinux_context,
CONTEXT should be a list (USER ROLE TYPE RANGE), where the list
elements are strings naming the components of a SELinux context.
-This function does nothing if SELinux is disabled, or if Emacs was not
-compiled with SELinux support. */)
+Value is t if setting of SELinux context was successful, nil otherwise.
+
+This function does nothing and returns nil if SELinux is disabled,
+or if Emacs was not compiled with SELinux support. */)
(Lisp_Object filename, Lisp_Object context)
{
Lisp_Object absname;
@@ -3063,6 +3065,7 @@ compiled with SELinux support. */)
context_free (parsed_con);
freecon (con);
+ return Qt;
}
else
report_file_error ("Doing lgetfilecon", Fcons (absname, Qnil));
@@ -3127,6 +3130,8 @@ DEFUN ("set-file-acl", Fset_file_acl, Sset_file_acl,
ACL-STRING should contain the textual representation of the ACL
entries in a format suitable for the platform.
+Value is t if setting of ACL was successful, nil otherwise.
+
Setting ACL for local files requires Emacs to be built with ACL
support. */)
(Lisp_Object filename, Lisp_Object acl_string)
@@ -3166,6 +3171,7 @@ support. */)
report_file_error ("Setting ACL", Fcons (absname, Qnil));
acl_free (acl);
+ return Qt;
}
#endif