]> 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/branches/nano_2_0_branch/nano@4141 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/nano.c

index 889252e35766bfb4ad88eb897f0bf25a19040939..3bcacf5e77575cbe2cc2c3dde69f04cf52685198 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -30,6 +30,12 @@ CVS code -
 - nano.c:
   version()
        - Display copyright notices. (DLR)
+  copy_from_file()
+       - Fix potential segfault after uncutting one line of text with
+         the mark on by properly preserving the beginning of the mark.
+         (DLR, found by Paul Goins)
+       - Make sure the mark is always properly positioned after
+         uncutting one line of text with the mark on. (DLR)
 - prompt.c:
   do_yesno_prompt()
        - Remove redundant check for NO_HELP's being FALSE. (DLR)
index a190bcf45b99e48294c22bc9afffce9ea06c2b6a..58bafe5f6f992e3a79cfecf1ee8f9a2c6cff0c9d 100644 (file)
@@ -393,9 +393,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. */
@@ -410,11 +423,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. */