summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2005-10-01 18:38:09 +1000
committerHerbert Xu <herbert@gondor.apana.org.au>2005-10-01 18:38:09 +1000
commit9b1fc991e07698d637f3dacb608be7ceb9ca853d (patch)
tree4c3e59ce4c77f32e451dda8c30076dc90d95e81c /src
parentAdded eflag fixes for trap and minusc. (diff)
downloaddash-9b1fc991e07698d637f3dacb608be7ceb9ca853d.tar.gz
dash-9b1fc991e07698d637f3dacb608be7ceb9ca853d.zip
[INPUT] Fix NUL skipping in preadbuffer
On Sun, Sep 25, 2005 at 07:50:54PM +0000, Gerrit Pape wrote:
> On Sat, Sep 03, 2005 at 02:56:00PM +0200, Martin Dickopp wrote:
> > When analysing the bug I came to the following conclusion: The loop
> > beginning at input.c:302 overwrites a single input line with itself,
> > skipping NUL characters. Therefore, after the loop the line buffer
> > has less characters than originally read if and only if the input line
> > contains NUL characters.
>
> yes.  Thanks a lot for the details and patch.
>
> > The pointer that is used to read from the buffer, 'parsenextc' (cf.
> > input.h:66), is also used as the beginning of the next line in
> > input.c:296. This fails if the buffer contains less characters
> > than originally read into it due to NUL characters.
> >
> > The proposed patch (attached) keeps track of the number of skipped
> > characters and advances 'parsenextc' accordingly before processing
> > the next input line.
>
> Hi Herbert, please see
>  http://bugs.debian.org/317516

Instead of moving the characters in the loop, we will do memmove every
time we see a NUL character.  This hurts if there are a lot of NUL
characters, but should be a win in normal situations.
Diffstat (limited to 'src')
-rw-r--r--src/input.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/input.c b/src/input.c
index 8c874c6..8a43824 100644
--- a/src/input.c
+++ b/src/input.c
@@ -300,9 +300,9 @@ again:
 	something = 0;
 #endif
 	for (more = 1; more;) {
-		switch (*p) {
+		switch (*p++) {
 		case '\0':
-			p++;	/* Skip nul */
+			p = memmove(q, p, parselleft);
 			goto check;
 
 #ifndef SMALL
@@ -323,7 +323,7 @@ again:
 #endif
 		}
 
-		*q++ = *p++;
+		q++;
 check:
 		if (--parselleft <= 0 && more) {
 			parsenleft = q - parsenextc - 1;