setarch: do not try to use non-existent data in argv[]
[platform/upstream/busybox.git] / util-linux / setarch.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * linux32/linux64 allows for changing uname emulation.
4  *
5  * Copyright 2002 Andi Kleen, SuSE Labs.
6  *
7  * Licensed under GPL v2 or later, see file License for details.
8 */
9
10 #include <sys/personality.h>
11
12 #include "libbb.h"
13
14 int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
15 int setarch_main(int argc UNUSED_PARAM, char **argv)
16 {
17         int pers;
18
19         /* Figure out what personality we are supposed to switch to ...
20          * we can be invoked as either:
21          * argv[0],argv[1] == "setarch","personality"
22          * argv[0]         == "personality"
23          */
24         if (ENABLE_SETARCH && applet_name[0] == 's'
25          && argv[1] && strncpy(argv[1], "linux", 5)
26         ) {
27                 applet_name = argv[1];
28                 argv++;
29         }
30         if (applet_name[5] == '6') /* linux64 */
31                 pers = PER_LINUX;
32         else if (applet_name[5] == '3') /* linux32 */
33                 pers = PER_LINUX32;
34         else
35                 bb_show_usage();
36
37         argv++;
38         if (argv[0] == NULL)
39                 bb_show_usage();
40
41         /* Try to set personality */
42         if (personality(pers) >= 0) {
43                 /* Try to execute the program */
44                 BB_EXECVP(argv[0], argv);
45         }
46
47         bb_simple_perror_msg_and_die(argv[0]);
48 }