The previous code used strtoul() without any checks that it succeeded.
Instead use convert_l(), in strict mode, and die() if there is an
error. This tightens up the parsing:
* Leading whitespace is no longer allowed
* '+' and '-' are no longer allowed
* Trailing junk is not allowed
Signed-off-by: Michael Haggerty <redacted>
---
diff.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/diff.c b/diff.c
index abc32c8..a350677 100644
--- a/diff.c
+++ b/diff.c
@@ -2,6 +2,7 @@
* Copyright (C) 2005 Junio C Hamano
*/
#include "cache.h"
+#include "numparse.h"
#include "quote.h"
#include "diff.h"
#include "diffcore.h"
@@ -2393,12 +2394,12 @@ static void builtin_diff(const char *name_a,
xecfg.flags |= XDL_EMIT_FUNCCONTEXT;
if (pe)
xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags);
- if (!diffopts)
- ;
- else if (skip_prefix(diffopts, "--unified=", &v))
- xecfg.ctxlen = strtoul(v, NULL, 10);
- else if (skip_prefix(diffopts, "-u", &v))
- xecfg.ctxlen = strtoul(v, NULL, 10);
+ if (diffopts
+ && (skip_prefix(diffopts, "--unified=", &v) ||
+ skip_prefix(diffopts, "-u", &v))) {
+ if (convert_l(v, 10, &xecfg.ctxlen))
+ die("--unified argument must be a non-negative integer");
+ }
if (o->word_diff)
init_diff_words_data(&ecbdata, o, one, two);
xdi_diff_outf(&mf1, &mf2, fn_out_consume, &ecbdata,--
2.1.4