Changes with Apache 2.0.25-dev
+ *) Moved split_and_pass_pretag_buckets back to being a
+ macro at Ryans's request. Removed the return from it
+ by setting and returning a return code instead. Updated
+ the code to check the return code from teh macro and
+ do the right thing. [Paul J. Reder]
*) Fix a segfault when a numeric value was received for Host:.
[Jeff Trawick]
#define BYTE_COUNT_THRESHOLD AP_MIN_BYTES_TO_WRITE
-/* This function is used to split the brigade at the beginning of
- * the tag and forward the pretag buckets before any substitution
- * work is performed on the tag. This maintains proper ordering.
- */
-static int split_and_pass_pretag_buckets(apr_bucket_brigade **brgd,
- include_ctx_t *cntxt,
- ap_filter_t *next)
-{
- apr_bucket_brigade *tag_plus;
- int rv;
-
- if ((APR_BRIGADE_EMPTY(cntxt->ssi_tag_brigade)) &&
- (cntxt->head_start_bucket != NULL)) {
- tag_plus = apr_brigade_split(*brgd, cntxt->head_start_bucket);
- rv = ap_pass_brigade(next, *brgd);
- cntxt->bytes_parsed = 0;
- *brgd = tag_plus;
- if (rv != APR_SUCCESS) {
- return rv;
- }
- }
- return APR_SUCCESS;
-}
-
/* ------------------------ Environment function -------------------------- */
/* XXX: could use ap_table_overlap here */
if (!error_fmt) {
int rv;
+ apr_status_t rc = APR_SUCCESS;
- rv = split_and_pass_pretag_buckets(bb, ctx, f->next);
- if (rv != APR_SUCCESS) {
- return rv;
+ SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, rc);
+ if (rc != APR_SUCCESS) {
+ return rc;
}
if ((rv = ap_run_sub_req(rr))) {
apr_bucket *dptr = APR_BRIGADE_FIRST(*bb);
apr_bucket *tmp_dptr;
apr_bucket_brigade *tag_and_after;
- apr_status_t rv;
+ apr_status_t rv = APR_SUCCESS;
if (r->args) { /* add QUERY stuff to env cause it ain't yet */
char *arg_copy = apr_pstrdup(r->pool, r->args);
*bb = tag_and_after;
}
else if (ctx->bytes_parsed >= BYTE_COUNT_THRESHOLD) {
- rv = split_and_pass_pretag_buckets(bb, ctx, f->next);
+ SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, rv);
if (rv != APR_SUCCESS) {
return rv;
}
} \
}
+/* Make sure to check the return code rc. If it is anything other
+ * than APR_SUCCESS, then you should return this value up the
+ * call chain.
+ */
+#define SPLIT_AND_PASS_PRETAG_BUCKETS(brgd, cntxt, next, rc) \
+if ((APR_BRIGADE_EMPTY(cntxt->ssi_tag_brigade)) && \
+ (cntxt->head_start_bucket != NULL)) { \
+ apr_bucket_brigade *tag_plus; \
+ \
+ tag_plus = apr_brigade_split(brgd, cntxt->head_start_bucket); \
+ rc = ap_pass_brigade(next, brgd); \
+ cntxt->bytes_parsed = 0; \
+ brgd = tag_plus; \
+}
+
+
typedef int (include_handler_fn_t)(include_ctx_t *ctx, apr_bucket_brigade **bb,
request_rec *r, ap_filter_t *f, apr_bucket *head_ptr,
apr_bucket **inserted_head);
int bufbytes;
} cgi_server_conf;
-/* This function is used to split the brigade at the beginning of
- * the tag and forward the pretag buckets before any substitution
- * work is performed on the tag. This maintains proper ordering.
- */
-static int split_and_pass_pretag_buckets(apr_bucket_brigade **brgd,
- include_ctx_t *cntxt,
- ap_filter_t *next)
-{
- apr_bucket_brigade *tag_plus;
- int rv;
-
- if ((APR_BRIGADE_EMPTY(cntxt->ssi_tag_brigade)) &&
- (cntxt->head_start_bucket != NULL)) {
- tag_plus = apr_brigade_split(*brgd, cntxt->head_start_bucket);
- rv = ap_pass_brigade(next, *brgd);
- cntxt->bytes_parsed = 0;
- *brgd = tag_plus;
- if (rv != APR_SUCCESS) {
- return rv;
- }
- }
- return APR_SUCCESS;
-}
-
static void *create_cgi_config(apr_pool_t *p, server_rec *s)
{
cgi_server_conf *c =
else {
procnew = apr_pcalloc(p, sizeof(*procnew));
if (e_info->prog_type == RUN_AS_SSI) {
- rc = split_and_pass_pretag_buckets(e_info->bb, e_info->ctx, e_info->next);
+ SPLIT_AND_PASS_PRETAG_BUCKETS(*(e_info->bb), e_info->ctx, e_info->next, rc);
if (rc != APR_SUCCESS) {
return rc;
}
char *tag = NULL;
char *tag_val = NULL;
char *file = r->filename;
- int retval;
apr_bucket *tmp_buck;
char parsed_string[MAX_STRING_LEN];
}
}
else if (!strcmp(tag, "cgi")) {
+ apr_status_t retval = APR_SUCCESS;
+
cgi_pfn_ps(r, tag_val, parsed_string, sizeof(parsed_string), 0);
- retval = split_and_pass_pretag_buckets(bb, ctx, f->next);
+ SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, retval);
if (retval != APR_SUCCESS) {
return retval;
}
int bufbytes;
} cgid_server_conf;
-/* This function is used to split the brigade at the beginning of
- * the tag and forward the pretag buckets before any substitution
- * work is performed on the tag. This maintains proper ordering.
- */
-static int split_and_pass_pretag_buckets(apr_bucket_brigade **brgd,
- include_ctx_t *cntxt,
- ap_filter_t *next)
-{
- apr_bucket_brigade *tag_plus;
- int rv;
-
- if ((APR_BRIGADE_EMPTY(cntxt->ssi_tag_brigade)) &&
- (cntxt->head_start_bucket != NULL)) {
- tag_plus = apr_brigade_split(*brgd, cntxt->head_start_bucket);
- rv = ap_pass_brigade(next, *brgd);
- cntxt->bytes_parsed = 0;
- *brgd = tag_plus;
- if (rv != APR_SUCCESS) {
- return rv;
- }
- }
- return APR_SUCCESS;
-}
-
/* If a request includes query info in the URL (stuff after "?"), and
* the query info does not contain "=" (indicative of a FORM submission),
* then this routine is called to create the argument list to be passed
char **env;
const char *location;
int sd;
- int retval;
+ apr_status_t rc = APR_SUCCESS;
+ int retval;
apr_bucket_brigade *bcgi;
apr_bucket *b;
struct sockaddr_un unix_addr;
"unable to connect to cgi daemon");
}
- retval = split_and_pass_pretag_buckets(bb, ctx, f->next);
- if (retval != APR_SUCCESS) {
- return retval;
+ SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, rc);
+ if (rc != APR_SUCCESS) {
+ return rc;
}
send_req(sd, r, command, env, SSI_REQ);
char *file = r->filename;
apr_bucket *tmp_buck;
char parsed_string[MAX_STRING_LEN];
- int retval;
*inserted_head = NULL;
if (ctx->flags & FLAG_PRINTING) {
/* just in case some stooge changed directories */
}
else if (!strcmp(tag, "cgi")) {
+ apr_status_t retval = APR_SUCCESS;
+
cgid_pfn_ps(r, tag_val, parsed_string, sizeof(parsed_string), 0);
- retval = split_and_pass_pretag_buckets(bb, ctx, f->next);
+ SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, retval);
if (retval != APR_SUCCESS) {
return retval;
}