Hi

I recently installed a module called mod_auth_xradius on my server.
This module is available from :-
http://www.outoforder.cc/projects/apache/mod_auth_xradius/
It provides authentication against RAIDUS which is exaclty what
I need but unfortunately I have found a bug which is causing me problems.
I tried to contact the author but have had no response and the bug has
been sat in their bug tracking system for several months. I am not an
expert programmer but I do know a little and I wondered if the folks
on this mailing list would be able to help me track down the bug?

The bug is essentially that the module fails if I specify more than
one RADIUS server in my configuration. This is the link to the
outoforder bug tracker:
http://issues.outoforder.cc/view.php?id=43

Here are the details :-

When I configure my directories like this it works fine :-

<Location /content>
   Options Indexes FollowSymLinks ExecCGI
   AuthXRadiusRetries 5
   AuthXRadiusTimeout 2
   AuthXRadiusAddServer "192.168.1.10" "mysecret1"
   AuthName "RADIUS"
   AuthBasicProvider xradius
   AuthType basic
   AuthPlainAuthoritative off
   AuthBasicAuthoritative off
   require valid-user
</Location>

But when I add a second server entry like this the program fails :-

<Location /content>
   Options Indexes FollowSymLinks ExecCGI
   AuthXRadiusRetries 5
   AuthXRadiusTimeout 2
   AuthXRadiusAddServer "192.168.1.10" "mysecret1"
   AuthXRadiusAddServer "192.168.1.11" "mysecret2"
   AuthName "RADIUS"
   AuthBasicProvider xradius
   AuthType basic
   AuthPlainAuthoritative off
   AuthBasicAuthoritative off
   require valid-user
</Location>

I have had a look through the source code and I think this is the area
where the failure occurs :-

int xrad_run_auth_check(request_rec* r, const char* user,
                               const char* password)
{
    int i;
    int rc;
    int can_cache = 0;
    int ret = HTTP_UNAUTHORIZED;
    struct xrad_handle* rctx = NULL;
    xrad_server_info *sr;
    apr_md5_ctx_t md5ctx;
    char* digest = NULL;

    xrad_dirconf_rec *dc = ap_get_module_config(r->per_dir_config,
                                                &auth_xradius_module);

    xrad_serverconf_rec *sc =
    ap_get_module_config(r->server->module_config,
                                                &auth_xradius_module);
......snip...........

    rctx = xrad_auth_open();

    /* Loop through the array of RADIUS Servers, adding them to the
    rctx object */
    sr = (xrad_server_info *) dc->servers->elts;
    for (i = 0; i < dc->servers->nelts; ++i) {
        rc = xrad_add_server(rctx, sr[i].hostname, sr[i].port, sr[i].secret,
                             dc->timeout, dc->maxtries);

        if (rc != 0) {
            ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                          "xradius: Failed to add server '%s:%d': (%d) %s",
                          sr[i].hostname, sr[i].port, rc,
            xrad_strerror(rctx));
            goto run_cleanup;
        }
    }


The "Failed to add server" error shown above is the error I see when
the module fails.

>From the header files, here are the structs :-

/* Simple Repsersentation of a RADIUS Server */
typedef struct {
    /* Port number of the RADIUS Server*/
    apr_port_t port;
    /* Hostname of the RADIUS Server */
    char* hostname;
    /* Shared Secert for the RADIUS Server */
    const char* secret;
} xrad_server_info;

/* Directory Configuration Structure */
typedef struct
{
    /* Array of xrad_server_info for this directory */
    apr_array_header_t* servers;
    /* How long to wait for a reply from any server */
    int timeout;
    /* How many attempts to transmit the Authentication Request */
    int maxtries;
    /* Should we reject any requests with a blank password */
    int reject_blank;
} xrad_dirconf_rec;

I have tried running the server in GDB and this is the sort of things
I am seeing :-

(gdb) n
131         for (i = 0; i < dc->servers->nelts; ++i) {
(gdb) n
132             rc = xrad_add_server(rctx, sr[i].hostname, sr[i].port, 
sr[i].secret,
(gdb) print sr[1].hostname
$10 = 0x2e343431 <Address 0x2e343431 out of bounds>
(gdb) print sr[0].hostname
$11 = 0x8140714 "horitative"
(gdb) print sr[0].port
$12 = 1812
(gdb) print sr[0].secret
$13 = 0x8140610 "192.168.1.11"
(gdb) print sr[1].hostname
$14 = 0x2e343431 <Address 0x2e343431 out of bounds>
(gdb) print sr[1].port
$15 = 1568
(gdb) print sr[1].secret
$16 = 0x312e3233 <Address 0x312e3233 out of bounds>
(gdb) print dc->servers->nelts
$17 = 2

As can be seen here the data looks to be jumbled up. It looks like
bits of the data are there but sr[0].hostname (first server address)
contains some other part of my apache config. The correct information for
sr[1].hostname (second server address) can actually be seen at the
memory location pointed to by print sr[0].secret.

Could anyone on this mailing list advise what might be going wrong
here?

Thanks

Ben Thompson

Reply via email to