On 5/20/20 11:05 AM, Eric W. Biederman wrote: > Rob Landley <rob@xxxxxxxxxxx> writes: > >> On 5/18/20 7:33 PM, Eric W. Biederman wrote: >>> >>> Most of the support for passing the file descriptor of an executable >>> to an interpreter already lives in the generic code and in binfmt_elf. >>> Rework the fields in binfmt_elf that deal with executable file >>> descriptor passing to make executable file descriptor passing a first >>> class concept. >> >> I was reading this to try to figure out how to do execve(NULL, argv[], envp) to >> re-exec self after a vfork() in a chroot with no /proc, and hit the most trivial >> quibble ever: > > We have /proc/self/exe today. Not when you first enter a container that's just created a new namespace, or initramfs first launches PID 1 and runs a shell script to set up the environment and your (subshell) and background& support only has vfork and not fork, or just plain "somebody did a chroot"... (Yes a nommu system with range registers can want _security_ without _address_translation_. Strange but true! I haven't actually sat down to try to implement nommu containers yet, but I've done worse things on many occasions. Remember: the S in IoT stands for Security.) > If I understand you correctly you would > like to do the equivalent of 'execve("/proc/self/exe", argv[], envp[])' > without having proc mounted. Toybox would _like_ proc mounted, but can't assume it. I'm writing a new bash-compatible shell with nommu support, which means in order to do subshell and background tasks if (!CONFIG_FORK) I need to create a pipe pair, vfork(), have the child exec itself to unblock the parent, and then read the context data that just got discarded through the pipe from the parent. ("Wheee." And you can quote me on that.) I've implemented that already (https://github.com/landley/toybox/blob/0.8.3/toys/pending/sh.c#L674 and reentry is L2516, yeah it's a work in progress), but "exec self" requires /proc/self/exe and since I gave up on getting http://lkml.iu.edu/hypermail/linux/kernel/2005.1/09399.html in (I should apologize to Randy but I just haven't got the spoons to face https://landley.net/notes-2017.html#14-09-2017 again; three strikes and the patch stays out) I need /init to be a shell script to set up an initramfs that's made by pointing CONFIG_INITRAMFS_SOURCE at a directory that was made without running the build as root, because there's no /dev/console and you can't mknod as a non-root user. Maybe instead of fixing CONFIG_DEVTMPFS_MOUNT to apply to initramfs I could instead add a CONFIG_INITRAMFS_EXTRA=blah.txt to usr/{Kconfig,Makefile} to append user-supplied extra lines to the end of the gen_initramfs.sh output and make a /dev/console that way (kinda like genext2fs and mksquashfs), but getting that in through the linux-kernel bureaucracy means consulting a 27 step checklist supplementing the basic 17 step submission procedure (with bibliographic references) explaining how to fill out the forms, perform the validation steps, go through the proper channels, and get the appropriate series of signatures and approvals, and I just haven't got the stomach for it anymore. I was participating here as a hobbyist. Linux-kernel has aged into a rigid bureaucracy. It's no fun anymore. Which means any kernel patch I write I have to forward port regularly, sometimes for a very long time. Heck, I gave linux-kernel three strikes at miniconfig fifteen years ago now: http://lkml.iu.edu/hypermail/linux/kernel/0511.2/0479.html https://lwn.net/Articles/161086/ https://lkml.org/lkml/2006/7/6/404 And was still maintaining it out of tree a decade later: https://landley.net/aboriginal/FAQ.html#dev_miniconfig https://github.com/landley/aboriginal/blob/master/more/miniconfig.sh These days I've moved on to a microconfig format that mostly fits on one line, ala the KCONF= stuff in toybox's built in: https://github.com/landley/toybox/blob/master/scripts/mkroot.sh#L136 For example, the User Mode Linux miniconfig from my ancient https://landley.net/writing/docs/UML.html would translate to microconfig as: BINFMT_ELF,HOSTFS,LBD,BLK_DEV,BLK_DEV_LOOP,STDERR_CONSOLE,UNIX98_PTYS,EXT2_FS The current kernel also needs "64BIT" because my host toolchain doesn't have the -m32 headers installed, but then it builds fine ala: make ARCH=um allnoconfig KCONFIG_ALLCONFIG=<(echo BINFMT_ELF,HOSTFS,LBD,BLK_DEV,BLK_DEV_LOOP,STDERR_CONSOLE,UNIX98_PTYS,EXT2_FS,64BIT | sed -E 's/([^,]*)(,|$)/CONFIG_\1=y\n/g') Of course running the resulting ./linux says: Checking PROT_EXEC mmap in /dev/shm...Operation not permitted /dev/shm must be not mounted noexec But *shrug*, Devuan did that not me. I haven't really used UML since QEMU started working. Shouldn't the old "create file, map file, delete file" trick stop flushing the data to backing store no matter where the file lives? I mean, that trick dates back to the VAX, and we argued about it on the UML list a decade ago (circa https://sourceforge.net/p/user-mode-linux/mailman/message/14000710/) but... fixing random things that are wrong with Linux is not my problem anymore. I'm only in this thread because I'm cc'd. Spending five years repeatedly posting perl removal patches and ending up with intentional sabotage at the end from the guy who'd added perl in the first place when the Gratuitous Build Dependency Removal patches finally got traction (https://landley.net/notes-2013.html#28-03-2013) kinda put me off doing that again. > The file descriptor is stored in mm->exe_file. > Probably the most straight forward implementation is to allow > execveat(AT_EXE_FILE, ...). Cool, that works. > You can look at binfmt_misc for how to reopen an open file descriptor. Added to the todo heap. Thanks, Rob