To: vim-dev@vim.org
Subject: Patch 7.0.021
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 7.0.021
Problem: Crash when using "\\[" and "\\]" in 'errorformat'. (Marc Weber)
Solution: Check for valid submatches after matching the pattern.
Files: src/quickfix.c
*** ../vim-7.0.020/src/quickfix.c Wed May 3 23:23:30 2006
--- src/quickfix.c Tue Jun 20 17:04:20 2006
***************
*** 602,614 ****
else
type = 0;
/*
! * Extract error message data from matched line
*/
if ((i = (int)fmt_ptr->addr[0]) > 0) /* %f */
{
! int c = *regmatch.endp[i];
/* Expand ~/file and $HOME/file to full path. */
*regmatch.endp[i] = NUL;
expand_env(regmatch.startp[i], namebuf, CMDBUFFSIZE);
*regmatch.endp[i] = c;
--- 602,620 ----
else
type = 0;
/*
! * Extract error message data from matched line.
! * We check for an actual submatch, because "\[" and "\]" in
! * the 'errorformat' may cause the wrong submatch to be used.
*/
if ((i = (int)fmt_ptr->addr[0]) > 0) /* %f */
{
! int c;
!
! if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
! continue;
/* Expand ~/file and $HOME/file to full path. */
+ c = *regmatch.endp[i];
*regmatch.endp[i] = NUL;
expand_env(regmatch.startp[i], namebuf, CMDBUFFSIZE);
*regmatch.endp[i] = c;
***************
*** 618,652 ****
--- 624,686 ----
continue;
}
if ((i = (int)fmt_ptr->addr[1]) > 0) /* %n */
+ {
+ if (regmatch.startp[i] == NULL)
+ continue;
enr = (int)atol((char *)regmatch.startp[i]);
+ }
if ((i = (int)fmt_ptr->addr[2]) > 0) /* %l */
+ {
+ if (regmatch.startp[i] == NULL)
+ continue;
lnum = atol((char *)regmatch.startp[i]);
+ }
if ((i = (int)fmt_ptr->addr[3]) > 0) /* %c */
+ {
+ if (regmatch.startp[i] == NULL)
+ continue;
col = (int)atol((char *)regmatch.startp[i]);
+ }
if ((i = (int)fmt_ptr->addr[4]) > 0) /* %t */
+ {
+ if (regmatch.startp[i] == NULL)
+ continue;
type = *regmatch.startp[i];
+ }
if (fmt_ptr->flags == '+' && !multiscan) /* %+ */
STRCPY(errmsg, IObuff);
else if ((i = (int)fmt_ptr->addr[5]) > 0) /* %m */
{
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
+ continue;
len = (int)(regmatch.endp[i] - regmatch.startp[i]);
vim_strncpy(errmsg, regmatch.startp[i], len);
}
if ((i = (int)fmt_ptr->addr[6]) > 0) /* %r */
+ {
+ if (regmatch.startp[i] == NULL)
+ continue;
tail = regmatch.startp[i];
+ }
if ((i = (int)fmt_ptr->addr[7]) > 0) /* %p */
{
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
+ continue;
col = (int)(regmatch.endp[i] - regmatch.startp[i] + 1);
if (*((char_u *)regmatch.startp[i]) != TAB)
use_viscol = TRUE;
}
if ((i = (int)fmt_ptr->addr[8]) > 0) /* %v */
{
+ if (regmatch.startp[i] == NULL)
+ continue;
col = (int)atol((char *)regmatch.startp[i]);
use_viscol = TRUE;
}
if ((i = (int)fmt_ptr->addr[9]) > 0) /* %s */
{
+ if (regmatch.startp[i] == NULL || regmatch.endp[i] == NULL)
+ continue;
len = (int)(regmatch.endp[i] - regmatch.startp[i]);
if (len > CMDBUFFSIZE - 5)
len = CMDBUFFSIZE - 5;
*** ../vim-7.0.020/src/version.c Tue Jun 20 16:33:21 2006
--- src/version.c Tue Jun 20 17:07:25 2006
***************
*** 668,669 ****
--- 668,671 ----
{ /* Add new patch number below this line */
+ /**/
+ 21,
/**/
--
TALL KNIGHT: We are now no longer the Knights Who Say Ni!
ONE KNIGHT: Ni!
OTHERS: Sh!
ONE KNIGHT: (whispers) Sorry.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///