I think there is a bug in rlm_exec.c.

The logic, if I am correct, is that input_pairs cannot be NULL, but since
the server
spawns the exec module and does wait for the child process to terminate if
wait = no,
therefore,  the output_pairs MUST be NULL.

In rlm_exec.c, exec_instantiate() function, the following logic shows the
above statement:
...
        /*
         *      No input pairs defined.  Why are we executing a program?
         */
        if (!inst->input) {
                radlog(L_ERR, "rlm_exec: Must define input pairs for external 
program.");
                exec_detach(inst);
                return -1;
        }

        /*
         *      Sanity check the config.  If we're told to NOT wait,
         *      then the output pairs must not be defined.
         */
        if (!inst->wait &&
            (inst->output != NULL)) {
                radlog(L_ERR, "rlm_exec: Cannot read output pairs if wait=no");
                exec_detach(inst);
                return -1;
        }

...

But in CONFIG_PARSER, the default value of output_pairs is set to "reply",
as shown
below.

static CONF_PARSER module_config[] = {
        { "wait", PW_TYPE_BOOLEAN,  offsetof(rlm_exec_t,wait), NULL, "yes" },
        { "program",  PW_TYPE_STRING_PTR,
          offsetof(rlm_exec_t,program), NULL, NULL },
        { "input_pairs", PW_TYPE_STRING_PTR,
          offsetof(rlm_exec_t,input), NULL, "request" },
        { "output_pairs",  PW_TYPE_STRING_PTR,
          offsetof(rlm_exec_t,output), NULL, "reply" },
        { "packet_type", PW_TYPE_STRING_PTR,
          offsetof(rlm_exec_t,packet_type), NULL, NULL },
        { NULL, -1, 0, NULL, NULL }             /* end the list */
};

That means no matter what you do, you can never make output_pairs NULL, i.e.
if you comment it out, the default value "reply" takes place. Even if you
put "",
the parser still does not construct the inst->output to NULL.
which implies that the 'wait=no' condition can never be reached.

Am I missing something?



> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of Alex Chen
> Sent: Wednesday, September 24, 2003 4:30 PM
> To: FreeRADIUS Users (E-mail)
> Subject: The exec module
>
>
> I am trying to use the 'exec' module to do some house keeping work. I
> encounter a
> problem and would appreciate it if someone can help me.
>
> When I define an 'exec'module like the following, the server would not
> start.
>       exec ext_perl {
>               wait = no
>               program = "${prefix}/bin/ext_perl"
>               input_pairs = request
>               #output_pairs = reply
>               packet_type = Access-Accept
>       }
>
> The error message I got was
> Module: Loaded exec
>  exec: wait = no
>  exec: program = "/usr/local/bin/ext_perl"
>  exec: input_pairs = "request"
>  exec: output_pairs = "reply"
>  exec: packet_type = "Access-Accept"
> rlm_exec: Cannot read output pairs if wait=no
>
> It seems that even if I comment out the 'output_pairs', the
> server still
> uses "reply" as the
> value and thus fails to pass the logic check.
>
> What kind of setting should I use so that the server can just
> launch the
> exec and does not
> wait for it to return anything? Apparently comment out the
> 'output_pair' did
> not do the trick.
> I also tried to set output_pairs="" or output_pair=null, none worked.
>
>
> -
> List info/subscribe/unsubscribe? See
> http://www.freeradius.org/list/users.html


- 
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

Reply via email to