improve --install operation in chroot jails
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Mar 2011 05:02:31 +0000 (06:02 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Mar 2011 05:02:31 +0000 (06:02 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
libbb/appletlib.c

index fc3e962d5fb17f1def11f8a252e28b6585428cda..69cac2e9a8b55e52d22f399f3315d227b7fd3f45 100644 (file)
@@ -713,12 +713,23 @@ static int busybox_main(char **argv)
        if (ENABLE_FEATURE_INSTALLER && strcmp(argv[1], "--install") == 0) {
                int use_symbolic_links;
                const char *busybox;
+
                busybox = xmalloc_readlink(bb_busybox_exec_path);
-               if (!busybox)
-                       busybox = bb_busybox_exec_path;
-               /* busybox --install [-s] [DIR]: */
-               /* -s: make symlinks */
-               /* DIR: directory to install links to */
+               if (!busybox) {
+                       /* bb_busybox_exec_path is usually "/proc/self/exe".
+                        * In chroot, readlink("/proc/self/exe") usually fails.
+                        * In such case, better use argv[0] as symlink target
+                        * if it is a full path name.
+                        */
+                       if (argv[0][0] == '/')
+                               busybox = argv[0];
+                       else
+                               busybox = bb_busybox_exec_path;
+               }
+               /* busybox --install [-s] [DIR]:
+                * -s: make symlinks
+                * DIR: directory to install links to
+                */
                use_symbolic_links = (argv[2] && strcmp(argv[2], "-s") == 0 && argv++);
                install_links(busybox, use_symbolic_links, argv[2]);
                return 0;