on 17/07/2013 08:27 Andrey Chernov said the following: > On 17.07.2013 8:48, Andrey Chernov wrote: >> On 17.07.2013 8:10, Andrey Chernov wrote: >>> On 16.07.2013 11:26, Andriy Gapon wrote: >>>> Modified: head/lib/libc/stdlib/getenv.c >>>> ============================================================================== >>>> --- head/lib/libc/stdlib/getenv.c Tue Jul 16 06:50:22 2013 >>>> (r253379) >>>> +++ head/lib/libc/stdlib/getenv.c Tue Jul 16 07:26:46 2013 >>>> (r253380) >>>> @@ -505,7 +505,7 @@ __setenv(const char *name, size_t nameLe >>>> envVars[envNdx].valueSize = valueLen; >>>> >>>> /* Save name of name/value pair. */ >>>> - env = stpcpy(envVars[envNdx].name, name); >>>> + env = stpncpy(envVars[envNdx].name, name, nameLen); >>>> if ((envVars[envNdx].name)[nameLen] != '=') >>>> env = stpcpy(env, "="); >>>> } >>>> >>> >>> I am not sure what you are trying to fix, but you just made next line >>> condition unpredictable random, since (envVars[envNdx].name)[nameLen] is >>> never filled now and there is freshly malloced memory content, which is >>> picked for != '=' comparison. >>> >>> Please back it out or fix. >> >> If I understand that right, correct version will be: >> >> env = stpncpy(envVars[envNdx].name, name, nameLen); >> env = stpcpy(env, "="); >> >> Condition check is not needed. > > Microoptimized: > > env = stpncpy(envVars[envNdx].name, name, nameLen); > *env++ = '='; >
In fact, I think that the currently committed code is not functionally broken, just weird. It is equivalent to: x = unitialized_value; if (x != X) x = X; /* else assert(x == X); */ which should be completely equivalent to just x = X; despite x starting out with random junk. -- Andriy Gapon _______________________________________________ svn-src-head@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"