Pádraig Brady <[email protected]> writes:

> It seems that this validation is only done on unsetenv() on FreeBSD?

I'm not too sure the exact details, I didn't look at the code aside from
finding the error message, and the preceding strchr + NULL check that
triggers that path.

>   $ printf 'A=1\0A=2\0foo\0' |
>     src/env --env0-from=- src/env foo=bar | grep foo
>   foo=bar
>   foo
>
>   $ printf 'A=1\0A=2\0foo\0' |
>     src/env --env0-from=- src/env -u foo
>   env: environment corrupt; missing value for foo
>   env: cannot unset ‘foo’: Bad address
>
>   $ printf 'A=1\0A=2\0foo\0' |
>     src/env --env0-from=- src/env -u bar
>   env: environment corrupt; missing value for foo
>   env: cannot unset ‘bar’: Bad address
>
> Anyway we can avoid the unsetenv() and putenv() in this case
> as we're only re-execing env(1) to get a standard env list with possible 
> implicit entries,
> we can do our manipulations before that.
> The attached passes on FreeBSD 15 at least (cfarm240).

I didn't test it myself, since I don't have different enough FreeBSD
machines to test on, but that patch looks good to me. Certainly better
than mine. I'd prefer to avoid $host_os checks as much as possible,
especially for systems that are actively developed and may change in the
future.

The 'git blame' shows that function hasn't been modified recently, and I
don't think anyone has a need to rewrite it. So, I feel your fix should
be robust enough.

Collin

Reply via email to