noexec: set comm field for noexecs

function                                             old     new   delta
set_task_comm                                          -      18     +18
tryexec                                              152     159      +7
pseudo_exec_argv                                     321     328      +7
main                                                 106      97      -9
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 3/2 up/down: 34/-13)             Total: 23 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-08-07 18:45:33 +02:00
parent 248a67fb75
commit f2cf1cc716
5 changed files with 28 additions and 7 deletions

View File

@ -1116,6 +1116,11 @@ int run_nofork_applet(int applet_no, char **argv) FAST_FUNC;
extern int find_applet_by_name(const char *name) FAST_FUNC; extern int find_applet_by_name(const char *name) FAST_FUNC;
extern void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC; extern void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC;
#endif #endif
#if defined(__linux__)
void set_task_comm(const char *comm) FAST_FUNC;
#else
# define set_task_comm(name) ((void)0)
#endif
/* Helpers for daemonization. /* Helpers for daemonization.
* *

View File

@ -911,6 +911,14 @@ int busybox_main(int argc UNUSED_PARAM, char **argv)
} }
# endif # endif
#if defined(__linux__) && (NUM_APPLETS > 1)
void FAST_FUNC set_task_comm(const char *comm)
{
/* okay if too long (truncates) */
prctl(PR_SET_NAME, (long)comm, 0, 0, 0);
}
#endif
# if NUM_APPLETS > 0 # if NUM_APPLETS > 0
void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **argv) void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **argv)
{ {
@ -1064,15 +1072,14 @@ int main(int argc UNUSED_PARAM, char **argv)
applet_name++; applet_name++;
applet_name = bb_basename(applet_name); applet_name = bb_basename(applet_name);
# if defined(__linux__)
/* If we are a result of execv("/proc/self/exe"), fix ugly comm of "exe" */ /* If we are a result of execv("/proc/self/exe"), fix ugly comm of "exe" */
if (ENABLE_FEATURE_SH_STANDALONE if (ENABLE_FEATURE_SH_STANDALONE
|| ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_PREFER_APPLETS
|| !BB_MMU || !BB_MMU
) { ) {
prctl(PR_SET_NAME, (long)applet_name, 0, 0, 0); if (NUM_APPLETS > 1)
set_task_comm(applet_name);
} }
# endif
parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */
run_applet_and_exit(applet_name, argv); run_applet_and_exit(applet_name, argv);

View File

@ -175,8 +175,6 @@ int FAST_FUNC spawn_and_wait(char **argv)
return wait4pid(rc); return wait4pid(rc);
/* child */ /* child */
//TODO: prctl(PR_SET_NAME, (long)argv[0], 0, 0, 0);? [think pidof, pgrep, pkill]
//Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!)
/* reset some state and run without execing */ /* reset some state and run without execing */
/* msg_eol = "\n"; - no caller needs this reinited yet */ /* msg_eol = "\n"; - no caller needs this reinited yet */
@ -185,6 +183,11 @@ int FAST_FUNC spawn_and_wait(char **argv)
* init, or a NOFORK applet. But none of those call us * init, or a NOFORK applet. But none of those call us
* as of yet (and that should probably always stay true). * as of yet (and that should probably always stay true).
*/ */
//TODO: think pidof, pgrep, pkill!
//set_task_comm() makes our pidof find NOEXECs (e.g. "yes >/dev/null"),
//but one from procps-ng-3.3.10 needs more!
//Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!)
set_task_comm(argv[0]);
/* xfunc_error_retval and applet_name are init by: */ /* xfunc_error_retval and applet_name are init by: */
run_applet_no_and_exit(a, argv[0], argv); run_applet_no_and_exit(a, argv[0], argv);
} }

View File

@ -7803,8 +7803,11 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c
while (*envp) while (*envp)
putenv(*envp++); putenv(*envp++);
popredir(/*drop:*/ 1); popredir(/*drop:*/ 1);
//TODO: prctl(PR_SET_NAME, (long)argv[0], 0, 0, 0);? [think pidof, pgrep, pkill] //TODO: think pidof, pgrep, pkill!
//set_task_comm() makes our pidof find NOEXECs (e.g. "yes >/dev/null"),
//but one from procps-ng-3.3.10 needs more!
//Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!)
set_task_comm(argv[0]);
run_applet_no_and_exit(applet_no, cmd, argv); run_applet_no_and_exit(applet_no, cmd, argv);
} }
/* re-exec ourselves with the new arguments */ /* re-exec ourselves with the new arguments */

View File

@ -7387,8 +7387,11 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save,
/* Without this, "rm -i FILE" can't be ^C'ed: */ /* Without this, "rm -i FILE" can't be ^C'ed: */
switch_off_special_sigs(G.special_sig_mask); switch_off_special_sigs(G.special_sig_mask);
debug_printf_exec("running applet '%s'\n", argv[0]); debug_printf_exec("running applet '%s'\n", argv[0]);
//TODO: prctl(PR_SET_NAME, (long)argv[0], 0, 0, 0);? [think pidof, pgrep, pkill] //TODO: think pidof, pgrep, pkill!
//set_task_comm() makes our pidof find NOEXECs (e.g. "yes >/dev/null"),
//but one from procps-ng-3.3.10 needs more!
//Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!)
set_task_comm(argv[0]);
run_applet_no_and_exit(a, argv[0], argv); run_applet_no_and_exit(a, argv[0], argv);
} }
# endif # endif