Hi Todd,
in 2014, Theo scolded me when i tried to use strnlen(3) at some
place in mandoc where it wasn't really important, pointing out that
some systems still didn't have it, and saying: "Let me say simply:
Yuck." And indeed, i promptly got reports about compile failures
on Solaris.
However, in the case at hand, it really helps readability
in a function (unavoidably) already longer than comfortable
for reading it.
So, OK schwarze@
Ingo
Todd C. Miller wrote on Thu, Aug 25, 2016 at 03:43:31PM -0600:
> Index: lib/libc/stdio/vfprintf.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/stdio/vfprintf.c,v
> retrieving revision 1.75
> diff -u -p -u -r1.75 vfprintf.c
> --- lib/libc/stdio/vfprintf.c 17 Aug 2016 22:15:08 -0000 1.75
> +++ lib/libc/stdio/vfprintf.c 25 Aug 2016 21:39:16 -0000
> @@ -486,6 +486,8 @@ __vfprintf(FILE *fp, const char *fmt0, _
> * Scan the format for conversions (`%' character).
> */
> for (;;) {
> + size_t len;
> +
> cp = fmt;
> while ((n = mbrtowc(&wc, fmt, MB_CUR_MAX, &ps)) > 0) {
> fmt += n;
> @@ -886,22 +888,10 @@ fp_common:
>
> cp = "(null)";
> }
> - if (prec >= 0) {
> - /*
> - * can't use strlen; can only look for the
> - * NUL in the first `prec' characters, and
> - * strlen() will go further.
> - */
> - char *p = memchr(cp, 0, prec);
> -
> - size = p ? (p - cp) : prec;
> - } else {
> - size_t len;
> -
> - if ((len = strlen(cp)) > INT_MAX)
> - goto overflow;
> - size = (int)len;
> - }
> + len = prec >= 0 ? strnlen(cp, prec) : strlen(cp);
> + if (len > INT_MAX)
> + goto overflow;
> + size = (int)len;
> sign = '\0';
> break;
> case 'U':
>