Thread (10 messages) 10 messages, 3 authors, 2016-06-15

Re: [PATCH 0/4] refactor the --color-words to make it more hackable

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:45:55
Subsystem: the rest · Maintainer: Linus Torvalds

Hi,

On Sun, 11 Jan 2009, Thomas Rast wrote:
Johannes Schindelin wrote:
quoted
But at least _I_ think it is easy to follow, and it actually makes the code
more readable/hackable.  Correct me if I'm wrong.
It indeed seems a sane approach.
Thanks.
 However, the final result segfaults and/or prints garbage (on 
apparently every commit except very small changes) when using the regex 
'\S+', which IMHO should give exactly the same result as not using a 
regex at all.
No, it should not.  The correct regex is '^\S+'.

As it happens, your regex matches _anything_ + non-whitespace.  
Unfortunately, this includes a newline which utterly confuses the diff, 
and therefore the code that tries to get the true offsets.

Consequently, it crashes.
Plain --color-words is not affected.
Of course, I did not change anything outside the code path of 
--color-words.

Ciao,
Dscho

-- snipsnap --
[PATCH] color-words: \n must not be a part of the word.

Allowing \n as part of a word is a pilot error, but that is not a 
reason for the code to crash.

Signed-off-by: Johannes Schindelin <redacted>
---
 diff.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/diff.c b/diff.c
index d6bba72..676eb79 100644
--- a/diff.c
+++ b/diff.c
@@ -381,8 +381,10 @@ static int find_word_boundary(mmfile_t *buffer, int i, regex_t *word_regex)
 
 	if (word_regex) {
 		regmatch_t match[1];
-		if (!regexec(word_regex, buffer->ptr + i, 1, match, 0))
-			i += match[0].rm_eo;
+		if (!regexec(word_regex, buffer->ptr + i, 1, match, 0)) {
+			char *p = memchr(buffer->ptr + i, '\n', match[0].rm_eo);
+			i = p ? p - buffer->ptr : match[0].rm_eo + i;
+		}
 	}
 	else
 		while (i < buffer->size && !isspace(buffer->ptr[i]))
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help