[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Stable update request: nano



Hi release team,

Nano's upstream maintainer found a few segfaults in nano when it was too
late for new updates. I think the fixes included in this revision are
important enough for r1.

These fixes are from CVS, from the deep-frozen 2.0.x branch (only
bugfixes are allowed there) and have been tested in unstable for a while
now, with no negative feedback.

Of course, as nano is part of d-i, I don't know how difficult accepting
this is.

Attached is the interdiff. Please tell me if I should/can upload, and
I'll setup a stable chroot to build this.

Thanks,
Jordi
-- 
Jordi Mallach Pérez  --  Debian developer     http://www.debian.org/
jordi@sindominio.net     jordi@debian.org     http://www.sindominio.net/
GnuPG public key information available at http://oskuro.net/
diff -u nano-2.0.2/debian/changelog nano-2.0.2/debian/changelog
--- nano-2.0.2/debian/changelog
+++ nano-2.0.2/debian/changelog
@@ -1,3 +1,16 @@
+nano (2.0.2-1etch1) stable; urgency=low
+
+  * The "Subestació de Patraix fora!" release.
+  * Apply several important fixes from the 2.0 CVS branch:
+    - 01_CVS_filebugs.dpatch: fixes several file-handling related bugs,
+      including a segfault, when working with filenames starting with "~",
+      and the lack of warning when overwriting a file (closes: #419353).
+      From CVS; provided by David Lawrence Ramsey.
+    - 02_CVS_justify_segfault.dpatch: fixes a segfault in the justify code
+      when marking/cutting text. From CVS; provided by David Lawrence Ramsey.
+
+ -- Jordi Mallach <jordi@debian.org>  Thu, 17 May 2007 00:52:30 +0200
+
 nano (2.0.2-1) unstable; urgency=medium
 
   * The "Compromís pel País Valencià" release.
only in patch2:
unchanged:
--- nano-2.0.2.orig/debian/patches/01_CVS_filebugs.dpatch
+++ nano-2.0.2/debian/patches/01_CVS_filebugs.dpatch
@@ -0,0 +1,183 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 01_CVS_filebugs.dpatch by Jordi Mallach <jordi@debian.org>
+##
+## DP: Fix a segfault when handling filenames starting with "~".
+## DP: Warn about file overwriting in one corner case.
+
+@DPATCH@
+diff -urNad nano-2.0.2~/src/files.c nano-2.0.2/src/files.c
+--- nano-2.0.2~/src/files.c	2006-12-15 06:03:08.000000000 +0100
++++ nano-2.0.2/src/files.c	2007-05-17 01:04:47.074839214 +0200
+@@ -586,10 +586,17 @@
+ {
+     struct stat fileinfo;
+     int fd;
++    char *full_filename;
+ 
+     assert(filename != NULL && f != NULL);
+ 
+-    if (stat(filename, &fileinfo) == -1) {
++    /* Get the specified file's full path. */
++    full_filename = get_full_path(filename);
++
++    if (full_filename == NULL)
++	full_filename = mallocstrcpy(NULL, filename);
++
++    if (stat(full_filename, &fileinfo) == -1) {
+ 	if (newfie) {
+ 	    statusbar(_("New File"));
+ 	    return -2;
+@@ -606,8 +613,9 @@
+ 		_("\"%s\" is a device file"), filename);
+ 	beep();
+ 	return -1;
+-    } else if ((fd = open(filename, O_RDONLY)) == -1) {
+-	statusbar(_("Error reading %s: %s"), filename, strerror(errno));
++    } else if ((fd = open(full_filename, O_RDONLY)) == -1) {
++	statusbar(_("Error reading %s: %s"), filename,
++		strerror(errno));
+ 	beep();
+  	return -1;
+      } else {
+@@ -623,6 +631,8 @@
+ 	    statusbar(_("Reading File"));
+     }
+ 
++    free(full_filename);
++
+     return 0;
+ }
+ 
+@@ -1881,7 +1891,7 @@
+ 
+ 	    if (append == OVERWRITE) {
+ 		size_t answer_len = strlen(answer);
+-		bool name_exists, different_name;
++		bool name_exists, do_warning;
+ 		char *full_answer, *full_filename;
+ 		struct stat st;
+ 
+@@ -1889,10 +1899,14 @@
+ 		 * full path. */
+ 		sunder(answer);
+ 
+-		name_exists = (stat(answer, &st) != -1);
+ 		full_answer = get_full_path(answer);
+ 		full_filename = get_full_path(openfile->filename);
+-		different_name = (strcmp((full_answer == NULL) ?
++		name_exists = (stat((full_answer == NULL) ? answer :
++			full_answer, &st) != -1);
++		if (openfile->filename[0] == '\0')
++		    do_warning = name_exists;
++		else
++		    do_warning = (strcmp((full_answer == NULL) ?
+ 			answer : full_answer, (full_filename == NULL) ?
+ 			openfile->filename : full_filename) != 0);
+ 
+@@ -1905,28 +1919,26 @@
+ 		if (full_answer != NULL)
+ 		    free(full_answer);
+ 
+-		if (different_name) {
+-		    if (name_exists) {
+-			/* If we're using restricted mode, we aren't
+-			 * allowed to save a new file under the name of
+-			 * an existing file. */
+-			if (ISSET(RESTRICTED))
+-			    continue;
++		if (do_warning) {
++		    /* If we're using restricted mode, we aren't allowed
++		     * to overwrite an existing file with the current
++		     * file.  We also aren't allowed to change the name
++		     * of the current file if it has one, because that
++		     * would allow reading from or writing to files not
++		     * specified on the command line. */
++		    if (ISSET(RESTRICTED))
++			continue;
+ 
++		    if (name_exists) {
+ 			i = do_yesno_prompt(FALSE,
+ 				_("File exists, OVERWRITE ? "));
+ 			if (i == 0 || i == -1)
+ 			    continue;
+-		    /* If we're using restricted mode, we aren't allowed
+-		     * to change the name of a file once it has one,
+-		     * because that would allow reading from or writing
+-		     * to files not specified on the command line. */
+-		    } else if (!ISSET(RESTRICTED) &&
+-			openfile->filename[0] != '\0'
++		    } else
+ #ifndef NANO_TINY
+-			&& (exiting || !openfile->mark_set)
++		    if (exiting || !openfile->mark_set)
+ #endif
+-			) {
++		    {
+ 			i = do_yesno_prompt(FALSE,
+ 				_("Save file under DIFFERENT NAME ? "));
+ 			if (i == 0 || i == -1)
+@@ -1972,45 +1984,45 @@
+  * convert ~user/ and ~/ notation. */
+ char *real_dir_from_tilde(const char *buf)
+ {
+-    char *dirtmp = NULL;
++    char *retval;
+ 
+     assert(buf != NULL);
+ 
+     if (buf[0] == '~') {
+-	size_t i;
+-	const char *tilde_dir;
++	size_t i = 1;
++	char *tilde_dir;
+ 
+-	/* Figure out how much of the str we need to compare. */
+-	for (i = 1; buf[i] != '/' && buf[i] != '\0'; i++)
++	/* Figure out how much of the string we need to compare. */
++	for (; buf[i] != '/' && buf[i] != '\0'; i++)
+ 	    ;
+ 
+ 	/* Get the home directory. */
+ 	if (i == 1) {
+ 	    get_homedir();
+-	    tilde_dir = homedir;
++	    tilde_dir = mallocstrcpy(NULL, homedir);
+ 	} else {
+ 	    const struct passwd *userdata;
+ 
++	    tilde_dir = mallocstrncpy(NULL, buf, i + 1);
++	    tilde_dir[i] = '\0';
++
+ 	    do {
+ 		userdata = getpwent();
+-	    } while (userdata != NULL &&
+-		strncmp(userdata->pw_name, buf + 1, i - 1) != 0);
++	    } while (userdata != NULL && strcmp(userdata->pw_name,
++		tilde_dir + 1) != 0);
+ 	    endpwent();
+-	    tilde_dir = userdata->pw_dir;
++	    if (userdata != NULL)
++		tilde_dir = mallocstrcpy(tilde_dir, userdata->pw_dir);
+ 	}
+ 
+-	if (tilde_dir != NULL) {
+-	    dirtmp = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1);
+-	    sprintf(dirtmp, "%s%s", tilde_dir, buf + i);
+-	}
+-    }
++	retval = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1);
++	sprintf(retval, "%s%s", tilde_dir, buf + i);
+ 
+-    /* Set a default value for dirtmp, in case the user's home directory
+-     * isn't found. */
+-    if (dirtmp == NULL)
+-	dirtmp = mallocstrcpy(NULL, buf);
++	free(tilde_dir);
++    } else
++	retval = mallocstrcpy(NULL, buf);
+ 
+-    return dirtmp;
++    return retval;
+ }
+ 
+ #if !defined(DISABLE_TABCOMP) || !defined(DISABLE_BROWSER)
only in patch2:
unchanged:
--- nano-2.0.2.orig/debian/patches/02_CVS_justify_segfault.dpatch
+++ nano-2.0.2/debian/patches/02_CVS_justify_segfault.dpatch
@@ -0,0 +1,29 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 02_CVS_justify_segfault.dpatch by Jordi Mallach <jordi@debian.org>
+##
+## DP: Fix a segfault in the justif code when marking/cutting text on
+## DP: a certain condition.
+
+@DPATCH@
+diff -urNad nano-2.0.2~/src/text.c nano-2.0.2/src/text.c
+--- nano-2.0.2~/src/text.c	2006-12-10 18:57:09.000000000 +0100
++++ nano-2.0.2/src/text.c	2007-05-17 01:11:27.464136871 +0200
+@@ -1212,9 +1212,16 @@
+      * line, putting first_line, edittop, current, and mark_begin at the
+      * same lines in the copied paragraph that they had in the original
+      * paragraph. */
+-    if (openfile->current != openfile->fileage)
++    if (openfile->current != openfile->fileage) {
+ 	top = openfile->current->prev;
+-    else
++#ifndef NANO_TINY
++	if (old_mark_set &&
++		openfile->current->lineno == mb_lineno_save) {
++	    openfile->mark_begin = openfile->current;
++	    openfile->mark_begin_x = mark_begin_x_save;
++	}
++#endif
++    } else
+ 	top = openfile->current;
+     for (i = par_len; i > 0 && top != NULL; i--) {
+ 	if (top->lineno == fl_lineno_save)
only in patch2:
unchanged:
--- nano-2.0.2.orig/debian/patches/00list
+++ nano-2.0.2/debian/patches/00list
@@ -0,0 +1,2 @@
+01_CVS_filebugs
+02_CVS_justify_segfault

Attachment: signature.asc
Description: Digital signature


Reply to: