keepalived: 1.2.17 -> 1.2.18

This commit is contained in:
William A. Kennington III 2015-06-30 13:11:18 -07:00
parent d64b3c8a5c
commit 83895f4901
2 changed files with 2 additions and 44 deletions

View File

@ -1,18 +1,15 @@
{ stdenv, fetchurl, openssl, net_snmp, libnl }:
stdenv.mkDerivation rec {
name = "keepalived-1.2.17";
name = "keepalived-1.2.18";
src = fetchurl {
url = "http://keepalived.org/software/${name}.tar.gz";
sha256 = "1w7px8phx3pyb3b56m3nz1a9ncx26q34fgy8j4n2dpi284jmqm6z";
sha256 = "07l1ywg44zj2s3wn9mh6y7qbcc0cgp6q1q39hnm0c5iv5izakkg5";
};
buildInputs = [ openssl net_snmp libnl ];
# Remove in 1.2.18
patches = [ ./fix-ip-release.patch ];
postPatch = ''
sed -i 's,$(DESTDIR)/usr/share,$out/share,g' Makefile.in
'';

View File

@ -1,39 +0,0 @@
From d80c171e7e8fe7fb4e0878a15027ac80c23b0a14 Mon Sep 17 00:00:00 2001
From: David Stapleton <dstaplet@brocade.com>
Date: Mon, 15 Jun 2015 13:07:21 +0100
Subject: [PATCH] Fix vrrp removes incorrect IPv4 address when VIPs are removed
When vrrp has an IPv4 VIP that matches the primary interface
address, when the VIP is removed from the interface, the original
address ends up getting removed instead of the VIP.
The kernel receives a netlink message instructing it to remove
address x from a particular interface. For IPv4, address x can
be configured multiple times providing the prefix lengths differ.
If the IFA_ADDRESS attribute is not specified in a RTM_DELADDR
message, the kernel will delete the first address it finds a
match on, prefix length is not taken into account.
This fix therefore adds the IFA_ADDRESS attribute when deleting
IPv4 addresses so that the address removed is actually the VIP.
---
keepalived/vrrp/vrrp_ipaddress.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/keepalived/vrrp/vrrp_ipaddress.c b/keepalived/vrrp/vrrp_ipaddress.c
index 0f9ce23..698f35c 100644
--- a/keepalived/vrrp/vrrp_ipaddress.c
+++ b/keepalived/vrrp/vrrp_ipaddress.c
@@ -86,6 +86,9 @@ netlink_ipaddress(ip_address_t *ipaddress, int cmd)
} else {
addattr_l(&req.n, sizeof(req), IFA_LOCAL,
&ipaddress->u.sin.sin_addr, sizeof(ipaddress->u.sin.sin_addr));
+ if (cmd == IPADDRESS_DEL)
+ addattr_l(&req.n, sizeof(req), IFA_ADDRESS,
+ &ipaddress->u.sin.sin_addr, sizeof(ipaddress->u.sin.sin_addr));
if (ipaddress->u.sin.sin_brd.s_addr)
addattr_l(&req.n, sizeof(req), IFA_BROADCAST,
&ipaddress->u.sin.sin_brd, sizeof(ipaddress->u.sin.sin_brd));
--
2.4.4