[ 
https://issues.apache.org/jira/browse/DAEMON-92?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12467335
 ] 

Simone Piunno commented on DAEMON-92:
-------------------------------------

I'm sorry you are right.
The problem is not for relative vs absolute paths, but execve(2) not searching 
throught the $PATH.

roentgen ~ # cat execve.c
#include <unistd.h>
#include <stdio.h>
int main(int myargc, char **myargv)
{
        char * const argv[] = { NULL };
        char * const envp[] = { NULL };
        if (myargc > 1) {
                printf("One round more\n");
                execve(myargv[0], argv, envp);
                return 1;
        }
        printf("Hello, world\n");
}
roentgen ~ # make execve
cc     execve.c   -o execve
roentgen ~ # ./execve 1
One round more
Hello, world
roentgen ~ # mv execve /usr/bin
roentgen ~ # which execve
/usr/bin/execve
roentgen ~ # execve
Hello, world
roentgen ~ # execve 1
One round more
roentgen ~ # /usr/bin/execve 1
One round more
Hello, world
roentgen ~ # strace execve 1
execve("/usr/bin/execve", ["execve", "1"], [/* 53 vars */]) = 0
brk(0)                                  = 0x501000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x2b73728cf000
uname({sys="Linux", node="roentgen", ...}) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=182778, ...}) = 0
mmap(NULL, 182778, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b73728d0000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\324"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1314256, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x2b73728fd000
mmap(NULL, 2330760, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0x2b73729d0000
mprotect(0x2b7372b00000, 1048576, PROT_NONE) = 0
mmap(0x2b7372c00000, 20480, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x130000) = 0x2b7372c00000
mmap(0x2b7372c05000, 16520, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b7372c05000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x2b7372c0a000
arch_prctl(ARCH_SET_FS, 0x2b7372c0a6f0) = 0
mprotect(0x2b7372c00000, 12288, PROT_READ) = 0
mprotect(0x2b73729ce000, 4096, PROT_READ) = 0
munmap(0x2b73728d0000, 182778)          = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x2b73728d0000
write(1, "One round more\n", 15One round more
)        = 15
execve("execve", [], [/* 0 vars */])    = -1 ENOENT (No such file or directory)
exit_group(1)                           = ?
Process 29655 detached



> jsvc fails to execve() self on Linux
> ------------------------------------
>
>                 Key: DAEMON-92
>                 URL: https://issues.apache.org/jira/browse/DAEMON-92
>             Project: Commons Daemon
>          Issue Type: Bug
>    Affects Versions: 1.0.1 Final
>            Reporter: Simone Piunno
>             Fix For: 1.0.1 Final
>
>         Attachments: 1.0.1-execve-self.patch
>
>
> On Linux jsvc execve() itself.
> execve() requires an absolute path as the first argument therefore use of 
> argv[0] only works when jsvc was invoked with a full path.
> Executing jsvc as relative path fails with "jsvc error: Cannot execute JSVC 
> executor process".
> On Linux the full path to self is very easy to find: "/proc/self/exe"
> I'm attaching a patch fixing this problem and falling back to argv[0] in case 
> /proc is not mounted.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to