2010/3/24 ????? ???????????? <olga.kryzhanovska at gmail.com>:
> Venky, does this issue occur even if you bypass isaexec, i.e.
> #!/usr/bin/i86/ksh -p

Correction:
#!/usr/bin/i86/ksh93 -p

> or
> #!/usr/bin/sparcv0/ksh -p

Correction:
#!/usr/bin/sparcv9/ksh93 -p

>
> Olga
>
> On Fri, Mar 19, 2010 at 4:06 PM, Venky <venkytv at opensolaris.org> wrote:
>> Have been investigating CR 6934836.
>>
>> 6934836 set-uid script with -p in magic number gets Exec format error
>> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6934836
>>
>> Have a few questions I'm hoping the ksh93 folks here will be able
>> to help me with.
>>
>> It looks like the bug is due to the fact that set-uid scripts get
>> passed to the shell as a /dev/fd/XX parameter instead of the actual
>> path.  This has problems with ksh93 *only* if there are any options
>> passed on the command line.
>>
>> The test program below demonstrates this:
>>
>> ----------
>>
>> $ cat testexec.c
>> #include <stdio.h>
>> #include <fcntl.h>
>> #include <unistd.h>
>>
>> int
>> main()
>> {
>>        int fd = -1;
>>        char devfd[32];
>>        char *script = "/tmp/ok.ksh";  /* Can be any simple script */
>>
>>        fd = open(script, O_RDONLY);
>>        sprintf(devfd, "/dev/fd/%d", fd);
>>        execl("/usr/bin/sparcv9/ksh93", "ksh", "-v", devfd, NULL);
>> }
>> $ ./testexec
>> /usr/bin/ksh: /usr/bin/ksh: cannot execute [Exec format error]
>>
>> ----------
>>
>> The culprit seems to be the code below:
>>
>> <lib/libshell/common/sh/init.c>
>> http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libshell/common/sh/init.c#1216
>>
>> 1216   shp->st.dolv=argv+(argc-1)-shp->st.dolc;
>> 1217   shp->st.dolv[0] = argv[0];
>>
>> Here, we are overwriting one of the arguments of argv (because
>> shp->st.dolv indexes into the argv vector).
>>
>> In this particular case, argv which originally looked like this:
>>
>>    ksh, -v, /dev/fd/3
>>
>> ends up looking like this:
>>
>>    ksh, ksh, /dev/fd/3
>>
>> We then pass the mangled argv to execv():
>>
>> <lib/libshell/common/sh/main.c>
>> http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libshell/common/sh/main.c#298
>>
>> 298   /*  exec to change $0 for ps  */
>> 299   execv(pathshell(),av);
>>
>> As a consequence, ksh tries to load the ksh binary as a shell script and
>> fails with an "Exec format" error.
>>
>> Have been digging around trying to figure out what is the right
>> thing to do in this situation.  Figured some of the people more
>> familiar with the ksh93 source might be able to help.
>>
>> Also, the execv() call above uses pathshell() which seems plain wrong.
>> The whole exec hack here seems to be to make sure $0 is set correctly
>> for ps.  But pathshell() looks at the SHELL variable and might end up
>> executing the script with a different shell altogether.
>>
>> Any help appreciated.
>>
>> Thanks,
>> Venky.
>> _______________________________________________
>> ksh93-integration-discuss mailing list
>> ksh93-integration-discuss at opensolaris.org
>> http://mail.opensolaris.org/mailman/listinfo/ksh93-integration-discuss
>>
>
>
>
> --
>      ,   _                                    _   ,
>     { \/`o;====-    Olga Kryzhanovska   -====;o`\/ }
> .----'-/`-/     olga.kryzhanovska at gmail.com   \-`\-'----.
>  `'-..-| /     Solaris/BSD//C/C++ programmer   \ |-..-'`
>      /\/\                                     /\/\
>      `--`                                      `--`
>



-- 
      ,   _                                    _   ,
     { \/`o;====-    Olga Kryzhanovska   -====;o`\/ }
.----'-/`-/     olga.kryzhanovska at gmail.com   \-`\-'----.
 `'-..-| /     Solaris/BSD//C/C++ programmer   \ |-..-'`
      /\/\                                     /\/\
      `--`                                      `--`

Reply via email to