From: Ben Pfaff Date: Sat, 22 Jan 2011 01:09:21 +0000 (-0800) Subject: multipath: Fix off-by-one in hash_threshold multipath calculation. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7bf2b001f07e63054bbc0d58fe64ce47bc3ab21;p=openvswitch multipath: Fix off-by-one in hash_threshold multipath calculation. 0xffffffff / (0xffffffff / n) can have a value as large as n (consider the n == 1 case), but we need a value no bigger than n-1. So add 1 before dividing to fix the problem. This caused a test failure on Debian "lenny" amd64 when apparently unrelated code changed. Reported-by: Justin Pettit --- diff --git a/lib/multipath.c b/lib/multipath.c index af0ebffe..83df6805 100644 --- a/lib/multipath.c +++ b/lib/multipath.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Nicira Networks. + * Copyright (c) 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -195,7 +195,10 @@ multipath_algorithm(uint32_t hash, enum nx_mp_algorithm algorithm, return hash % n_links; case NX_MP_ALG_HASH_THRESHOLD: - return hash / (UINT32_MAX / n_links); + if (n_links == 1) { + return 0; + } + return hash / (UINT32_MAX / n_links + 1); case NX_MP_ALG_HRW: return (n_links <= 64