On Sat, Aug 27, 2016 at 07:34:53PM +0200, Ingo Schwarze wrote:
> Hi Todd,
>
> Todd C. Miller wrote on Sat, Aug 27, 2016 at 10:28:14AM -0600:
>
> > Now that we have a handy size_t scratch variable,
> > we can use it to store the return value of mbrtowc()
> > instead of storing it in an int. Worth it or overkill?
>
> Some interfaces are specifically designed to trap the unwary.
> That includes mb[r]towc(3), in multiple respects. When dealing with
> such trapful interfaces, paying extra attention to careful idiomatics
> helps auditing and ultimately catching and avoiding some of the
> unavoidable errors. Hence, worth it.
>
> OK schwarze@
> Ingo
I agree. OK by me as well.
> > Index: lib/libc/stdio/vfprintf.c
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/stdio/vfprintf.c,v
> > retrieving revision 1.76
> > diff -u -p -u -r1.76 vfprintf.c
> > --- lib/libc/stdio/vfprintf.c 27 Aug 2016 16:10:40 -0000 1.76
> > +++ lib/libc/stdio/vfprintf.c 27 Aug 2016 16:26:04 -0000
> > @@ -489,17 +489,17 @@ __vfprintf(FILE *fp, const char *fmt0, _
> > size_t len;
> >
> > cp = fmt;
> > - while ((n = mbrtowc(&wc, fmt, MB_CUR_MAX, &ps)) > 0) {
> > - fmt += n;
> > + while ((len = mbrtowc(&wc, fmt, MB_CUR_MAX, &ps)) != 0) {
> > + if (len == (size_t)-1 || len == (size_t)-2) {
> > + ret = -1;
> > + goto error;
> > + }
> > + fmt += len;
> > if (wc == '%') {
> > fmt--;
> > break;
> > }
> > }
> > - if (n < 0) {
> > - ret = -1;
> > - goto error;
> > - }
> > if (fmt != cp) {
> > ptrdiff_t m = fmt - cp;
> > if (m < 0 || m > INT_MAX - ret)
> > @@ -507,7 +507,7 @@ __vfprintf(FILE *fp, const char *fmt0, _
> > PRINT(cp, m);
> > ret += m;
> > }
> > - if (n == 0)
> > + if (len == 0)
> > goto done;
> > fmt++; /* skip over '%' */
> >
> > @@ -1217,17 +1217,19 @@ __find_arguments(const char *fmt0, va_li
> > * Scan the format for conversions (`%' character).
> > */
> > for (;;) {
> > + size_t len;
> > +
> > cp = fmt;
> > - while ((n = mbrtowc(&wc, fmt, MB_CUR_MAX, &ps)) > 0) {
> > - fmt += n;
> > + while ((len = mbrtowc(&wc, fmt, MB_CUR_MAX, &ps)) != 0) {
> > + if (len == (size_t)-1 || len == (size_t)-2)
> > + return (-1);
> > + fmt += len;
> > if (wc == '%') {
> > fmt--;
> > break;
> > }
> > }
> > - if (n < 0)
> > - return (-1);
> > - if (n == 0)
> > + if (len == 0)
> > goto done;
> > fmt++; /* skip over '%' */
> >
>