You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apache-bugdb@apache.org by Jason Riedy <ej...@cise.ufl.edu> on 1998/03/02 22:23:47 UTC
os-solaris/1904: -DFCNTL_SERIALIZED_ACCEPT necessary for mod_include's exec functions & suexec
>Number: 1904
>Category: os-solaris
>Synopsis: -DFCNTL_SERIALIZED_ACCEPT necessary for mod_include's exec functions & suexec
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: apache
>State: open
>Class: sw-bug
>Submitter-Id: apache
>Arrival-Date: Mon Mar 2 13:30:00 PST 1998
>Last-Modified:
>Originator: ejr@cise.ufl.edu
>Organization:
apache
>Release: 1.3b5
>Environment:
SunOS cave 5.6 Generic sun4u sparc SUNW,Ultra-2
>Description:
This is a strange one.
When called from mod_include, but not mod_cgi, call_exec can't proceed
past getpwnam() in the suexec_enabled-guarded part. Changing the
serialization type fixes this.
I've tried both ``exec cmd'' and ``exec cgi''. When the former is called
before the latter, truss outputs:
For ``exec cmd'':
> 2760: setrlimit(RLIMIT_CPU, 0x000A7B68) = 0
> 2760: setrlimit(RLIMIT_DATA, 0x000A7B88) = 0
> 2760: setrlimit(RLIMIT_VMEM, 0x000A7B88) = 0
> 2760: open64("/etc/.name_service_door", O_RDONLY) = 4
> 2760: fcntl(4, F_SETFD, 0x00000001) = 0
> 2760: door_info(4, 0xEF6A86A8) Err#9 EBADF
> 2760: close(4) = 0
> 2760: open("/etc/passwd", O_RDONLY) = 4
> 2760: fstat64(4, 0xEFFF2C68) = 0
> 2760: ioctl(4, TCGETA, 0xEFFF2BF4) Err#25 ENOTTY
> 2760: read(4, " r o o t : x : 0 : 1 : S".., 8192) = 806
> 2760: Incurred fault #6, FLTBOUNDS %pc = 0xEF658900
> 2760: siginfo: SIGSEGV SEGV_MAPERR addr=0xEFFF1F7C
> 2760: Received signal #11, SIGSEGV [caught]
> 2760: siginfo: SIGSEGV SEGV_MAPERR addr=0xEFFF1F7C
> 2760: *** process killed ***
> 2744: read(6, 0x000DEC44, 5120) = 0
For ``exec cgi'':
> 2762: setrlimit(RLIMIT_CPU, 0x000A7B68) = 0
> 2762: setrlimit(RLIMIT_DATA, 0x000A7B88) = 0
> 2762: setrlimit(RLIMIT_VMEM, 0x000A7B88) = 0
> 2762: open64("/etc/.name_service_door", O_RDONLY) = 4
> 2762: fcntl(4, F_SETFD, 0x00000001) = 0
> 2762: door_info(4, 0xEF6A86A8) Err#9 EBADF
> 2762: close(4) = 0
> 2762: open("/etc/passwd", O_RDONLY) = 4
> 2762: fstat64(4, 0xEFFF0A98) = 0
> 2762: ioctl(4, TCGETA, 0xEFFF0A24) Err#25 ENOTTY
> 2762: read(4, " r o o t : x : 0 : 1 : S".., 8192) = 806
> 2762: llseek(4, 0xFFFFFFFFFFFFFFCF, SEEK_CUR) = 757
> 2762: close(4) = 0
> 2762: open64("/etc/.name_service_door", O_RDONLY) = 4
> 2762: fcntl(4, F_SETFD, 0x00000001) = 0
> 2762: door_info(4, 0xEF6A86A8) Err#9 EBADF
> 2762: close(4) = 0
> 2762: open("/etc/group", O_RDONLY) = 4
> 2762: fstat64(4, 0xEFFEED50) = 0
> 2762: ioctl(4, TCGETA, 0xEFFEECDC) Err#25 ENOTTY
> 2762: read(4, " r o o t : : 0 : r o o t".., 8192) = 281
> 2762: read(4, 0x000E1C64, 8192) = 0
> 2762: llseek(4, 0, SEEK_CUR) = 281
> 2762: close(4) = 0
> 2762: getpid() = 2762 [2744]
> 2762: fstat(3, 0xEFFEECC8) = 0
> 2762: close(3) = 0
> 2762: Incurred fault #6, FLTBOUNDS %pc = 0xEF658900
> 2762: siginfo: SIGSEGV SEGV_MAPERR addr=0xEFFEDEA4
> 2762: Received signal #11, SIGSEGV [caught]
> 2762: siginfo: SIGSEGV SEGV_MAPERR addr=0xEFFEDEA4
> 2762: *** process killed ***
> 2744: read(8, 0x000DBA68, 4096) = 0
However, calling ``exec cgi'' before ``exec cmd'' produces different
results. The ``exec cgi'' fails as above, but the ``exec cmd'' works.
[Yes, I know, ``exec cgi'' is not the prefered method, but I'm using it
to test my suexec.]
The death is definitely within getpwnam(). Calling getpwnam() elsewhere
in the routine moves the point-of-death.
>How-To-Repeat:
Compile with the defaults and suexec. Bang head against wall many times.
>Fix:
I wish I knew. Using fcntl rather than the Solaris mutexes works.
I'll let you know if I uncover more
>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, ]
[you need to include <ap...@Apache.Org> in the Cc line ]
[and leave the subject line UNCHANGED. This is not done]
[automatically because of the potential for mail loops. ]