From nobody Tue Mar 14 05:03:33 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4PbLyp0dVSz3xjYN for ; Tue, 14 Mar 2023 05:03:46 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "GTS CA 1D4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4PbLyn3kwFz4Drw for ; Tue, 14 Mar 2023 05:03:45 +0000 (UTC) (envelope-from wlosh@bsdimp.com) Authentication-Results: mx1.freebsd.org; none Received: by mail-ed1-x531.google.com with SMTP id y4so27726759edo.2 for ; Mon, 13 Mar 2023 22:03:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bsdimp-com.20210112.gappssmtp.com; s=20210112; t=1678770224; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=PfudQYaNhzLovwnem6JcPuFFdP1AAD76qF6+pJqcUbA=; b=pr03Rc7/9qGLGXfRNah8ziRRKITf1W406dJuXXz9NyAyKdcOakjHAbK1Vh209YMqmJ bjvrIXykEuhz1OV0h8FbIHSwHfuC7bME1vO3le3O4IQ2xHdaQJaibh29lk0tr1Z92/g6 e/0bCDKe5aWGzblEVQjlmjDv7jKJlVs9WNE5dc17Vsy8Pdlq0Oeu7+cUBW9hVWadsEtX 9ViMyaCsHRijcw4luDcmoGc9zspEWB8BLJazSVHFQspQ9+i/B+1bRNKvjvrDfpsqpSD2 p0TF6/9PikjCzkcd4t9pBr9uMzYqrQ1MxvmuODBhHTsvzZUniHg0p5EKUhztJOn0EltH h91A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678770224; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=PfudQYaNhzLovwnem6JcPuFFdP1AAD76qF6+pJqcUbA=; b=N/yaodGj1AXK8EEI2GvxmE/MIh1ICGGjfbd99Se1RCX1dEDLREKZFVDuBIED4weTED LspyrCx92HUa9el+qsRFQJ+w8341xN+IpdHQ/Mtj7nN/NDEZ08n1lZv7Ru2vT45sg8at lCttPL3QgF02je6wo7enwdkkM9H+ouh1iMmxSwY3LB2h4YR0+6GijfdupePF4E2ZQCAA ymoLdf3mcTk3SS3srAf24BLoYKaxK3zBNEYF2pRW/+hzsiHx5/eYZMbqdpy50frwCCjZ e89U5MJFJZU/dSqnjJDvpKPnUet4+nGJCsGRWc4rWhVn6iNi3TGIoLxjnuw82R5Ngjs+ rr1Q== X-Gm-Message-State: AO0yUKWTzIjKf3De/d19+j/7mmC4pOC9gUaUkwc/rj2S9LVYtbnWnZ5/ hlGSYCqilRnTNX/cH9lfXt2y6EBcHfXgMiiwkWkZrg== X-Google-Smtp-Source: AK7set+ApGku72amcXqcExCZfybhfnnuOcuZR3X3v5jyebCvubjwoLTQnQUZ6MaQ4uhPPUFPkRfnSOQyV6qAz5Kfe+c= X-Received: by 2002:a17:906:c30e:b0:8ad:d366:54c4 with SMTP id s14-20020a170906c30e00b008add36654c4mr573700ejz.4.1678770224017; Mon, 13 Mar 2023 22:03:44 -0700 (PDT) List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 References: <202303140419.32E4Jtsd058392@gitrepo.freebsd.org> In-Reply-To: From: Warner Losh Date: Mon, 13 Mar 2023 23:03:33 -0600 Message-ID: Subject: Re: git: adeca21464d2 - main - Add GNU glibc compatible secure_getenv To: Jessica Clarke Cc: Warner Losh , src-committers , "" , dev-commits-src-main@freebsd.org Content-Type: multipart/alternative; boundary="000000000000dcc71305f6d52663" X-Rspamd-Queue-Id: 4PbLyn3kwFz4Drw X-Spamd-Bar: ---- X-Spamd-Result: default: False [-4.00 / 15.00]; REPLY(-4.00)[]; ASN(0.00)[asn:15169, ipnet:2a00:1450::/32, country:US] X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-ThisMailContainsUnwantedMimeParts: N --000000000000dcc71305f6d52663 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Mar 13, 2023, 10:45 PM Jessica Clarke wrote: > On 14 Mar 2023, at 04:37, Warner Losh wrote: > > > > > > > > On Mon, Mar 13, 2023, 10:21 PM Jessica Clarke > wrote: > > On 14 Mar 2023, at 04:19, Warner Losh wrote: > > > > > > The branch main has been updated by imp: > > > > > > URL: > https://cgit.FreeBSD.org/src/commit/?id=3Dadeca21464d25bc61f98968a5c1e76a= b3c808ae4 > > > > > > commit adeca21464d25bc61f98968a5c1e76ab3c808ae4 > > > Author: lucy > > > AuthorDate: 2023-03-13 22:01:12 +0000 > > > Commit: Warner Losh > > > CommitDate: 2023-03-14 04:19:24 +0000 > > > > > > Add GNU glibc compatible secure_getenv > > > > > > Add mostly glibc and msl compatible secure_getenv. Return NULL if > > > issetugid() indicates the process is tainted, otherwise getenv(x). > The > > > rational behind this is the fact that many Linux applications use > this > > > function instead of getenv() as it's widely consider a, "best > > > practice". > > > > > > Reviewed by: imp, mjg (feedback) > > > Pull Request: https://github.com/freebsd/freebsd-src/pull/686 > > > Signed-off-by: Lucy Marsh > > > --- > > > include/stdlib.h | 1 + > > > lib/libc/stdlib/Makefile.inc | 4 ++-- > > > lib/libc/stdlib/Symbol.map | 1 + > > > lib/libc/stdlib/getenv.3 | 26 +++++++++++++++++++++++++- > > > lib/libc/stdlib/getenv.c | 12 ++++++++++++ > > > 5 files changed, 41 insertions(+), 3 deletions(-) > > > > > > diff --git a/include/stdlib.h b/include/stdlib.h > > > index 01629ed84a11..c41e8704e810 100644 > > > --- a/include/stdlib.h > > > +++ b/include/stdlib.h > > > @@ -111,6 +111,7 @@ void qsort(void *, size_t, size_t, > > > int (* _Nonnull)(const void *, const void *)); > > > int rand(void); > > > void *realloc(void *, size_t) __result_use_check __alloc_size(2); > > > +char *secure_getenv(const char *); > > > void srand(unsigned); > > > double strtod(const char * __restrict, char ** __restrict); > > > float strtof(const char * __restrict, char ** __restrict); > > > diff --git a/lib/libc/stdlib/Makefile.inc > b/lib/libc/stdlib/Makefile.inc > > > index 8ace2c051b82..964e7ce30594 100644 > > > --- a/lib/libc/stdlib/Makefile.inc > > > +++ b/lib/libc/stdlib/Makefile.inc > > > @@ -46,8 +46,8 @@ MAN+=3D a64l.3 abort.3 abs.3 alloca.3 atexit.= 3 > atof.3 \ > > > MLINKS+=3Da64l.3 l64a.3 a64l.3 l64a_r.3 > > > MLINKS+=3Datol.3 atoll.3 > > > MLINKS+=3Dexit.3 _Exit.3 > > > -MLINKS+=3Dgetenv.3 clearenv.3 getenv.3 putenv.3 getenv.3 setenv.3 \ > > > - getenv.3 unsetenv.3 > > > +MLINKS+=3Dgetenv.3 clearenv.3 getenv.3 putenv.3 getenv.3 > secure_getenv.3 \ > > > + getenv.3 setenv.3 getenv.3 unsetenv.3 > > > MLINKS+=3Dgetopt_long.3 getopt_long_only.3 > > > MLINKS+=3Dhcreate.3 hdestroy.3 hcreate.3 hsearch.3 > > > MLINKS+=3Dhcreate.3 hcreate_r.3 hcreate.3 hdestroy_r.3 hcreate.3 > hsearch_r.3 > > > diff --git a/lib/libc/stdlib/Symbol.map b/lib/libc/stdlib/Symbol.map > > > index 9d2944fdb7e9..a105f781734d 100644 > > > --- a/lib/libc/stdlib/Symbol.map > > > +++ b/lib/libc/stdlib/Symbol.map > > > @@ -128,6 +128,7 @@ FBSD_1.6 { > > > FBSD_1.7 { > > > clearenv; > > > qsort_r; > > > + secure_getenv; > > > }; > > > > > > FBSDprivate_1.0 { > > > diff --git a/lib/libc/stdlib/getenv.3 b/lib/libc/stdlib/getenv.3 > > > index 5566d7b01dcd..93c0d2ada6ad 100644 > > > --- a/lib/libc/stdlib/getenv.3 > > > +++ b/lib/libc/stdlib/getenv.3 > > > @@ -32,13 +32,14 @@ > > > .\" @(#)getenv.3 8.2 (Berkeley) 12/11/93 > > > .\" $FreeBSD$ > > > .\" > > > -.Dd November 7, 2021 > > > +.Dd March 13, 2023 > > > .Dt GETENV 3 > > > .Os > > > .Sh NAME > > > .Nm clearenv , > > > .Nm getenv , > > > .Nm putenv , > > > +.Nm secure_getenv , > > > .Nm setenv , > > > .Nm unsetenv > > > .Nd environment variable functions > > > @@ -50,6 +51,8 @@ > > > .Fn clearenv "void" > > > .Ft char * > > > .Fn getenv "const char *name" > > > +.Ft char * > > > +.Fn secure_getenv "const char *name" > > > .Ft int > > > .Fn setenv "const char *name" "const char *value" "int overwrite" > > > .Ft int > > > @@ -78,6 +81,20 @@ to by the > > > .Fn getenv > > > function. > > > .Pp > > > +The GNU-specific function, > > > > I don=E2=80=99t think it is now?.. > > > > Yes... > > > > > +.Fn secure_getenv > > > +wraps the > > > +.Fn getenv > > > +function to prevent it from being run in "secure execution". > > > +Unlike in glibc, > > > +.Fn secure_getenv > > > +only checks if the > > > +.Fa setuid > > > +and > > > +.Fa setgid > > > +bits have been set or changed. > > > +These checks are subject to extension and change. > > > +.Pp > > > The > > > .Fn setenv > > > function inserts or resets the environment variable > > > @@ -139,6 +156,13 @@ is not in the current environment, > > > .Dv NULL > > > is returned. > > > .Pp > > > +The > > > +.Fn secure_getenv > > > +function returns > > > +.Dv NULL > > > +if the process is in "secure execution," otherwise it will call > > > +.Fn getenv . > > > +.Pp > > > .Rv -std clearenv setenv putenv unsetenv > > > .Sh ERRORS > > > .Bl -tag -width Er > > > diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c > > > index 7ca27ab710c4..86a846d58c69 100644 > > > --- a/lib/libc/stdlib/getenv.c > > > +++ b/lib/libc/stdlib/getenv.c > > > @@ -447,6 +447,18 @@ getenv(const char *name) > > > } > > > > > > > > > +/* > > > + * Runs getenv() unless the current process is tainted by uid or gid > changes, in > > > + * which case it will return NULL. > > > + */ > > > +char * > > > +secure_getenv(const char *name) > > > +{ > > > + if (issetugid()) > > > + return NULL; > > > + return getenv(name); > > > > return (...); > > > > (x2) > > > > style(9) says they are optional now so it's below my radar.... but > honestly, it's good enough given the dozen other issues fixed in the pr. > > I still see "Values in return statements should be enclosed in > parentheses."? Which isn=E2=80=99t an RFC SHOULD, much of style(9) is sho= uld > rather than must. > We need to do a pass to use rfc language. In this case, thought it's been encouraged but not required for a long time. I added the explicit language years ago since it was only by example prior to that. I thought this was one of the many lossenings we've had over the years, but if so there's been no update since I added the should language... I know I've committed a lot of new code without it over the years... It may just have been a combo of many other projects forbidding the practice and it was one of the variations my script found... I'll have to go find the script to see. But like I said before... git clang-format... Warner Jess > > > Though I'll see about adding git clang-format setup to check. I wrote a > stupidly simple script to check 2 years ago and the commits coming in at > the time had way more exceptions and variations than I thought I'd catch > when I tested it out... but it could be turned into a gihub action easily > enough I think. > > > > Warner > > > > Jess > > > > > +} > > > + > > > /* > > > * Set the value of a variable. Older settings are labeled as > inactive. If an > > > * older setting has enough room to store the new value, it will be > reused. No > > --000000000000dcc71305f6d52663 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


On Mon, Mar 13, 2023, 10:45 PM Jessica Clarke <jrtc= 27@freebsd.org> wrote:
On 14= Mar 2023, at 04:37, Warner Losh <imp@bsdimp.com> wrote:<= br> >
>
>
> On Mon, Mar 13, 2023, 10:21 PM Jessica Clarke <jrtc27@fr= eebsd.org> wrote:
> On 14 Mar 2023, at 04:19, Warner Losh <imp@FreeBSD.org> wrote: > >
> > The branch main has been updated by imp:
> >
> > URL: https://cgit.FreeBSD.org/src/commit/?id=3Dadeca21464d25b= c61f98968a5c1e76ab3c808ae4
> >
> > commit adeca21464d25bc61f98968a5c1e76ab3c808ae4
> > Author:=C2=A0 =C2=A0 =C2=A0lucy <seafork@disroot.o= rg>
> > AuthorDate: 2023-03-13 22:01:12 +0000
> > Commit:=C2=A0 =C2=A0 =C2=A0Warner Losh <imp@FreeBSD.org> > > CommitDate: 2023-03-14 04:19:24 +0000
> >
> >=C2=A0 =C2=A0 Add GNU glibc compatible secure_getenv
> >
> >=C2=A0 =C2=A0 Add mostly glibc and msl compatible secure_getenv. R= eturn NULL if
> >=C2=A0 =C2=A0 issetugid() indicates the process is tainted, otherw= ise getenv(x).=C2=A0 The
> >=C2=A0 =C2=A0 rational behind this is the fact that many Linux app= lications use this
> >=C2=A0 =C2=A0 function instead of getenv() as it's widely cons= ider a, "best
> >=C2=A0 =C2=A0 practice".
> >
> >=C2=A0 =C2=A0 Reviewed by: imp, mjg (feedback)
> >=C2=A0 =C2=A0 Pull Request: https://github.com/freebsd/freebsd-src/pull/686
> >=C2=A0 =C2=A0 Signed-off-by: Lucy Marsh <seafork@di= sroot.org>
> > ---
> > include/stdlib.h=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|= =C2=A0 1 +
> > lib/libc/stdlib/Makefile.inc |=C2=A0 4 ++--
> > lib/libc/stdlib/Symbol.map=C2=A0 =C2=A0|=C2=A0 1 +
> > lib/libc/stdlib/getenv.3=C2=A0 =C2=A0 =C2=A0| 26 ++++++++++++++++= +++++++++-
> > lib/libc/stdlib/getenv.c=C2=A0 =C2=A0 =C2=A0| 12 ++++++++++++
> > 5 files changed, 41 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/stdlib.h b/include/stdlib.h
> > index 01629ed84a11..c41e8704e810 100644
> > --- a/include/stdlib.h
> > +++ b/include/stdlib.h
> > @@ -111,6 +111,7 @@ void=C2=A0 =C2=A0 =C2=A0 =C2=A0qsort(void *, = size_t, size_t,
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int (* _Nonnull)(const vo= id *, const void *));
> > int=C2=A0 =C2=A0 rand(void);
> > void=C2=A0 *realloc(void *, size_t) __result_use_check __alloc_si= ze(2);
> > +char *secure_getenv(const char *);
> > void=C2=A0 =C2=A0srand(unsigned);
> > double=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0strtod(const char * __res= trict, char ** __restrict);
> > float=C2=A0 strtof(const char * __restrict, char ** __restrict);<= br> > > diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makef= ile.inc
> > index 8ace2c051b82..964e7ce30594 100644
> > --- a/lib/libc/stdlib/Makefile.inc
> > +++ b/lib/libc/stdlib/Makefile.inc
> > @@ -46,8 +46,8 @@ MAN+=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0a64l.3 abort.= 3 abs.3 alloca.3 atexit.3 atof.3 \
> > MLINKS+=3Da64l.3 l64a.3 a64l.3 l64a_r.3
> > MLINKS+=3Datol.3 atoll.3
> > MLINKS+=3Dexit.3 _Exit.3
> > -MLINKS+=3Dgetenv.3 clearenv.3 getenv.3 putenv.3 getenv.3 setenv.= 3 \
> > -=C2=A0 =C2=A0 =C2=A0getenv.3 unsetenv.3
> > +MLINKS+=3Dgetenv.3 clearenv.3 getenv.3 putenv.3 getenv.3 secure_= getenv.3 \
> > +=C2=A0 =C2=A0 =C2=A0getenv.3 setenv.3 getenv.3 unsetenv.3
> > MLINKS+=3Dgetopt_long.3 getopt_long_only.3
> > MLINKS+=3Dhcreate.3 hdestroy.3 hcreate.3 hsearch.3
> > MLINKS+=3Dhcreate.3 hcreate_r.3 hcreate.3 hdestroy_r.3 hcreate.3 = hsearch_r.3
> > diff --git a/lib/libc/stdlib/Symbol.map b/lib/libc/stdlib/Symbol.= map
> > index 9d2944fdb7e9..a105f781734d 100644
> > --- a/lib/libc/stdlib/Symbol.map
> > +++ b/lib/libc/stdlib/Symbol.map
> > @@ -128,6 +128,7 @@ FBSD_1.6 {
> > FBSD_1.7 {
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0clearenv;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0qsort_r;
> > +=C2=A0 =C2=A0 =C2=A0secure_getenv;
> > };
> >
> > FBSDprivate_1.0 {
> > diff --git a/lib/libc/stdlib/getenv.3 b/lib/libc/stdlib/getenv.3<= br> > > index 5566d7b01dcd..93c0d2ada6ad 100644
> > --- a/lib/libc/stdlib/getenv.3
> > +++ b/lib/libc/stdlib/getenv.3
> > @@ -32,13 +32,14 @@
> > .\"=C2=A0 =C2=A0 =C2=A0@(#)getenv.3=C2=A0 8.2 (Berkeley) 12/= 11/93
> > .\" $FreeBSD$
> > .\"
> > -.Dd November 7, 2021
> > +.Dd March 13, 2023
> > .Dt GETENV 3
> > .Os
> > .Sh NAME
> > .Nm clearenv ,
> > .Nm getenv ,
> > .Nm putenv ,
> > +.Nm secure_getenv ,
> > .Nm setenv ,
> > .Nm unsetenv
> > .Nd environment variable functions
> > @@ -50,6 +51,8 @@
> > .Fn clearenv "void"
> > .Ft char *
> > .Fn getenv "const char *name"
> > +.Ft char *
> > +.Fn secure_getenv "const char *name"
> > .Ft int
> > .Fn setenv "const char *name" "const char *value&q= uot; "int overwrite"
> > .Ft int
> > @@ -78,6 +81,20 @@ to by the
> > .Fn getenv
> > function.
> > .Pp
> > +The GNU-specific function,
>
> I don=E2=80=99t think it is now?..
>
> Yes...
>
> > +.Fn secure_getenv
> > +wraps the
> > +.Fn getenv
> > +function to prevent it from being run in "secure execution&= quot;.
> > +Unlike in glibc,
> > +.Fn secure_getenv
> > +only checks if the
> > +.Fa setuid
> > +and
> > +.Fa setgid
> > +bits have been set or changed.
> > +These checks are subject to extension and change.
> > +.Pp
> > The
> > .Fn setenv
> > function inserts or resets the environment variable
> > @@ -139,6 +156,13 @@ is not in the current environment,
> > .Dv NULL
> > is returned.
> > .Pp
> > +The
> > +.Fn secure_getenv
> > +function returns
> > +.Dv NULL
> > +if the process is in "secure execution," otherwise it = will call
> > +.Fn getenv .
> > +.Pp
> > .Rv -std clearenv setenv putenv unsetenv
> > .Sh ERRORS
> > .Bl -tag -width Er
> > diff --git a/lib/libc/stdlib/getenv.c b/lib/libc/stdlib/getenv.c<= br> > > index 7ca27ab710c4..86a846d58c69 100644
> > --- a/lib/libc/stdlib/getenv.c
> > +++ b/lib/libc/stdlib/getenv.c
> > @@ -447,6 +447,18 @@ getenv(const char *name)
> > }
> >
> >
> > +/*
> > + * Runs getenv() unless the current process is tainted by uid or= gid changes, in
> > + * which case it will return NULL.
> > + */
> > +char *
> > +secure_getenv(const char *name)
> > +{
> > +=C2=A0 =C2=A0 =C2=A0if (issetugid())
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return NULL;
> > +=C2=A0 =C2=A0 =C2=A0return getenv(name);
>
> return (...);
>
> (x2)
>
> style(9) says they are optional now so it's below my radar.... but= honestly, it's good enough given the dozen other issues fixed in the p= r.

I still see "Values in return statements should be enclosed in
parentheses."? Which isn=E2=80=99t an RFC SHOULD, much of style(9) is = should
rather than must.

<= div dir=3D"auto">We need to do a pass to use rfc language. In this case,=C2= =A0 thought it's been encouraged but not required for a long time. I ad= ded the explicit language years ago since it was only by example prior to t= hat. I thought this was one of the many lossenings we've had over the y= ears, but if so there's been no update since I added the should languag= e... I know I've committed a lot of new code without it over the years.= ..

It may just have been= a combo of many other projects forbidding the practice and it was one of t= he variations my script found... I'll have to go find the script to see= .

But like I said before= ... git clang-format...

= Warner

Jess

> Though I'll see about adding git clang-format setup to check. I wr= ote a stupidly simple script to check 2 years ago and the commits coming in= at the time had way more exceptions and variations than I thought I'd = catch when I tested it out... but it could be turned into a gihub action ea= sily enough I think.
>
> Warner
>
> Jess
>
> > +}
> > +
> > /*
> >=C2=A0 * Set the value of a variable.=C2=A0 Older settings are lab= eled as inactive.=C2=A0 If an
> >=C2=A0 * older setting has enough room to store the new value, it = will be reused.=C2=A0 No

--000000000000dcc71305f6d52663--