nano-devel
[Top][All Lists]
Advanced

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

[Nano-devel] Re: nano 1.3.9 segfault


From: David Lawrence Ramsey
Subject: [Nano-devel] Re: nano 1.3.9 segfault
Date: Mon, 08 May 2006 12:48:10 -0400
User-agent: Thunderbird 1.5.0.2 (X11/20060420)

Trevor Caira wrote:
> nano will segfault if you have the following line in the rc file:
>
>     color brightred start="$" end="$"
>
> strangely, this does not break:
>
>     color brightred start="^" end="^"
>
> here's my version info:
>
> GNU nano version 1.3.9 (compiled 03:05:42, May  8 2006)
> Compiled options: --enable-color --enable-extra --enable-multibuffer
> --enable-nanorc --enable-utf8

Thanks for the report.  The problem is that those color statements match
zero-length regular expressions, which are properly ignored in
single-line color statements but not in multi-line color statements. This is fixed in CVS, and the attached patch should fix this in 1.3.9. By the way, what are you trying to color with these color statements?

diff -ur nano-1.3.9/src/winio.c nano-1.3.9-fixed/src/winio.c
--- nano-1.3.9/src/winio.c      2005-10-06 01:28:37.000000000 -0400
+++ nano-1.3.9-fixed/src/winio.c        2006-05-08 12:39:36.000000000 -0400
@@ -3177,10 +3177,8 @@
                                _("Refusing zero-length regex match"));
                    } else if (startmatch.rm_so < endpos &&
                        startmatch.rm_eo > startpos) {
-                       if (startmatch.rm_so <= startpos)
-                           x_start = 0;
-                       else
-                           x_start = strnlenpt(fileptr->data,
+                       x_start = (startmatch.rm_so <= startpos) ? 0 :
+                               strnlenpt(fileptr->data,
                                startmatch.rm_so) - start;
 
                        index = actual_x(converted, x_start);
@@ -3224,129 +3222,135 @@
                        goto step_two;
                    start_line = start_line->prev;
                }
-               /* No start found, so skip to the next step. */
-               if (start_line == NULL)
-                   goto step_two;
-               /* Now start_line is the first line before fileptr
-                * containing a start match.  Is there a start on this
-                * line not followed by an end on this line? */
-               start_col = 0;
-               while (TRUE) {
-                   start_col += startmatch.rm_so;
-                   startmatch.rm_eo -= startmatch.rm_so;
-                   if (regexec(tmpcolor->end, start_line->data +
-                       start_col + startmatch.rm_eo, 0, NULL,
-                       (start_col + startmatch.rm_eo == 0) ? 0 :
-                       REG_NOTBOL) == REG_NOMATCH)
-                       /* No end found after this start. */
-                       break;
-                   start_col++;
-                   if (regexec(tmpcolor->start, start_line->data +
-                       start_col, 1, &startmatch,
-                       REG_NOTBOL) == REG_NOMATCH)
-                       /* No later start on this line. */
+               if (startmatch.rm_so == startmatch.rm_eo) {
+                   startmatch.rm_eo++;
+                   statusbar(_("Refusing zero-length regex match"));
+               } else {
+                   /* No start found, so skip to the next step. */
+                   if (start_line == NULL)
                        goto step_two;
-               }
-               /* Indeed, there is a start not followed on this line by
-                * an end. */
+                   /* Now start_line is the first line before fileptr
+                    * containing a start match.  Is there a start on
+                    * this line not followed by an end on this line? */
+                   start_col = 0;
+                   while (TRUE) {
+                       start_col += startmatch.rm_so;
+                       startmatch.rm_eo -= startmatch.rm_so;
+                       if (regexec(tmpcolor->end, start_line->data +
+                               start_col + startmatch.rm_eo, 0, NULL,
+                               (start_col + startmatch.rm_eo == 0) ?
+                               0 : REG_NOTBOL) == REG_NOMATCH)
+                           /* No end found after this start. */
+                           break;
+                       start_col++;
+                       if (regexec(tmpcolor->start, start_line->data +
+                               start_col, 1, &startmatch,
+                               REG_NOTBOL) == REG_NOMATCH)
+                           /* No later start on this line. */
+                           goto step_two;
+                   }
+                   /* Indeed, there is a start not followed on this
+                    * line by an end. */
 
-               /* We have already checked that there is no end before
-                * fileptr and after the start.  Is there an end after
-                * the start at all?  We don't paint unterminated
-                * starts. */
-               end_line = fileptr;
-               while (end_line != NULL && regexec(tmpcolor->end,
+                   /* We have already checked that there is no end
+                    * before fileptr and after the start.  Is there an
+                    * end after the start at all?  We don't paint
+                    * unterminated starts. */
+                   end_line = fileptr;
+                   while (end_line != NULL && regexec(tmpcolor->end,
                        end_line->data, 1, &endmatch, 0) == REG_NOMATCH)
-                   end_line = end_line->next;
+                       end_line = end_line->next;
 
-               /* No end found, or it is too early. */
-               if (end_line == NULL || (end_line == fileptr &&
+                   /* No end found, or it is too early. */
+                   if (end_line == NULL || (end_line == fileptr &&
                        endmatch.rm_eo <= startpos))
-                   goto step_two;
+                       goto step_two;
 
-               /* Now paint the start of fileptr. */
-               if (end_line != fileptr)
-                   /* If the start of fileptr is on a different line
-                    * from the end, paintlen is -1, meaning that
-                    * everything on the line gets painted. */
-                   paintlen = -1;
-               else
-                   /* Otherwise, paintlen is the expanded location of
-                    * the end of the match minus the expanded location
-                    * of the beginning of the page. */
-                   paintlen = actual_x(converted,
-                       strnlenpt(fileptr->data, endmatch.rm_eo) -
-                       start);
+                   /* Now paint the start of fileptr. */
+                   if (end_line != fileptr)
+                       /* If the start of fileptr is on a different
+                        * line from the end, paintlen is -1, meaning
+                        * that everything on the line gets painted. */
+                       paintlen = -1;
+                   else
+                       /* Otherwise, paintlen is the expanded location
+                        * of the end of the match minus the expanded
+                        * location of the beginning of the page. */
+                       paintlen = actual_x(converted,
+                               strnlenpt(fileptr->data,
+                               endmatch.rm_eo) - start);
 
-               mvwaddnstr(edit, yval, 0, converted, paintlen);
+                   mvwaddnstr(edit, yval, 0, converted, paintlen);
 
   step_two:
-               /* Second step, we look for starts on this line. */
-               start_col = 0;
+                   /* Second step, we look for starts on this line. */
+                   start_col = 0;
 
-               while (start_col < endpos) {
-                   if (regexec(tmpcolor->start, fileptr->data +
-                       start_col, 1, &startmatch, (start_col == 0) ?
-                       0 : REG_NOTBOL) == REG_NOMATCH || start_col +
-                       startmatch.rm_so >= endpos)
-                       /* No more starts on this line. */
-                       break;
-                   /* Translate the match to be relative to the
-                    * beginning of the line. */
-                   startmatch.rm_so += start_col;
-                   startmatch.rm_eo += start_col;
+                   while (start_col < endpos) {
+                       if (regexec(tmpcolor->start, fileptr->data +
+                               start_col, 1, &startmatch, (start_col ==
+                               0) ? 0 : REG_NOTBOL) == REG_NOMATCH ||
+                               start_col + startmatch.rm_so >= endpos)
+                           /* No more starts on this line. */
+                           break;
+                       /* Translate the match to be relative to the
+                        * beginning of the line. */
+                       startmatch.rm_so += start_col;
+                       startmatch.rm_eo += start_col;
 
-                   if (startmatch.rm_so <= startpos)
-                       x_start = 0;
-                   else
-                       x_start = strnlenpt(fileptr->data,
+                       x_start = (startmatch.rm_so <= startpos) ? 0 :
+                               strnlenpt(fileptr->data,
                                startmatch.rm_so) - start;
 
-                   index = actual_x(converted, x_start);
+                       index = actual_x(converted, x_start);
 
-                   if (regexec(tmpcolor->end, fileptr->data +
-                       startmatch.rm_eo, 1, &endmatch,
-                       (startmatch.rm_eo == 0) ? 0 : REG_NOTBOL) ==
-                       0) {
-                       /* Translate the end match to be relative to the
-                        * beginning of the line. */
-                       endmatch.rm_so += startmatch.rm_eo;
-                       endmatch.rm_eo += startmatch.rm_eo;
-                       /* There is an end on this line.  But does it
-                        * appear on this page, and is the match more
-                        * than zero characters long? */
-                       if (endmatch.rm_eo > startpos &&
+                       if (regexec(tmpcolor->end, fileptr->data +
+                               startmatch.rm_eo, 1, &endmatch,
+                               (startmatch.rm_eo == 0) ? 0 :
+                               REG_NOTBOL) == 0) {
+                           /* Translate the end match to be relative to
+                            * the beginning of the line. */
+                           endmatch.rm_so += startmatch.rm_eo;
+                           endmatch.rm_eo += startmatch.rm_eo;
+                           /* There is an end on this line.  But does
+                            * it appear on this page, and is the match
+                            * more than zero characters long? */
+                           if (endmatch.rm_eo > startpos &&
                                endmatch.rm_eo > startmatch.rm_so) {
-                           paintlen = actual_x(converted + index,
-                               strnlenpt(fileptr->data,
-                               endmatch.rm_eo) - start - x_start);
-
-                           assert(0 <= x_start && x_start < COLS);
+                               paintlen = actual_x(converted + index,
+                                       strnlenpt(fileptr->data,
+                                       endmatch.rm_eo) - start -
+                                       x_start);
+
+                               assert(0 <= x_start && x_start < COLS);
+
+                               mvwaddnstr(edit, yval, x_start,
+                                       converted + index, paintlen);
+                           }
+                       } else {
+                           /* There is no end on this line.  But we
+                            * haven't yet looked for one on later
+                            * lines. */
+                           end_line = fileptr->next;
 
-                           mvwaddnstr(edit, yval, x_start,
-                               converted + index, paintlen);
-                       }
-                   } else {
-                       /* There is no end on this line.  But we haven't
-                        * yet looked for one on later lines. */
-                       end_line = fileptr->next;
-
-                       while (end_line != NULL &&
+                           while (end_line != NULL &&
                                regexec(tmpcolor->end, end_line->data,
                                0, NULL, 0) == REG_NOMATCH)
-                           end_line = end_line->next;
+                               end_line = end_line->next;
 
-                       if (end_line != NULL) {
-                           assert(0 <= x_start && x_start < COLS);
+                           if (end_line != NULL) {
+                               assert(0 <= x_start && x_start < COLS);
 
-                           mvwaddnstr(edit, yval, x_start,
-                               converted + index, -1);
-                           /* We painted to the end of the line, so
-                            * don't bother checking any more starts. */
-                           break;
+                               mvwaddnstr(edit, yval, x_start,
+                                       converted + index, -1);
+                               /* We painted to the end of the line, so
+                                * don't bother checking any more
+                                * starts. */
+                               break;
+                           }
                        }
+                       start_col = startmatch.rm_so + 1;
                    }
-                   start_col = startmatch.rm_so + 1;
                }
            }
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]