On Thu, Jan 18, 2018 at 11:12:59PM -0500, Lawrence Teo wrote:
> The pf(4) DIOCX{BEGIN,COMMIT,ROLLBACK} calls support two ruleset types:
> PF_TRANS_RULESET and PF_TRANS_TABLE.
> 
> However, their switch statements in pf_ioctl.c only check for
> PF_TRANS_TABLE and do not check PF_TRANS_RULESET at all.
> 
> This diff adds explicit checks for PF_TRANS_RULESET to those switch
> statements.
> 
> ok?

OK bluhm@

> Index: pf_ioctl.c
> ===================================================================
> RCS file: /cvs/src/sys/net/pf_ioctl.c,v
> retrieving revision 1.326
> diff -u -p -U6 -r1.326 pf_ioctl.c
> --- pf_ioctl.c        28 Nov 2017 16:05:46 -0000      1.326
> +++ pf_ioctl.c        19 Jan 2018 03:40:47 -0000
> @@ -2244,21 +2244,27 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       PF_UNLOCK();
>                                       goto fail;
>                               }
>                               break;
> -                     default:
> +                     case PF_TRANS_RULESET:
>                               if ((error = pf_begin_rules(&ioe->ticket,
>                                   ioe->anchor))) {
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       PF_UNLOCK();
>                                       goto fail;
>                               }
>                               break;
> +                     default:
> +                             free(table, M_TEMP, sizeof(*table));
> +                             free(ioe, M_TEMP, sizeof(*ioe));
> +                             error = EINVAL;
> +                             PF_UNLOCK();
> +                             goto fail;
>                       }
>                       if (copyout(ioe, io->array+i, sizeof(io->array[i]))) {
>                               free(table, M_TEMP, sizeof(*table));
>                               free(ioe, M_TEMP, sizeof(*ioe));
>                               error = EFAULT;
>                               PF_UNLOCK();
> @@ -2310,21 +2316,27 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       PF_UNLOCK();
>                                       goto fail; /* really bad */
>                               }
>                               break;
> -                     default:
> +                     case PF_TRANS_RULESET:
>                               if ((error = pf_rollback_rules(ioe->ticket,
>                                   ioe->anchor))) {
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       PF_UNLOCK();
>                                       goto fail; /* really bad */
>                               }
>                               break;
> +                     default:
> +                             free(table, M_TEMP, sizeof(*table));
> +                             free(ioe, M_TEMP, sizeof(*ioe));
> +                             error = EINVAL;
> +                             PF_UNLOCK();
> +                             goto fail; /* really bad */
>                       }
>               }
>               free(table, M_TEMP, sizeof(*table));
>               free(ioe, M_TEMP, sizeof(*ioe));
>               PF_UNLOCK();
>               break;
> @@ -2370,25 +2382,31 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       error = EBUSY;
>                                       PF_UNLOCK();
>                                       goto fail;
>                               }
>                               break;
> -                     default:
> +                     case PF_TRANS_RULESET:
>                               rs = pf_find_ruleset(ioe->anchor);
>                               if (rs == NULL ||
>                                   !rs->rules.inactive.open ||
>                                   rs->rules.inactive.ticket !=
>                                   ioe->ticket) {
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       error = EBUSY;
>                                       PF_UNLOCK();
>                                       goto fail;
>                               }
>                               break;
> +                     default:
> +                             free(table, M_TEMP, sizeof(*table));
> +                             free(ioe, M_TEMP, sizeof(*ioe));
> +                             error = EINVAL;
> +                             PF_UNLOCK();
> +                             goto fail;
>                       }
>               }
>  
>               /*
>                * Checked already in DIOCSETLIMIT, but check again as the
>                * situation might have changed.
> @@ -2430,21 +2448,27 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       PF_UNLOCK();
>                                       goto fail; /* really bad */
>                               }
>                               break;
> -                     default:
> +                     case PF_TRANS_RULESET:
>                               if ((error = pf_commit_rules(ioe->ticket,
>                                   ioe->anchor))) {
>                                       free(table, M_TEMP, sizeof(*table));
>                                       free(ioe, M_TEMP, sizeof(*ioe));
>                                       PF_UNLOCK();
>                                       goto fail; /* really bad */
>                               }
>                               break;
> +                     default:
> +                             free(table, M_TEMP, sizeof(*table));
> +                             free(ioe, M_TEMP, sizeof(*ioe));
> +                             error = EINVAL;
> +                             PF_UNLOCK();
> +                             goto fail; /* really bad */
>                       }
>               }
>               for (i = 0; i < PF_LIMIT_MAX; i++) {
>                       if (pf_pool_limits[i].limit_new !=
>                           pf_pool_limits[i].limit &&
>                           pool_sethardlimit(pf_pool_limits[i].pp,

Reply via email to