Просмотр исходного кода

* edit.c (check_file_access): Use O_EXCL when opening new files.
Don't allow editing stale symlinks.
Reported by Max Derzhak <max@linux.zp.ua>

Pavel Roskin 22 лет назад
Родитель
Сommit
c3cdbeb001
2 измененных файлов с 34 добавлено и 9 удалено
  1. 6 0
      edit/ChangeLog
  2. 28 9
      edit/edit.c

+ 6 - 0
edit/ChangeLog

@@ -1,3 +1,9 @@
+2002-12-07  Pavel Roskin  <proski@gnu.org>
+
+	* edit.c (check_file_access): Use O_EXCL when opening new files.
+	Don't allow editing stale symlinks.
+	Reported by Max Derzhak <max@linux.zp.ua>
+
 2002-12-05  Pavel Roskin  <proski@gnu.org>
 
 	* edit-widget.h: Remove "from_here" and "to_here".

+ 28 - 9
edit/edit.c

@@ -315,9 +315,11 @@ int edit_insert_file (WEdit * edit, const char *filename)
 }
 
 /* Open file and create it if necessary.  Return 0 for success, 1 for error.  */
-static int check_file_access (WEdit *edit, const char *filename, struct stat *st)
+static int
+check_file_access (WEdit *edit, const char *filename, struct stat *st)
 {
     int file;
+    int flags;
     int stat_ok = 0;
 
     /* Try stat first to prevent getting stuck on pipes */
@@ -327,20 +329,34 @@ static int check_file_access (WEdit *edit, const char *filename, struct stat *st
 
     /* Only regular files are allowed */
     if (stat_ok && !S_ISREG (st->st_mode)) {
-	edit_error_dialog (_ ("Error"), catstrs (_ (" Not an ordinary file: "), filename, " ", 0));
+	edit_error_dialog (_("Error"),
+			   catstrs (_(" Not an ordinary file: "), filename,
+				    " ", 0));
 	return 1;
     }
 
-    /* Open the file, create it if needed */
-    if ((file = mc_open (filename, O_RDONLY | O_CREAT | O_BINARY, 0666)) < 0) {
-	edit_error_dialog (_ ("Error"), get_sys_error (catstrs (_ (" Cannot open file for reading: "), filename, " ", 0)));
+    /* Open the file, create it if (and only if!) needed */
+    flags = O_RDONLY | O_CREAT | O_BINARY;
+    if (!stat_ok)
+	flags |= O_EXCL;
+
+    if ((file = mc_open (filename, flags, 0666)) < 0) {
+	edit_error_dialog (_("Error"),
+			   get_sys_error (catstrs
+					  (_
+					   (" Cannot open file for reading: "),
+					   filename, " ", 0)));
 	return 1;
     }
 
     /* If the file has just been created, we don't have valid stat yet, so do it now */
     if (!stat_ok && mc_fstat (file, st) < 0) {
 	mc_close (file);
-	edit_error_dialog (_ ("Error"), get_sys_error (catstrs (_ (" Cannot get size/permissions info for file: "), filename, " ", 0)));
+	edit_error_dialog (_("Error"),
+			   get_sys_error (catstrs
+					  (_
+					   (" Cannot get size/permissions info for file: "),
+					   filename, " ", 0)));
 	return 1;
     }
     mc_close (file);
@@ -351,9 +367,12 @@ static int check_file_access (WEdit *edit, const char *filename, struct stat *st
     }
 
     if (st->st_size >= SIZE_LIMIT) {
-/* The file-name is printed after the ':' */
-	edit_error_dialog (_ ("Error"), catstrs (_ (" File is too large: "), \
-						   filename, _ (" \n Increase edit.h:MAXBUF and recompile the editor. "), 0));
+	/* The file-name is printed after the ':' */
+	edit_error_dialog (_("Error"),
+			   catstrs (_(" File is too large: "), filename,
+				    _
+				    (" \n Increase edit.h:MAXBUF and recompile the editor. "),
+				    0));
 	return 1;
     }
     return 0;