#define BREAK_EXECUTION(strm, chn, label) \
do { \
- strm_flt(strm)->current[CHN_IDX(chn)] = filter; \
+ if (ret < 0) { \
+ (strm)->last_entity.type = 2; \
+ (strm)->last_entity.ptr = filter; \
+ } \
+ strm_flt(strm)->current[CHN_IDX(chn)] = filter; \
goto label; \
} while (0)
list_for_each_entry(filter, &strm_flt(s)->filters, list) {
if (FLT_OPS(filter)->stream_set_backend) {
filter->calls++;
- if (FLT_OPS(filter)->stream_set_backend(s, filter, be) < 0)
+ if (FLT_OPS(filter)->stream_set_backend(s, filter, be) < 0) {
+ s->last_entity.type = 2;
+ s->last_entity.ptr = filter;
return -1;
+ }
}
}
if (be->be_req_ana & AN_REQ_FLT_START_BE) {
DBG_TRACE_DEVEL(FLT_ID(filter), STRM_EV_HTTP_ANA|STRM_EV_FLT_ANA, s);
filter->calls++;
ret = FLT_OPS(filter)->http_payload(s, filter, msg, out + offset, data - offset);
- if (ret < 0)
+ if (ret < 0) {
+ s->last_entity.type = 2;
+ s->last_entity.ptr = filter;
goto end;
+ }
data = ret + *flt_off - *strm_off;
*flt_off += ret;
}
DBG_TRACE_DEVEL(FLT_ID(filter), STRM_EV_FLT_ANA, s);
filter->calls++;
ret = FLT_OPS(filter)->channel_post_analyze(s, filter, chn, an_bit);
- if (ret < 0)
+ if (ret < 0) {
+ s->last_entity.type = 2;
+ s->last_entity.ptr = filter;
break;
+ }
filter->post_analyzers &= ~an_bit;
}
}
DBG_TRACE_DEVEL(FLT_ID(filter), STRM_EV_TCP_ANA|STRM_EV_FLT_ANA, s);
filter->calls++;
ret = FLT_OPS(filter)->tcp_payload(s, filter, chn, out + offset, data - offset);
- if (ret < 0)
+ if (ret < 0) {
+ s->last_entity.type = 2;
+ s->last_entity.ptr = filter;
goto end;
+ }
data = ret + *flt_off - *strm_off;
*flt_off += ret;
}
trash->data = snprintf(trash->area, trash->size, "%s:%d", rule->conf.file, rule->conf.line);
smp->data.u.str = *trash;
}
+ else if (smp->strm->last_entity.type == 2) {
+ struct filter *filter = smp->strm->last_entity.ptr;
+
+ if (FLT_ID(filter)) {
+ smp->flags |= SMP_F_CONST;
+ smp->data.u.str.area = (char *)FLT_ID(filter);
+ smp->data.u.str.data = strlen(FLT_ID(filter));
+ }
+ else {
+ struct buffer *trash = get_trash_chunk();
+
+ trash->data = snprintf(trash->area, trash->size, "%p", filter->config);
+ smp->data.u.str = *trash;
+ }
+ }
else
return 0;