Hi Giovanni;

On Wed, Jun 7, 2023 at 12:02 AM <gbec...@apache.org> wrote:
>
> Author: gbechis
> Date: Tue Jun  6 22:02:37 2023
> New Revision: 1910267
>
> URL: http://svn.apache.org/viewvc?rev=1910267&view=rev
> Log:
> mod_ext_filter: check exit status of filter processes
[]
>
> +/* check_filter_process_on_eos():
> + *
> + * if we hit end-of-stream, check the exit status of the filter process, and 
> log
> + * an appropriate message if it failed
> + */
> +static apr_status_t check_filter_process_on_eos(ef_ctx_t *ctx, request_rec 
> *r)
> +{
> +    if (ctx->hit_eos) {
> +        int exitcode;
> +        apr_exit_why_e exitwhy;
> +        apr_status_t waitret = apr_proc_wait(ctx->proc, &exitcode, &exitwhy,
> +                                             APR_WAIT);
> +        if (waitret != APR_CHILD_DONE) {
> +            ap_log_rerror(APLOG_MARK, APLOG_ERR, waitret, r, APLOGNO(10451)
> +                          "apr_proc_wait() failed, uri=%s", r->uri);
> +            return waitret;
> +        }
> +        else if (exitwhy != APR_PROC_EXIT) {
> +            ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_SUCCESS, r, 
> APLOGNO(10452)
> +                          "child process %s killed by signal %d, uri=%s",
> +                          ctx->filter->command, exitcode, r->uri);
> +            return HTTP_INTERNAL_SERVER_ERROR;
> +        }
> +        else if (exitcode != 0) {
> +            ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_SUCCESS, r, 
> APLOGNO(10453)
> +                          "child process %s exited with non-zero status %d, "
> +                          "uri=%s", ctx->filter->command, exitcode, r->uri);
> +            return HTTP_INTERNAL_SERVER_ERROR;
> +        }

HTTP_INTERNAL_SERVER_ERROR (like all HTTP_* statuses) is not an
apr_status_t, it shouldn't be returned by a filter (and does not print
well as an ap_log_rerror() error status for instance like below).

Maybe use APR_EGENERAL? The error message could be enough to
distinguish them here.
I wouldn't return waitret for the first case either since it's in the
error message already, no need to forward it specifically to the
caller, so APR_EGENERAL still possibly.

> +    }
> +
> +    return APR_SUCCESS;
> +}
> +
>  /* ef_unified_filter:
>   *
>   * runs the bucket brigade bb through the filter and puts the result into
> @@ -880,6 +914,11 @@ static apr_status_t ef_output_filter(ap_
>      if (rv != APR_SUCCESS) {
>          ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01468)
>                        "ef_unified_filter() failed");
> +        return rv;
> +    }
> +
> +    if ((rv = check_filter_process_on_eos(ctx, r)) != APR_SUCCESS) {
> +        return rv;

Not correct here for a filter.

>      }
>
>      if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) {
> @@ -939,7 +978,13 @@ static apr_status_t ef_input_filter(ap_f
>      }
>
>      rv = ef_unified_filter(f, bb);
> -    return rv;
> +    if (rv != APR_SUCCESS) {
> +        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, APLOGNO(10454)
> +                      "ef_unified_filter() failed");
> +        return rv;

Ditto, for both the error log status and return value.

> +    }
> +
> +    return check_filter_process_on_eos(ctx, f->r);
>  }


Regards;
Yann.

Reply via email to