diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-07 18:45:33 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-08-07 18:45:33 +0200 |
commit | f2cf1cc716216308a8a6d07e3afab23be07a6b02 (patch) | |
tree | 81c2a8231d59e39ab1f3cecf219616f0104fea80 | |
parent | 248a67fb75a0d2c98f4f9935b7bb9e11382b2c78 (diff) | |
download | busybox-w32-f2cf1cc716216308a8a6d07e3afab23be07a6b02.tar.gz busybox-w32-f2cf1cc716216308a8a6d07e3afab23be07a6b02.tar.bz2 busybox-w32-f2cf1cc716216308a8a6d07e3afab23be07a6b02.zip |
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>
-rw-r--r-- | include/libbb.h | 5 | ||||
-rw-r--r-- | libbb/appletlib.c | 13 | ||||
-rw-r--r-- | libbb/vfork_daemon_rexec.c | 7 | ||||
-rw-r--r-- | shell/ash.c | 5 | ||||
-rw-r--r-- | shell/hush.c | 5 |
5 files changed, 28 insertions, 7 deletions
diff --git a/include/libbb.h b/include/libbb.h index 51e8f27a5..e4a19ac04 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -1116,6 +1116,11 @@ int run_nofork_applet(int applet_no, char **argv) FAST_FUNC; | |||
1116 | extern int find_applet_by_name(const char *name) FAST_FUNC; | 1116 | extern int find_applet_by_name(const char *name) FAST_FUNC; |
1117 | extern void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC; | 1117 | extern void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC; |
1118 | #endif | 1118 | #endif |
1119 | #if defined(__linux__) | ||
1120 | void set_task_comm(const char *comm) FAST_FUNC; | ||
1121 | #else | ||
1122 | # define set_task_comm(name) ((void)0) | ||
1123 | #endif | ||
1119 | 1124 | ||
1120 | /* Helpers for daemonization. | 1125 | /* Helpers for daemonization. |
1121 | * | 1126 | * |
diff --git a/libbb/appletlib.c b/libbb/appletlib.c index fa28d433b..ce259446b 100644 --- a/libbb/appletlib.c +++ b/libbb/appletlib.c | |||
@@ -911,6 +911,14 @@ int busybox_main(int argc UNUSED_PARAM, char **argv) | |||
911 | } | 911 | } |
912 | # endif | 912 | # endif |
913 | 913 | ||
914 | #if defined(__linux__) && (NUM_APPLETS > 1) | ||
915 | void FAST_FUNC set_task_comm(const char *comm) | ||
916 | { | ||
917 | /* okay if too long (truncates) */ | ||
918 | prctl(PR_SET_NAME, (long)comm, 0, 0, 0); | ||
919 | } | ||
920 | #endif | ||
921 | |||
914 | # if NUM_APPLETS > 0 | 922 | # if NUM_APPLETS > 0 |
915 | void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **argv) | 923 | void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **argv) |
916 | { | 924 | { |
@@ -1064,15 +1072,14 @@ int main(int argc UNUSED_PARAM, char **argv) | |||
1064 | applet_name++; | 1072 | applet_name++; |
1065 | applet_name = bb_basename(applet_name); | 1073 | applet_name = bb_basename(applet_name); |
1066 | 1074 | ||
1067 | # if defined(__linux__) | ||
1068 | /* If we are a result of execv("/proc/self/exe"), fix ugly comm of "exe" */ | 1075 | /* If we are a result of execv("/proc/self/exe"), fix ugly comm of "exe" */ |
1069 | if (ENABLE_FEATURE_SH_STANDALONE | 1076 | if (ENABLE_FEATURE_SH_STANDALONE |
1070 | || ENABLE_FEATURE_PREFER_APPLETS | 1077 | || ENABLE_FEATURE_PREFER_APPLETS |
1071 | || !BB_MMU | 1078 | || !BB_MMU |
1072 | ) { | 1079 | ) { |
1073 | prctl(PR_SET_NAME, (long)applet_name, 0, 0, 0); | 1080 | if (NUM_APPLETS > 1) |
1081 | set_task_comm(applet_name); | ||
1074 | } | 1082 | } |
1075 | # endif | ||
1076 | 1083 | ||
1077 | parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ | 1084 | parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ |
1078 | run_applet_and_exit(applet_name, argv); | 1085 | run_applet_and_exit(applet_name, argv); |
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 50ecea762..546cc9e36 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c | |||
@@ -175,8 +175,6 @@ int FAST_FUNC spawn_and_wait(char **argv) | |||
175 | return wait4pid(rc); | 175 | return wait4pid(rc); |
176 | 176 | ||
177 | /* child */ | 177 | /* child */ |
178 | //TODO: prctl(PR_SET_NAME, (long)argv[0], 0, 0, 0);? [think pidof, pgrep, pkill] | ||
179 | //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) | ||
180 | /* reset some state and run without execing */ | 178 | /* reset some state and run without execing */ |
181 | 179 | ||
182 | /* msg_eol = "\n"; - no caller needs this reinited yet */ | 180 | /* msg_eol = "\n"; - no caller needs this reinited yet */ |
@@ -185,6 +183,11 @@ int FAST_FUNC spawn_and_wait(char **argv) | |||
185 | * init, or a NOFORK applet. But none of those call us | 183 | * init, or a NOFORK applet. But none of those call us |
186 | * as of yet (and that should probably always stay true). | 184 | * as of yet (and that should probably always stay true). |
187 | */ | 185 | */ |
186 | //TODO: think pidof, pgrep, pkill! | ||
187 | //set_task_comm() makes our pidof find NOEXECs (e.g. "yes >/dev/null"), | ||
188 | //but one from procps-ng-3.3.10 needs more! | ||
189 | //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) | ||
190 | set_task_comm(argv[0]); | ||
188 | /* xfunc_error_retval and applet_name are init by: */ | 191 | /* xfunc_error_retval and applet_name are init by: */ |
189 | run_applet_no_and_exit(a, argv[0], argv); | 192 | run_applet_no_and_exit(a, argv[0], argv); |
190 | } | 193 | } |
diff --git a/shell/ash.c b/shell/ash.c index 0a323e957..507d15c90 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -7803,8 +7803,11 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c | |||
7803 | while (*envp) | 7803 | while (*envp) |
7804 | putenv(*envp++); | 7804 | putenv(*envp++); |
7805 | popredir(/*drop:*/ 1); | 7805 | popredir(/*drop:*/ 1); |
7806 | //TODO: prctl(PR_SET_NAME, (long)argv[0], 0, 0, 0);? [think pidof, pgrep, pkill] | 7806 | //TODO: think pidof, pgrep, pkill! |
7807 | //set_task_comm() makes our pidof find NOEXECs (e.g. "yes >/dev/null"), | ||
7808 | //but one from procps-ng-3.3.10 needs more! | ||
7807 | //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) | 7809 | //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) |
7810 | set_task_comm(argv[0]); | ||
7808 | run_applet_no_and_exit(applet_no, cmd, argv); | 7811 | run_applet_no_and_exit(applet_no, cmd, argv); |
7809 | } | 7812 | } |
7810 | /* re-exec ourselves with the new arguments */ | 7813 | /* re-exec ourselves with the new arguments */ |
diff --git a/shell/hush.c b/shell/hush.c index b4fe7146b..021c1f0ff 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -7387,8 +7387,11 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t *nommu_save, | |||
7387 | /* Without this, "rm -i FILE" can't be ^C'ed: */ | 7387 | /* Without this, "rm -i FILE" can't be ^C'ed: */ |
7388 | switch_off_special_sigs(G.special_sig_mask); | 7388 | switch_off_special_sigs(G.special_sig_mask); |
7389 | debug_printf_exec("running applet '%s'\n", argv[0]); | 7389 | debug_printf_exec("running applet '%s'\n", argv[0]); |
7390 | //TODO: prctl(PR_SET_NAME, (long)argv[0], 0, 0, 0);? [think pidof, pgrep, pkill] | 7390 | //TODO: think pidof, pgrep, pkill! |
7391 | //set_task_comm() makes our pidof find NOEXECs (e.g. "yes >/dev/null"), | ||
7392 | //but one from procps-ng-3.3.10 needs more! | ||
7391 | //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) | 7393 | //Rewrite /proc/PID/cmdline? (need to save argv0 and length at init for this to work!) |
7394 | set_task_comm(argv[0]); | ||
7392 | run_applet_no_and_exit(a, argv[0], argv); | 7395 | run_applet_no_and_exit(a, argv[0], argv); |
7393 | } | 7396 | } |
7394 | # endif | 7397 | # endif |