The fix in
10e6d0bd57 ("BUG/MINOR: tools: only fill first empty arg when
not out of range") was not that good. It focused on protecting against
<arg> becoming out of range to detect we haven't emitted anything, but
it's not the right way to detect this. We're always maintaining arg_start
as a copy of outpos, and that later one is incremented when emitting a
char, so instead of testing args[arg] against out+arg_start, we should
instead check outpos against arg_start, thereby eliminating the <out>
offset and the need to access args[]. This way we now always know if
we've emitted an empty arg without dereferencing args[].
There's no need to backport this unless the fix above is also backported.
err |= PARSE_ERR_TOOMANY;
}
if (prev_in_arg && !in_arg) {
- if (!empty_arg_ptr && arg < argsmax && args[arg] == out + arg_start)
+ if (!empty_arg_ptr && outpos == arg_start)
empty_arg_ptr = begin_new_arg;
EMIT_CHAR(0);
arg++;
}
if (prev_in_arg && !in_arg) {
- if (!empty_arg_ptr && arg < argsmax && args[arg] == out + arg_start)
+ if (!empty_arg_ptr && outpos == arg_start)
empty_arg_ptr = begin_new_arg;
EMIT_CHAR(0);
arg++;
+ arg_start = outpos;
}
}
/* end of output string */
if (in_arg) {
- if (!empty_arg_ptr && arg < argsmax && args[arg] == out + arg_start)
+ if (!empty_arg_ptr && outpos == arg_start)
empty_arg_ptr = begin_new_arg;
EMIT_CHAR(0);
arg++;
+ arg_start = outpos;
}
if (quote) {