diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2005-10-01 18:38:09 +1000 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2005-10-01 18:38:09 +1000 |
commit | 9b1fc991e07698d637f3dacb608be7ceb9ca853d (patch) | |
tree | 4c3e59ce4c77f32e451dda8c30076dc90d95e81c | |
parent | Added eflag fixes for trap and minusc. (diff) | |
download | dash-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.
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/input.c | 6 |
2 files changed, 7 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index a01503a..e7253d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-10-01 Herbert Xu <herbert@gondor.apana.org.au> + + * Skip NUL characters properly in input.c + 2005-03-28 Herbert Xu <herbert@gondor.apana.org.au> * Removed some unnecessary inclusions of input.h. 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; |