Messages in this thread | | | Date | Tue, 24 Nov 2015 01:10:20 +0200 | Subject | Re: [PATCH 08/14] lib/kasprintf.c: add sanity check to kvasprintf | From | Andy Shevchenko <> |
| |
On Mon, Nov 23, 2015 at 11:29 PM, Rasmus Villemoes <linux@rasmusvillemoes.dk> wrote: > kasprintf relies on being able to replay the formatting and getting > the same result (in particular, the same length). This will almost > always work, but it is possible that the object pointed to by a %s or > %p argument changed under us (so we might get truncated output). Add a > somewhat paranoid sanity check and let's see if it ever triggers. > > Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> > --- > lib/kasprintf.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/lib/kasprintf.c b/lib/kasprintf.c > index f194e6e593e1..7f6c506a4942 100644 > --- a/lib/kasprintf.c > +++ b/lib/kasprintf.c > @@ -13,19 +13,21 @@ > /* Simplified asprintf. */ > char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap) > { > - unsigned int len; > + unsigned int first, second;
vsnprintf() returns plain int. Perhaps change the type to follow the function.
> char *p; > va_list aq; > > va_copy(aq, ap); > - len = vsnprintf(NULL, 0, fmt, aq); > + first = vsnprintf(NULL, 0, fmt, aq); > va_end(aq); > > - p = kmalloc_track_caller(len+1, gfp); > + p = kmalloc_track_caller(first+1, gfp); > if (!p) > return NULL; > > - vsnprintf(p, len+1, fmt, ap); > + second = vsnprintf(p, first+1, fmt, ap); > + WARN(first != second, "different return values (%u and %u) from vsnprintf(\"%s\", ...)", > + first, second, fmt); > > return p; > } > -- > 2.6.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/
-- With Best Regards, Andy Shevchenko
| |