static int
iptablesHandleIpHdr(virBufferPtr buf,
+ virBufferPtr afterStateMatch,
virNWFilterHashTablePtr vars,
ipHdrDataDefPtr ipHdr,
int directionIn,
&ipHdr->dataConnlimitAbove))
goto err_exit;
- virBufferVSprintf(buf,
+ /* place connlimit after potential -m state --state ...
+ since this is the most useful order */
+ virBufferVSprintf(afterStateMatch,
" -m connlimit %s --connlimit-above %s",
ENTRY_GET_NEG_SIGN(&ipHdr->dataConnlimitAbove),
number);
if (HAS_ENTRY_ITEM(&ipHdr->dataComment)) {
printCommentVar(prefix, ipHdr->dataComment.u.string);
- virBufferAddLit(buf,
+ /* keep comments behind everything else -- they are packet eval.
+ no-ops */
+ virBufferAddLit(afterStateMatch,
" -m comment --comment \"$" COMMENT_VARNAME "\"");
}
err_exit:
virBufferFreeAndReset(buf);
+ virBufferFreeAndReset(afterStateMatch);
return 1;
}
char number[20];
virBuffer prefix = VIR_BUFFER_INITIALIZER;
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ virBuffer afterStateMatch = VIR_BUFFER_INITIALIZER;
virBufferPtr final = NULL;
const char *target;
const char *iptables_cmd = (isIPv6) ? ip6tables_cmd_path
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.tcpHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.udpHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.udpliteHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.espHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.ahHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.sctpHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.icmpHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.igmpHdrFilter.ipHdr,
directionIn,
goto err_exit;
if (iptablesHandleIpHdr(&buf,
+ &afterStateMatch,
vars,
&rule->p.allHdrFilter.ipHdr,
directionIn,
rule,
&buf);
+ if (virBufferError(&afterStateMatch)) {
+ virBufferFreeAndReset(&buf);
+ virBufferFreeAndReset(&prefix);
+ virBufferFreeAndReset(&afterStateMatch);
+ virReportOOMError();
+ return -1;
+ }
+
+ if (virBufferUse(&afterStateMatch)) {
+ char *s = virBufferContentAndReset(&afterStateMatch);
+
+ virBufferAdd(&buf, s, -1);
+
+ VIR_FREE(s);
+ }
+
virBufferVSprintf(&buf,
" -j %s" CMD_DEF_POST CMD_SEPARATOR
CMD_EXEC,
err_exit:
virBufferFreeAndReset(&buf);
virBufferFreeAndReset(&prefix);
+ virBufferFreeAndReset(&afterStateMatch);
return -1;
exit_no_error:
virBufferFreeAndReset(&buf);
virBufferFreeAndReset(&prefix);
+ virBufferFreeAndReset(&afterStateMatch);
return 0;
}