[PATCH v3 04/27] adduser: replace BB_EXECLP call with BB_EXECVP

d+busybox at adaptive-enterprises.com d+busybox at adaptive-enterprises.com
Tue Jan 28 08:03:40 UTC 2025



On Tue, 28 Jan 2025, Kang-Che Sung wrote:
>>> Perhaps what you really intended is this?
>>>
>>> const char *passwd_argv[] = { "passwd", "--", login_name, NULL };
>>
>> That would be much more intuitive, readable, safer and so on, but then
>> you'll need a cast when pass it to the pre-const functions,
>> eg (char **)passwd_argv.
>
> From the surrounding code I've read, you are attempting to pass a
> ".rodata" string into an "argv" character pointer array.
>
> But "argv" is supposed to be mutable by the callee (i.e. the new
> program's main function). (I think it's required by the C standard.)
>
> Unless there's a guarantee that the callee never modifies the "argv"
> string, passing ".rodata" strings with de-const casts would be unsafe.
> That's why when I initially saw the patch and code I was nervous. (A
> (char *) de-const cast without an in-code explanation of why is a red
> flag to me.)

Ah, you're right. I was focused on the fact that the consumer of the
char** argv was

 	int execvp(const char *file, char *const argv[]);

where I hoped, as a syscall, it would copy-out the argv[] in a read-only
way which makes the cast safe.

But, as you point out, in this patchset run_applet_no_and_exit() will
be passing a (casted) rodata argv straight to an applet's main().

To avoid unnecessary heap allocations and copying on tiny targets,
(by str*dup'ing argv[] every time) maybe we can add const as another
restriction required by NOEXEC. I mean we might find we're lucky that most
of the ~167 NOEXEC applets could already change their main signature from

 	(int argc, char **argv)

to

 	(int argc, const char *const *argv)

and for those that can't, ie those that write to argv[], we may
find they can be easily fixed to use a local copy instead.


More information about the busybox mailing list