j...@wxcvbn.org (Jérémie Courrèges-Anglas) writes:

> Please try the diff below.  It fixes the "backwards memcpy" problem
> easily noticeable with psql -h ::1.

Updated diff. Thanks to Stuart for reminding me that netmasks sa_len
values can be much surprising.

$OpenBSD$
--- src/backend/libpq/hba.c.orig        Mon Feb 16 21:53:21 2015
+++ src/backend/libpq/hba.c     Mon Feb 16 23:08:38 2015
@@ -700,8 +700,13 @@ check_ip(SockAddr *raddr, struct sockaddr * addr, stru
                struct sockaddr_storage addrcopy,
                                        maskcopy;
 
-               memcpy(&addrcopy, &addr, sizeof(addrcopy));
-               memcpy(&maskcopy, &mask, sizeof(maskcopy));
+               memcpy(&addrcopy, addr, sizeof(struct sockaddr_in));
+               /*
+                * On some OSes, if mask is obtained from eg. getifaddrs(3), 
sa_len
+                * can vary wildly. We already know that addr->sa_family == 
AF_INET,
+                * so just use sizeof(struct sockaddr_in).
+                */
+               memcpy(&maskcopy, mask, sizeof(struct sockaddr_in));
                pg_promote_v4_to_v6_addr(&addrcopy);
                pg_promote_v4_to_v6_mask(&maskcopy);
 


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to