aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2022-06-30 14:19:23 +0000
committerEd Maste <emaste@FreeBSD.org>2022-08-29 13:06:03 +0000
commit86bd7f67c31f30169e77235e329d72ee98a87a29 (patch)
treeff5c334f0298821383e2301b46369b1bad7a0064
parent4149598b7a9296d0efbbc52b758d8d2d52b12e48 (diff)
downloadsrc-86bd7f67c31f30169e77235e329d72ee98a87a29.tar.gz
src-86bd7f67c31f30169e77235e329d72ee98a87a29.zip
pf: Make sure that pfi_update_status() always zeros counters
pfi_update_status() can return early if the status interface doesn't exist. But in this case pf_getstatus() was copying uninitialized stack memory into the output nvlist. Reported by: Jenkins (KMSAN job) Reviewed by: kp MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D35659 (cherry picked from commit 333670372ffe2f1c562e1088a7779eb709006ba2)
-rw-r--r--sys/netpfil/pf/pf_if.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/netpfil/pf/pf_if.c b/sys/netpfil/pf/pf_if.c
index 806718863f34..54ac84365180 100644
--- a/sys/netpfil/pf/pf_if.c
+++ b/sys/netpfil/pf/pf_if.c
@@ -789,6 +789,11 @@ pfi_update_status(const char *name, struct pf_status *pfs)
CK_STAILQ_HEAD(, ifg_member) ifg_members;
int i, j, k;
+ if (pfs) {
+ bzero(pfs->pcounters, sizeof(pfs->pcounters));
+ bzero(pfs->bcounters, sizeof(pfs->bcounters));
+ }
+
strlcpy(key.pfik_name, name, sizeof(key.pfik_name));
p = RB_FIND(pfi_ifhead, &V_pfi_ifs, (struct pfi_kkif *)&key);
if (p == NULL)
@@ -804,10 +809,6 @@ pfi_update_status(const char *name, struct pf_status *pfs)
CK_STAILQ_INIT(&ifg_members);
CK_STAILQ_INSERT_TAIL(&ifg_members, &p_member, ifgm_next);
}
- if (pfs) {
- bzero(pfs->pcounters, sizeof(pfs->pcounters));
- bzero(pfs->bcounters, sizeof(pfs->bcounters));
- }
CK_STAILQ_FOREACH(ifgm, &ifg_members, ifgm_next) {
if (ifgm->ifgm_ifp == NULL || ifgm->ifgm_ifp->if_pf_kif == NULL)
continue;