Close #81 单一IP域命中,未拷贝动作参数,导致段错误。
* 修正request header命中监测,request body命中redirect/block/replace动作后,优先级执行出错。
This commit is contained in:
@@ -546,7 +546,7 @@ static inline int action_cmp(enum pangu_action a1, enum pangu_action a2)
|
||||
|
||||
//enforce_rules[0] contains execute action.
|
||||
static enum pangu_action decide_ctrl_action(const struct Maat_rule_t * hit_rules, size_t n_hit,
|
||||
struct Maat_rule_t ** enforce_rules, size_t * n_enforce)
|
||||
struct Maat_rule_t ** enforce_rules, size_t * n_enforce, char** enforce_para)
|
||||
{
|
||||
size_t n_monit = 0, exist_enforce_num = 0, i = 0;
|
||||
const struct Maat_rule_t * prior_rule = hit_rules;
|
||||
@@ -603,9 +603,25 @@ static enum pangu_action decide_ctrl_action(const struct Maat_rule_t * hit_rules
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(*enforce_rules + exist_enforce_num, prior_rule, sizeof(struct Maat_rule_t));
|
||||
memmove(*enforce_rules+1, *enforce_rules, exist_enforce_num*sizeof(struct Maat_rule_t));
|
||||
memcpy(*enforce_rules, prior_rule, sizeof(struct Maat_rule_t));
|
||||
memcpy(*enforce_rules + exist_enforce_num + 1, monit_rule, n_monit * sizeof(struct Maat_rule_t));
|
||||
}
|
||||
if(*enforce_para!=NULL)
|
||||
{
|
||||
free(*enforce_para);
|
||||
}
|
||||
size_t __serv_def_len = (size_t)prior_rule->serv_def_len;
|
||||
*enforce_para = ALLOC(char, __serv_def_len);
|
||||
|
||||
if (__serv_def_len > MAX_SERVICE_DEFINE_LEN)
|
||||
{
|
||||
Maat_read_rule(g_pangu_rt->maat,prior_rule, MAAT_RULE_SERV_DEFINE, *enforce_para, __serv_def_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(*enforce_para, prior_rule->service_defined);
|
||||
}
|
||||
|
||||
return prior_action;
|
||||
}
|
||||
@@ -940,23 +956,9 @@ enum pangu_action http_scan(const struct tfe_http_session * session, enum tfe_ht
|
||||
|
||||
if (hit_cnt > 0)
|
||||
{
|
||||
ctx->action = decide_ctrl_action(result, hit_cnt, &ctx->enforce_rules, &ctx->n_enforce);
|
||||
ctx->action = decide_ctrl_action(result, hit_cnt, &ctx->enforce_rules, &ctx->n_enforce, &ctx->enforce_para);
|
||||
if (ctx->action == PG_ACTION_WHITELIST) goto __out;
|
||||
|
||||
size_t __serv_def_len = (size_t)ctx->enforce_rules[0].serv_def_len;
|
||||
ctx->enforce_para = ALLOC(char, __serv_def_len);
|
||||
|
||||
if (__serv_def_len > MAX_SERVICE_DEFINE_LEN)
|
||||
{
|
||||
read_rule_ret = Maat_read_rule(g_pangu_rt->maat, &ctx->enforce_rules[0], MAAT_RULE_SERV_DEFINE,
|
||||
ctx->enforce_para, ctx->enforce_rules[0].serv_def_len);
|
||||
assert(read_rule_ret == ctx->enforce_rules[0].serv_def_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(ctx->enforce_para, ctx->enforce_rules[0].service_defined);
|
||||
}
|
||||
|
||||
if (hit_cnt > 1)
|
||||
{
|
||||
p = buff;
|
||||
@@ -1258,7 +1260,7 @@ void pangu_on_http_begin(const struct tfe_stream * stream,
|
||||
|
||||
if (hit_cnt > 0)
|
||||
{
|
||||
ctx->action = decide_ctrl_action(result, hit_cnt, &ctx->enforce_rules, &ctx->n_enforce);
|
||||
ctx->action = decide_ctrl_action(result, hit_cnt, &ctx->enforce_rules, &ctx->n_enforce, &ctx->enforce_para);
|
||||
}
|
||||
if (ctx->action == PG_ACTION_WHITELIST)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user