From patchwork Wed Mar 11 18:48:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Eggert X-Patchwork-Id: 5588 Received: (qmail 5331 invoked by alias); 11 Mar 2015 18:48:07 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 5173 invoked by uid 89); 11 Mar 2015 18:48:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL, BAYES_00, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: smtp.cs.ucla.edu Message-ID: <55008DE0.8050805@cs.ucla.edu> Date: Wed, 11 Mar 2015 11:48:00 -0700 From: Paul Eggert User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Paul Pluzhnikov , Szabolcs Nagy CC: Joseph Myers , GLIBC Devel , Roland McGrath , "mtk@man7.org" Subject: Re: [patch] Error on setenv(..., NULL, ...) References: <55008721.1090200@arm.com> In-Reply-To: On 03/11/2015 11:26 AM, Paul Pluzhnikov wrote: > Where does it say that NULL name is allowed? It doesn't. But that's the FreeBSD behavior. FreeBSD setenv (..., NULL, ...) dumps core quickly because it calls strlen (NULL). How about if we do the same? It should be just as fast as what we do now, and it's safer and more compatible. Something like the attached untested patch, say. diff --git a/ChangeLog b/ChangeLog index 7360079..b9b40c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-03-11 Paul Eggert + + * stdlib/setenv.c (__add_to_environ): + Dump core quickly if setenv (..., NULL, ...) is called. + 2015-03-11 Paul Pluzhnikov [BZ #18043] diff --git a/stdlib/setenv.c b/stdlib/setenv.c index b60c4f0..f3de7e9 100644 --- a/stdlib/setenv.c +++ b/stdlib/setenv.c @@ -115,7 +115,13 @@ __add_to_environ (name, value, combined, replace) char **ep; size_t size; const size_t namelen = strlen (name); - const size_t vallen = value != NULL ? strlen (value) + 1 : 0; + size_t vallen; + + /* Test COMBINED, not VALUE, since VALLEN is needed only if COMBINED + is non-null. Also, testing COMBINED causes setenv (..., NULL, ...) + to dump core quickly instead of corrupting memory. */ + if (combined != NULL) + vallen = strlen (value) + 1; LOCK;