]> git.wh0rd.org Git - nano.git/commitdiff
in copy_from_file(), fix potential segfault after uncutting one line of
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Tue, 7 Aug 2007 20:21:39 +0000 (20:21 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Tue, 7 Aug 2007 20:21:39 +0000 (20:21 +0000)
text with the mark on by properly preserving the beginning of the mark;
also, make sure the mark is always properly positioned after uncutting
one line of text with the mark on

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4141 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c

index 66ea25c29d100b84564975f75ef7b8f622e01b38..ab1093f8541aefebeb4fb4264336586bf8ba2c97 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-08-07  David Lawrence Ramsey  <pooka109@gmail.com>
+
+       * nano.c (copy_from_file): Fix potential segfault, found by Paul
+       Goins, after uncutting one line of text with the mark on by
+       properly preserving the beginning of the mark.
+       * nano.c (copy_from_file): Make sure the mark is always properly
+       positioned after uncutting one line of text with the mark on.
+
 2007-08-01  David Lawrence Ramsey  <pooka109@gmail.com>
 
        * nano.c (version): Display copyright notices.
index 639afaa57df72da1659aaea7a76c17d6887c43e3..65b576587439d42415ece713c59c20a853773ab9 100644 (file)
@@ -394,9 +394,22 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot)
 {
     filestruct *top_save;
     bool edittop_inside;
+#ifndef NANO_TINY
+    bool right_side_up = FALSE;
+#endif
 
     assert(file_top != NULL && file_bot != NULL);
 
+#ifndef NANO_TINY
+    if (openfile->mark_set) {
+       filestruct *top, *bot;
+       size_t top_x, bot_x;
+
+       mark_order((const filestruct **)&top, &top_x,
+               (const filestruct **)&bot, &bot_x, &right_side_up);
+    }
+#endif
+
     /* Partition the filestruct so that it contains no text, and keep
      * track of whether the top of the edit window is inside the
      * partition. */
@@ -411,11 +424,21 @@ void copy_from_filestruct(filestruct *file_top, filestruct *file_bot)
     while (openfile->filebot->next != NULL)
        openfile->filebot = openfile->filebot->next;
 
-    /* Restore the current line and cursor position. */
+    /* Restore the current line and cursor position.  If the mark begins
+     * inside the partition, adjust the mark coordinates to compensate
+     * for the change in the current line. */
     openfile->current = openfile->filebot;
     openfile->current_x = strlen(openfile->filebot->data);
-    if (openfile->fileage == openfile->filebot)
+    if (openfile->fileage == openfile->filebot) {
+#ifndef NANO_TINY
+       if (openfile->mark_set) {
+           openfile->mark_begin = openfile->current;
+           if (!right_side_up)
+               openfile->mark_begin_x += openfile->current_x;
+       }
+#endif
        openfile->current_x += strlen(filepart->top_data);
+    }
 
     /* Get the number of characters in the copied text, and add it to
      * totsize. */