From owner-dev-commits-src-all@freebsd.org Fri Aug 6 15:00:41 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 10DE2657DED; Fri, 6 Aug 2021 15:00:41 +0000 (UTC) (envelope-from glebius@freebsd.org) Received: from cell.glebi.us (glebi.us [162.251.186.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "cell.glebi.us", Issuer "cell.glebi.us" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Gh7vX5gcnz4k92; Fri, 6 Aug 2021 15:00:40 +0000 (UTC) (envelope-from glebius@freebsd.org) Received: from cell.glebi.us (localhost [127.0.0.1]) by cell.glebi.us (8.16.1/8.16.1) with ESMTPS id 176F0dQM016686 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Fri, 6 Aug 2021 08:00:39 -0700 (PDT) (envelope-from glebius@freebsd.org) Received: (from glebius@localhost) by cell.glebi.us (8.16.1/8.16.1/Submit) id 176F0dwM016685; Fri, 6 Aug 2021 08:00:39 -0700 (PDT) (envelope-from glebius@freebsd.org) X-Authentication-Warning: cell.glebi.us: glebius set sender to glebius@freebsd.org using -f Date: Fri, 6 Aug 2021 08:00:39 -0700 From: Gleb Smirnoff To: Lutz Donnerhacke Cc: src-committers@freebsd.org, dev-commits-src-all@freebsd.org, dev-commits-src-main@freebsd.org Subject: Re: git: 25392fac9488 - main - libalias: Fix splay comparsion bug Message-ID: References: <202107022232.162MWUIY049889@gitrepo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <202107022232.162MWUIY049889@gitrepo.freebsd.org> X-Rspamd-Queue-Id: 4Gh7vX5gcnz4k92 X-Spamd-Bar: / Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [0.00 / 15.00]; ASN(0.00)[asn:27348, ipnet:162.251.186.0/24, country:US]; local_wl_from(0.00)[freebsd.org] X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Aug 2021 15:00:41 -0000 Lutz, Wouldn't declaring 'i' to u_short fix the root of the problem? On Fri, Jul 02, 2021 at 10:32:30PM +0000, Lutz Donnerhacke wrote: L> The branch main has been updated by donner: L> L> URL: https://cgit.FreeBSD.org/src/commit/?id=25392fac9488bcae5c451500df2e2945430484a6 L> L> commit 25392fac9488bcae5c451500df2e2945430484a6 L> Author: Lutz Donnerhacke L> AuthorDate: 2021-07-02 21:41:25 +0000 L> Commit: Lutz Donnerhacke L> CommitDate: 2021-07-02 22:31:53 +0000 L> L> libalias: Fix splay comparsion bug L> L> Comparing elements in a tree requires transitiviy. If a < b and b < c L> then a must be smaller than c. This way the tree elements are always L> pairwise comparable. L> L> Tristate comparsion functions returning values lower, equal, or L> greater than zero, are usually implemented by a simple subtraction of L> the operands. If the size of the operands are equal to the size of L> the result, integer modular arithmetics kick in and violates the L> transitivity. L> L> Example: L> Working on byte with 0, 120, and 240. Now computing the differences: L> 120 - 0 = 120 L> 240 - 120 = 120 L> 240 - 0 = -16 L> L> MFC after: 3 days L> sys/netinet/libalias/alias_db.h | 13 +++++++------ L> 1 file changed, 7 insertions(+), 6 deletions(-) L> L> diff --git a/sys/netinet/libalias/alias_db.h b/sys/netinet/libalias/alias_db.h L> index ec0b69c01f82..971ca305c1a6 100644 L> --- a/sys/netinet/libalias/alias_db.h L> +++ b/sys/netinet/libalias/alias_db.h L> @@ -351,10 +351,10 @@ static inline int L> cmp_out(struct alias_link *a, struct alias_link *b) { L> int i = a->src_port - b->src_port; L> if (i != 0) return (i); L> - i = a->src_addr.s_addr - b->src_addr.s_addr; L> - if (i != 0) return (i); L> - i = a->dst_addr.s_addr - b->dst_addr.s_addr; L> - if (i != 0) return (i); L> + if (a->src_addr.s_addr > b->src_addr.s_addr) return (1); L> + if (a->src_addr.s_addr < b->src_addr.s_addr) return (-1); L> + if (a->dst_addr.s_addr > b->dst_addr.s_addr) return (1); L> + if (a->dst_addr.s_addr < b->dst_addr.s_addr) return (-1); L> i = a->dst_port - b->dst_port; L> if (i != 0) return (i); L> i = a->link_type - b->link_type; L> @@ -368,8 +368,9 @@ cmp_in(struct group_in *a, struct group_in *b) { L> if (i != 0) return (i); L> i = a->link_type - b->link_type; L> if (i != 0) return (i); L> - i = a->alias_addr.s_addr - b->alias_addr.s_addr; L> - return (i); L> + if (a->alias_addr.s_addr > b->alias_addr.s_addr) return (1); L> + if (a->alias_addr.s_addr < b->alias_addr.s_addr) return (-1); L> + return (0); L> } L> SPLAY_PROTOTYPE(splay_in, group_in, in, cmp_in); L> -- Gleb Smirnoff