Thanks ! Willy, can you apply the patch ?

On Fri, 23 Dec 2016 19:47:10 +0300
Dmitry Sivachenko <[email protected]> wrote:

> 
> > On 23 Dec 2016, at 19:07, [email protected] wrote:
> > 
> > Ok, thanks Willy.
> > 
> > The news path in attachment. David, can you test the FreeBSD build ?
> > The patch is tested and validated for Linux.
> 
> 
> 
> Yes, it does fix FreeBSD build.
> 
> 
> 
> > 
> > Thierry
> > 
> > 
> > On Fri, 23 Dec 2016 14:50:38 +0100
> > Willy Tarreau <[email protected]> wrote:
> > 
> >> On Fri, Dec 23, 2016 at 02:37:13PM +0100, [email protected] 
> >> wrote:
> >>> thanks Willy for the idea. I will write a patch ASAP, but. why a 32bits
> >>> cast and not a 64 bit cast ?
> >> 
> >> First because existing code uses this already and it works. Second because
> >> the 64-bit check might be more expensive for 32-bit platforms than the
> >> double 32-bit check is for 64-bit platforms (though that's still to be
> >> verified in the assembly code, as some compilers manage to assign register
> >> pairs correctly).
> >> 
> >> Willy
> >> 
> > <0001-BUILD-lua-build-failed-on-FreeBSD.patch>
> 
>From d5995d34504daf2a66a6b046ecd5da0477f6036e Mon Sep 17 00:00:00 2001
From: Thierry FOURNIER <[email protected]>
Date: Fri, 23 Dec 2016 17:03:25 +0100
Subject: [PATCH] BUILD: lua: build failed on FreeBSD.
X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4

s6_addr* fields are not available in the userland on
BSD systems in general.

bug reported by David Carlier

needs backport to 1.7.x
---
 src/hlua_fcn.c |   18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c
index 5ac533a..58905d7 100644
--- a/src/hlua_fcn.c
+++ b/src/hlua_fcn.c
@@ -1016,14 +1016,16 @@ int hlua_match_addr(lua_State *L)
 			return 1;
 		}
 	} else {
-		if (((addr1->addr.v6.ip.s6_addr32[0] & addr2->addr.v6.mask.s6_addr32[0]) ==
-		     (addr2->addr.v6.ip.s6_addr32[0] & addr1->addr.v6.mask.s6_addr32[0])) &&
-		    ((addr1->addr.v6.ip.s6_addr32[1] & addr2->addr.v6.mask.s6_addr32[1]) ==
-		     (addr2->addr.v6.ip.s6_addr32[1] & addr1->addr.v6.mask.s6_addr32[1])) &&
-		    ((addr1->addr.v6.ip.s6_addr32[2] & addr2->addr.v6.mask.s6_addr32[2]) ==
-		     (addr2->addr.v6.ip.s6_addr32[2] & addr1->addr.v6.mask.s6_addr32[2])) &&
-		    ((addr1->addr.v6.ip.s6_addr32[3] & addr2->addr.v6.mask.s6_addr32[3]) ==
-		     (addr2->addr.v6.ip.s6_addr32[3] & addr1->addr.v6.mask.s6_addr32[3]))) {
+		int i;
+
+		for (i = 0; i < 16; i += 4) {
+			if ((*(uint32_t *)&addr1->addr.v6.ip.s6_addr[i] &
+			     *(uint32_t *)&addr2->addr.v6.mask.s6_addr[i]) !=
+			    (*(uint32_t *)&addr2->addr.v6.ip.s6_addr[i] &
+			     *(uint32_t *)&addr1->addr.v6.mask.s6_addr[i]))
+				break;
+		}
+		if (i == 16) {
 			lua_pushboolean(L, 1);
 			return 1;
 		}
-- 
1.7.10.4

Reply via email to