On Tue, Sep 26, 2017 at 11:37 +0200, Alexandr Nedvedicky wrote:
> Hello,
>
> whenever administrator asks pfctl to modify/remove anchor, which does not
> exist, the pfctl(8) prints warning 'pfctl: DIOCGETRULES: Invalid argument'.
> Few users on Solaris wants pfctl(8) to be more helpful.
>
> The 'Invalid Argument' (EINVAL) is returned when particular anchor is not
> found. Patch below changes pfctl output to this:
>
> # pfctl -sA
> # pfctl -a Foo -sr
> Anchor 'Foo' not found.
> #
>
> OK?
>
Can you please reverse the check so that adding conditions is possible
and the default is in the 'else' branch, i.e.
if (errno == EINVAL)
errx(1, "Anchor '%s' not found.\n", anchorname);
else
err(1, "pfctl_clear_rules");
uipc_mbuf.c are clearly unrelated, but what about the chunk below?
> @@ -850,7 +860,7 @@ pfctl_show_rules(int dev, char *path, in
> * to the kernel.
> */
> if ((p = strrchr(anchorname, '/')) != NULL &&
> - p[1] == '*' && p[2] == '\0') {
> + ((p[1] == '*' && p[2] == '\0') || (p[1] == '\0'))) {
> p[0] = '\0';
> }
>
I think this requires an explanation.
> thanks and
> regards
> sasha
>
> --------8<---------------8<---------------8<------------------8<--------
> diff -r 215db23c6b05 src/sbin/pfctl/pfctl.c
> --- src/sbin/pfctl/pfctl.c Mon Sep 25 13:38:48 2017 +0200
> +++ src/sbin/pfctl/pfctl.c Tue Sep 26 11:36:50 2017 +0200
> @@ -318,13 +318,23 @@ void
> pfctl_clear_rules(int dev, int opts, char *anchorname)
> {
> struct pfr_buffer t;
> + char *p;
> +
> + p = strrchr(anchorname, '/');
> + if (p != NULL && p[1] == '\0')
> + errx(1, "%s: bad anchor name %s", __func__, anchorname);
>
> memset(&t, 0, sizeof(t));
> t.pfrb_type = PFRB_TRANS;
> +
> if (pfctl_add_trans(&t, PF_TRANS_RULESET, anchorname) ||
> pfctl_trans(dev, &t, DIOCXBEGIN, 0) ||
> - pfctl_trans(dev, &t, DIOCXCOMMIT, 0))
> - err(1, "pfctl_clear_rules");
> + pfctl_trans(dev, &t, DIOCXCOMMIT, 0)) {
> + if (errno != EINVAL)
> + err(1, "pfctl_clear_rules");
> + else
> + errx(1, "Anchor '%s' not found.\n", anchorname);
> + }
> if ((opts & PF_OPT_QUIET) == 0)
> fprintf(stderr, "rules cleared\n");
> }
> @@ -850,7 +860,7 @@ pfctl_show_rules(int dev, char *path, in
> * to the kernel.
> */
> if ((p = strrchr(anchorname, '/')) != NULL &&
> - p[1] == '*' && p[2] == '\0') {
> + ((p[1] == '*' && p[2] == '\0') || (p[1] == '\0'))) {
> p[0] = '\0';
> }
>
> @@ -871,7 +881,11 @@ pfctl_show_rules(int dev, char *path, in
> if (opts & PF_OPT_SHOWALL) {
> pr.rule.action = PF_PASS;
> if (ioctl(dev, DIOCGETRULES, &pr)) {
> - warn("DIOCGETRULES");
> + if (errno != EINVAL)
> + warn("DIOCGETRULES");
> + else
> + fprintf(stderr, "Anchor '%s' not found.\n",
> + anchorname);
> ret = -1;
> goto error;
> }
> @@ -886,7 +900,10 @@ pfctl_show_rules(int dev, char *path, in
>
> pr.rule.action = PF_PASS;
> if (ioctl(dev, DIOCGETRULES, &pr)) {
> - warn("DIOCGETRULES");
> + if (errno != EINVAL)
> + warn("DIOCGETRULES");
> + else
> + fprintf(stderr, "Anchor '%s' not found.\n", anchorname);
> ret = -1;
> goto error;
> }
> diff -r 215db23c6b05 src/sys/kern/uipc_mbuf.c
> --- src/sys/kern/uipc_mbuf.c Mon Sep 25 13:38:48 2017 +0200
> +++ src/sys/kern/uipc_mbuf.c Tue Sep 26 11:36:50 2017 +0200
> @@ -1,4 +1,4 @@
> -/* $OpenBSD: uipc_mbuf.c,v 1.249 2017/09/15 18:13:05 bluhm Exp $ */
> +/* $OpenBSD: uipc_mbuf.c,v 1.248 2017/05/27 16:41:10 bluhm Exp $ */
> /* $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $ */
>
> /*
> @@ -804,13 +804,12 @@ m_adj(struct mbuf *mp, int req_len)
> struct mbuf *m;
> int count;
>
> - if (mp == NULL)
> + if ((m = mp) == NULL)
> return;
> if (len >= 0) {
> /*
> * Trim from head.
> */
> - m = mp;
> while (m != NULL && len > 0) {
> if (m->m_len <= len) {
> len -= m->m_len;
> @@ -834,7 +833,6 @@ m_adj(struct mbuf *mp, int req_len)
> */
> len = -len;
> count = 0;
> - m = mp;
> for (;;) {
> count += m->m_len;
> if (m->m_next == NULL)
> @@ -855,16 +853,15 @@ m_adj(struct mbuf *mp, int req_len)
> * Find the mbuf with last data, adjust its length,
> * and toss data from remaining mbufs on chain.
> */
> - if (mp->m_flags & M_PKTHDR)
> - mp->m_pkthdr.len = count;
> m = mp;
> - for (;;) {
> + if (m->m_flags & M_PKTHDR)
> + m->m_pkthdr.len = count;
> + for (; m; m = m->m_next) {
> if (m->m_len >= count) {
> m->m_len = count;
> break;
> }
> count -= m->m_len;
> - m = m->m_next;
> }
> while ((m = m->m_next) != NULL)
> m->m_len = 0;
> --------8<---------------8<---------------8<------------------8<--------
>