Hi,

I upgraded to unstable's Apache 1.3.27.0-2 package, and it appears
broken due to a gcc 3.3 bug.  I can recreate this building locally
using gcc version 3.3.1 20030626, with either -O0 or -O1.  I have got
Apache working again by building with the gcc-snapshot (gcc 3.4)
package which produces correct code.

The problem point is server_type() in src/main/http_core.c

static const char *server_type(cmd_parms *cmd, void *dummy, char *arg)
{
    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
    if (err != NULL) {
        return err;
    }
 
    if (!strcasecmp(arg, "inetd")) {
        ap_standalone = 0;
    }
    else if (!strcasecmp(arg, "standalone")) {
        ap_standalone = 1;
    }
    else {
        return "ServerType must be either 'inetd' or 'standalone'";
    }
 
    return NULL;
}

It will crash if the ServerType directive (i.e. passed in via char
*arg) is "standalone".  Any other value (i.e. inetd or an incorrect
value) works OK.  Output from objdump -S for the function is attached.
The problem point (I think) is at 20fb0 ; r14 is set to 1 at 20f9c
then a load is attempted from it.

Can anyone see a simple test case?  All my attempts so far have
created correct code.

Should this be filed as a bug?  Would it be an apache bug or a gcc
bug?

-i
[EMAIL PROTECTED]
http://www.gelato.unsw.edu.au
4000000000020ea0 <server_type>:

static const char *server_type(cmd_parms *cmd, void *dummy, char *arg)
{
4000000000020ea0:       10 20 21 0c 80 05       [MIB]       alloc 
r36=ar.pfs,8,6,0
    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
4000000000020ea6:       70 fa 00 00 48 00                   mov r39=31
4000000000020eac:       00 00 00 20                         nop.b 0x0
4000000000020eb0:       01 28 01 02 00 21       [MII]       mov r37=r1
4000000000020eb6:       30 02 00 62 00 c0                   mov r35=b0
4000000000020ebc:       04 00 01 84                         mov r38=r32;;
4000000000020ec0:       11 00 00 00 01 00       [MIB]       nop.m 0x0
4000000000020ec6:       00 00 00 02 00 00                   nop.i 0x0
4000000000020ecc:       78 cb ff 58                         br.call.sptk.many 
b0=400000000001da30 <ap_check_cmd_context>;;
4000000000020ed0:       00 08 00 4a 00 21       [MII]       mov r1=r37
    if (err != NULL) {
4000000000020ed6:       60 02 88 00 42 c0                   mov r38=r34
4000000000020edc:       00 40 1c e4                         cmp.eq p6,p7=0,r8
4000000000020ee0:       1d 70 00 10 00 21       [MFB]       mov r14=r8
4000000000020ee6:       00 00 00 02 00 00                   nop.f 0x0
4000000000020eec:       00 00 00 20                         nop.b 0x0;;
4000000000020ef0:       10 38 e1 02 1f 24       [MIB]       addl r39=4024,r1
4000000000020ef6:       00 00 00 02 00 03                   nop.i 0x0
4000000000020efc:       30 00 00 43                   (p06) br.cond.dpnt.few 
4000000000020f20 <server_type+0x80>
4000000000020f00:       00 40 00 1c 00 21       [MII]       mov r8=r14
4000000000020f06:       00 20 01 55 00 00                   mov.i ar.pfs=r36
4000000000020f0c:       30 0a 00 07                         mov b0=r35
4000000000020f10:       11 00 00 00 01 00       [MIB]       nop.m 0x0
4000000000020f16:       00 00 00 02 00 80                   nop.i 0x0
4000000000020f1c:       08 00 84 00                         br.ret.sptk.many 
b0;;
4000000000020f20:       11 38 01 4e 18 10       [MIB]       ld8 r39=[r39]
4000000000020f26:       00 00 00 02 00 00                   nop.i 0x0
4000000000020f2c:       c8 8c fe 58                         br.call.sptk.many 
b0=4000000000009be0 <_init+0x1180>;;
4000000000020f30:       01 08 00 4a 00 21       [MII]       mov r1=r37
4000000000020f36:       70 00 20 0c 73 c0                   cmp4.eq p7,p6=0,r8
4000000000020f3c:       04 10 01 84                         mov r38=r34;;
4000000000020f40:       02 78 90 03 4f 24       [MII]       addl r15=10212,r1
4000000000020f46:       70 02 06 3e 48 00                   addl r39=4032,r1;;
4000000000020f4c:       00 00 04 00                         nop.i 0x0
4000000000020f50:       09 70 00 1e 00 21       [MMI]       mov r14=r15
        return err;
    }

    if (!strcasecmp(arg, "inetd")) {
        ap_standalone = 0;
    }
    else if (!strcasecmp(arg, "standalone")) {
4000000000020f56:       70 02 9c 30 20 00                   ld8 r39=[r39]
4000000000020f5c:       00 00 04 00                         nop.i 0x0;;
4000000000020f60:       f0 00 00 1c 90 11       [MIB] (p07) st4 [r14]=r0
4000000000020f66:       00 00 00 02 80 03                   nop.i 0x0
4000000000020f6c:       60 00 00 43                   (p07) br.cond.dpnt.few 
4000000000020fc0 <server_type+0x120>
4000000000020f70:       11 00 00 00 01 00       [MIB]       nop.m 0x0
4000000000020f76:       00 00 00 02 00 00                   nop.i 0x0
4000000000020f7c:       78 8c fe 58                         br.call.sptk.many 
b0=4000000000009be0 <_init+0x1180>;;
4000000000020f80:       03 08 00 4a 00 21       [MII]       mov r1=r37
4000000000020f86:       70 00 20 0c 73 c0                   cmp4.eq p7,p6=0,r8;;
4000000000020f8c:       41 0e 3c 91                         addl r14=10212,r1;;
4000000000020f90:       03 78 00 1c 00 21       [MII]       mov r15=r14
4000000000020f96:       e0 40 06 3e c8 c3                   addl r14=4040,r1;;
4000000000020f9c:       11 00 00 90                   (p07) mov r14=1;;
4000000000020fa0:       e0 00 38 1e 90 11       [MII] (p07) st4 [r15]=r14
4000000000020fa6:       00 00 00 02 00 00                   nop.i 0x0
4000000000020fac:       00 00 04 00                         nop.i 0x0
        ap_standalone = 1;
    }
    else {
        return "ServerType must be either 'inetd' or 'standalone'";
4000000000020fb0:       13 70 00 1c 18 d0       [MBB]       ld8 r14=[r14]
4000000000020fb6:       01 08 00 00 21 00             (p07) br.cond.dptk.few 
4000000000020fc0 <server_type+0x120>
4000000000020fbc:       50 ff ff 48                         br.few 
4000000000020f00 <server_type+0x60>;;
4000000000020fc0:       11 70 00 00 00 21       [MIB]       mov r14=r0
4000000000020fc6:       00 00 00 02 00 00                   nop.i 0x0
4000000000020fcc:       40 ff ff 48                         br.few 
4000000000020f00 <server_type+0x60>;;

4000000000020fd0 <server_port>:
    }

    return NULL;
}

Reply via email to