From owner-freebsd-bugs@FreeBSD.ORG Fri Feb 22 17:40:02 2008 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 05B6B16A404 for ; Fri, 22 Feb 2008 17:40:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id E1A5313C4EE for ; Fri, 22 Feb 2008 17:40:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.2/8.14.2) with ESMTP id m1MHe1SD092004 for ; Fri, 22 Feb 2008 17:40:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.2/8.14.1/Submit) id m1MHe1Eq092003; Fri, 22 Feb 2008 17:40:01 GMT (envelope-from gnats) Resent-Date: Fri, 22 Feb 2008 17:40:01 GMT Resent-Message-Id: <200802221740.m1MHe1Eq092003@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Mykola Dzham Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A0EC916A400 for ; Fri, 22 Feb 2008 17:38:10 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id 992E213C46A for ; Fri, 22 Feb 2008 17:38:10 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.2/8.14.2) with ESMTP id m1MHZX6W074238 for ; Fri, 22 Feb 2008 17:35:33 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.2/8.14.1/Submit) id m1MHZXm7074237; Fri, 22 Feb 2008 17:35:33 GMT (envelope-from nobody) Message-Id: <200802221735.m1MHZXm7074237@www.freebsd.org> Date: Fri, 22 Feb 2008 17:35:33 GMT From: Mykola Dzham To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: bin/120974: [patch] bsnmpd snmp_pf module work incorrect when DIOCGETALTQ return queue list not in qid order X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Feb 2008 17:40:02 -0000 >Number: 120974 >Category: bin >Synopsis: [patch] bsnmpd snmp_pf module work incorrect when DIOCGETALTQ return queue list not in qid order >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Feb 22 17:40:01 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Mykola Dzham >Release: 7.0-RC1 >Organization: >Environment: FreeBSD ruslan 7.0-RC1 FreeBSD 7.0-RC1 #0: Tue Jan 15 21:48:25 EET 2008 levsha@notebook.levsha.org.ua:/usr/obj/nanobsd.full/usr/src/sys/NANOBSD i386 >Description: bsnmpd pf_snmp module use code: for (i = 0; i < numqs; i++) { ... pa.nr = i; ioctl(dev, DIOCGETALTQ, &pa) ... } to request queue list from kernel, then use pa.altq.qid as queue id. Kernel can return queue list not in pa.altq.qid order. If this occur, then snmpwalk return only part of queue list. >How-To-Repeat: Use small program to test queue order, returned from kernel: #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int dev; struct pfioc_altq pa; int i, numqs, ticket; dev = open("/dev/pf", O_RDWR); if (dev == -1) err(1, "open(\"/dev/pf\") failed"); bzero(&pa, sizeof(pa)); if (ioctl(dev, DIOCGETALTQS, &pa)) { err(1, "ioctl(DIOCGETALTQS): %s", strerror(errno)); } numqs = pa.nr; ticket = pa.ticket; for (i = 0; i < numqs; i++) { pa.ticket = ticket; pa.nr = i; if (ioctl(dev, DIOCGETALTQ, &pa)) { err(1,"ioctl(DIOCGETALTQ): %s", strerror(errno)); } if (pa.altq.qid > 0) { printf("%d: %s\n", pa.altq.qid, pa.altq.qname); } } return 0; } If program return all queue list, but not in pa.altq.qid order, then you can reproduce problem: snmpwalk ... .1.3.6.1.4.1.12325.1.200.1.10 return only part of tree >Fix: Use INSERT_OBJECT_INT_LINK_INDEX macro instead of TAILQ_INSERT_TAIL (patch attached) Patch attached with submission follows: --- pf_snmp.c.orig 2008-02-22 19:01:50.000000000 +0200 +++ pf_snmp.c 2008-02-22 19:10:27.000000000 +0200 @@ -1025,7 +1025,7 @@ memcpy(&e->altq, &pa.altq, sizeof(struct pf_altq)); e->index = pa.altq.qid; pfq_table_count = i; - TAILQ_INSERT_TAIL(&pfq_table, e, link); + INSERT_OBJECT_INT_LINK_INDEX(e, &pfq_table, link, index); } } >Release-Note: >Audit-Trail: >Unformatted: