From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69195317141 for ; Sat, 4 Apr 2026 15:35:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775316903; cv=none; b=R6OR+aPe5vunbEUvv0vG7F2RZK8q7eT2fBZdva28ysABTggbTtUnvNmmU0anT8yo01q9pIsAd115EbiHO3tqMNOJbrI0vx9e3vexhlt3jg3DcIpOI9LMkZu46gLnwxpygLvqpYStLi71IrF+CP8ximDohs4+XuS+iEtxNFvBa0k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775316903; c=relaxed/simple; bh=5sZ9Aj8qfd03JIx019qshlzxpvU60qgFAd9dFg1p6rY=; h=Date:From:To:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Nval2avB1oFUmiyqMVZr8F8LVudQpgaOmn6D7pDpBKpndO39tYDaf5jB1npZAj4eHFBDh28IOEs6PPenGExaTAndBU+9amLd8zYAImwuOyzQvb7/Y4yhIhjgAyMaTLuA8q+YDdMTtDhWrvwkjQuX605j5/t+UQeDXKcfL6xp0iQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DD1CnpVD; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DD1CnpVD" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-48374014a77so35170295e9.3 for ; Sat, 04 Apr 2026 08:35:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775316901; x=1775921701; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=rfGDxuZcdyffq8HwuywnBSmqmvDcfQ30+eHLaNQLRUk=; b=DD1CnpVD7lmv+RxJhVzk1JuHTT2qYmeBGMpTmtRZJZagueWlHhL3+buG9PwZZfO3WC o9qmK/p4UdJ6qSe2f3M9S7WtW2uE6l3Yy5oB+Jd7ANGkAorbhiXapxRywHjNhtFVJouf Y6+IL5jEwdO4e4d0mrRAck/FavWK+QiCuUpNbmckoDbSPMRWO+kNr4UmyveYypMhn5dO XlOSM8lLz5hBNoHOcbd6DfupLe09MxKpEHYo+xEnGsgwbdOrwf6NS831Ciqw4kf4oaK5 /JKXtmKvpmSvi895p4yCjcsKYiabapcaYtjDEuJQREvVtTbGltZ43+3802+CumiYTOFU iSqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775316901; x=1775921701; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rfGDxuZcdyffq8HwuywnBSmqmvDcfQ30+eHLaNQLRUk=; b=E9zZ4MgRCpc6UYmztaIhh1TLgWjbtdzOOzobjm59w1NyLSOoTOhz+cLi3D7NozVBwh 5pfCQYznICMEQM+8EcMoIuCp9e3ALfY6RP5PaDlLVxkOTxKC295yht27Ei5VI6IoBl4f G7vdo1bpoUxFu15nK/+MWLz8zMFM2UFwUI+8MvgVoQACVYRc0/dG4LpUxQi8zvKSbeOU nYkUYatqV1uHCMiPo2b1nIEig0xQRXSNWG7wsRFcbRytCZauufSZim+uLnjs+GhEKnta qQazSQZcYW/M3Z/XmuosR+sP5+axBXgjT9cVGhcJ8wwvRsI7ZDjBSLl0bBYU4Vd6lAcR 2xiQ== X-Forwarded-Encrypted: i=1; AJvYcCUdVjy0VXs1BUg7TGz8jFMs1MswVR2EtViLcEsIvDRuTXIdXRi2d4NN5ZOBBujr4+ToP+PS4nztCCWobx8=@vger.kernel.org X-Gm-Message-State: AOJu0Yyd16//8BbURN8HMc0f+SxqG5QGjAxTKlhN/W3c41RHmDyxapTu me764gg/9rPOHkFh5YTj98Iz18snTkZzxaUrAtmRwtL2SlwAtAyBbEJl X-Gm-Gg: AeBDieuz1nJlul83uMl2FwfbqF/ZDRxAb0tkaUGmjyVyRXUJxCr/AUa27O6MDuepdgd JCuoX/dEdk3/a95ASCHYBMhTzSjcJdK89QS2tY72WdMTwylrw5HuW7gJT82q3aL7fgWiWemmkLw Ll9aMknktwdcgo9z2AYk3NbMnv1r2uxvnjNO5ppZOIjDlLy9BYXwXY74eWMmM6HBAmECqSRIBzc TFhXmZMSzkcwK1JGhZiu+jxp6NoZCyMftrkDHQsEI2Mbooj+6KWy2pGnAIiEOTqqGhlDmDX69k0 cZkLoB+wfU7nXflF/vbKWoGWXnCINx17qY16uZEaIk5ec1+PdyE4xCbg/u2ULExo2rEi5pTpt9a kFHcxFklNvH4VZP5+GokCq4jWEHpUoOCsJTGFGxyuOP60ddN0K0hkQxH2i6OZGLsqns49VTKluV 7EzfUTl5dVGVGnKzWgIRQmZt8rodGks25PC3yb5IRI X-Received: by 2002:a05:600c:1d86:b0:480:1d0b:2d32 with SMTP id 5b1f17b1804b1-48899719a00mr90845515e9.12.1775316900511; Sat, 04 Apr 2026 08:35:00 -0700 (PDT) Received: from pumpkin ([31.55.121.85]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488980e7a29sm61478825e9.4.2026.04.04.08.35.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Apr 2026 08:35:00 -0700 (PDT) Date: Sat, 4 Apr 2026 16:34:59 +0100 From: David Laight To: Thomas =?UTF-8?B?V2Vpw59zY2h1aA==?= Cc: Willy Tarreau , linux-kernel@vger.kernel.org Subject: Re: [PATCH 3/3] tools/nolibc: add support for asprintf() Message-ID: <20260404163459.7cbe9d24@pumpkin> In-Reply-To: <20260401-nolibc-asprintf-v1-3-46292313439f@weissschuh.net> References: <20260401-nolibc-asprintf-v1-0-46292313439f@weissschuh.net> <20260401-nolibc-asprintf-v1-3-46292313439f@weissschuh.net> X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; arm-unknown-linux-gnueabihf) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Wed, 01 Apr 2026 17:07:29 +0200 Thomas Wei=C3=9Fschuh wrote: > Add support for dynamically allocating formatted strings through > asprintf() and vasprintf(). >=20 > Signed-off-by: Thomas Wei=C3=9Fschuh > --- > tools/include/nolibc/stdio.h | 50 ++++++++++++++++++++++= ++++++ > tools/testing/selftests/nolibc/nolibc-test.c | 24 +++++++++++++ > 2 files changed, 74 insertions(+) >=20 > diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h > index 8f7e1948a651..1c9287b558f0 100644 > --- a/tools/include/nolibc/stdio.h > +++ b/tools/include/nolibc/stdio.h > @@ -787,6 +787,56 @@ int sprintf(char *buf, const char *fmt, ...) > return ret; > } > =20 > +static __attribute__((unused, format(printf, 2, 0))) > +int __nolibc_vasprintf(char **strp, const char *fmt, va_list args1, va_l= ist args2) > +{ > + char *buf; > + int len; > + > + len =3D vsnprintf(NULL, 0, fmt, args1); > + if (len < 0) > + return -1; vsnprintf() can never fail. > + > + buf =3D malloc(len + 1); > + if (!buf) > + return -1; > + > + len =3D vsnprintf(buf, len + 1, fmt, args2); It is possible to get a different length. Even without threads data might come from an mmap()ed file that is changed by another process. So you need to check that the length doesn't increase. David > + if (len < 0) { > + free(buf); > + return -1; > + } > + > + *strp =3D buf; > + return len; > +} > + > +static __attribute__((unused, format(printf, 2, 0))) > +int vasprintf(char **strp, const char *fmt, va_list args) > +{ > + va_list args2; > + int ret; > + > + va_copy(args2, args); > + ret =3D __nolibc_vasprintf(strp, fmt, args, args2); > + va_end(args2); > + > + return ret; > +} > + > +static __attribute__((unused, format(printf, 2, 3))) > +int asprintf(char **strp, const char *fmt, ...) > +{ > + va_list args; > + int ret; > + > + va_start(args, fmt); > + ret =3D vasprintf(strp, fmt, args); > + va_end(args); > + > + return ret; > +} > + > static __attribute__((unused)) > int vsscanf(const char *str, const char *format, va_list args) > { > diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing= /selftests/nolibc/nolibc-test.c > index c888e13c6bd8..98070b805e49 100644 > --- a/tools/testing/selftests/nolibc/nolibc-test.c > +++ b/tools/testing/selftests/nolibc/nolibc-test.c > @@ -1859,6 +1859,29 @@ static int test_printf_error(void) > return 0; > } > =20 > +int test_asprintf(void) > +{ > + char *str; > + int ret; > + > + ret =3D asprintf(&str, "foo%s", "bar"); > + if (ret =3D=3D -1) > + return 1; > + > + if (ret !=3D 6) { > + free(str); > + return 2; > + } > + > + if (memcmp(str, "foobar", 6) !=3D 0) { > + free(str); > + return 3; > + } > + > + free(str); > + return 0; > +} > + > static int run_printf(int min, int max) > { > int test; > @@ -1921,6 +1944,7 @@ static int run_printf(int min, int max) > CASE_TEST(errno-neg); errno =3D -22; EXPECT_VFPRINTF(is_nolibc, "er= rno=3D-22 ", "%-12m"); break; > CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; > CASE_TEST(printf_error); EXPECT_ZR(1, test_printf_error()); break; > + CASE_TEST(asprintf); EXPECT_ZR(1, test_asprintf()); break; > case __LINE__: > return ret; /* must be last */ > /* note: do not set any defaults so as to permit holes above */ >=20