Mercurial > public > mercurial-scm > hg
diff mercurial/cext/manifest.c @ 40599:9eeda7199181
manifest: make sure there's a filename before bothering to look for newline
There's no valid manifest that would have no characters before the NUL byte on
a line, and this fixes some erratic timeouts in the fuzzer.
Differential Revision: https://phab.mercurial-scm.org/D5256
author | Augie Fackler <augie@google.com> |
---|---|
date | Mon, 12 Nov 2018 20:35:22 -0500 |
parents | 5405cb1a7901 |
children | f27f8e9ef1e7 |
line wrap: on
line diff
--- a/mercurial/cext/manifest.c Tue Nov 06 11:12:56 2018 -0500 +++ b/mercurial/cext/manifest.c Mon Nov 12 20:35:22 2018 -0500 @@ -38,6 +38,7 @@ #define MANIFEST_OOM -1 #define MANIFEST_NOT_SORTED -2 #define MANIFEST_MALFORMED -3 +#define MANIFEST_BOGUS_FILENAME -4 /* get the length of the path for a line */ static size_t pathlen(line *l) @@ -115,7 +116,13 @@ char *prev = NULL; while (len > 0) { line *l; - char *next = memchr(data, '\n', len); + char *next; + if (*data == '\0') { + /* It's implausible there's no filename, don't + * even bother looking for the newline. */ + return MANIFEST_BOGUS_FILENAME; + } + next = memchr(data, '\n', len); if (!next) { return MANIFEST_MALFORMED; } @@ -190,6 +197,11 @@ PyErr_Format(PyExc_ValueError, "Manifest did not end in a newline."); break; + case MANIFEST_BOGUS_FILENAME: + PyErr_Format( + PyExc_ValueError, + "Manifest had an entry with a zero-length filename."); + break; default: PyErr_Format(PyExc_ValueError, "Unknown problem parsing manifest.");