From b3e4b49ddb82a151f28a75215102f33a102945ad Mon Sep 17 00:00:00 2001
From: Menghan Li <menghanl@google.com>
Date: Tue, 28 May 2019 11:14:10 -0700
Subject: [PATCH] xds: fix eds balancer nil pointer panic without addresses
 (#2809)

---
 balancer/xds/edsbalancer/edsbalancer.go      | 4 +++-
 balancer/xds/edsbalancer/edsbalancer_test.go | 7 +++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/balancer/xds/edsbalancer/edsbalancer.go b/balancer/xds/edsbalancer/edsbalancer.go
index 483228fe..80b2f027 100644
--- a/balancer/xds/edsbalancer/edsbalancer.go
+++ b/balancer/xds/edsbalancer/edsbalancer.go
@@ -277,7 +277,9 @@ func (xdsB *EDSBalancer) UpdateBalancerState(s connectivity.State, p balancer.Pi
 
 // Close closes the balancer.
 func (xdsB *EDSBalancer) Close() {
-	xdsB.bg.close()
+	if xdsB.bg != nil {
+		xdsB.bg.close()
+	}
 }
 
 type dropPicker struct {
diff --git a/balancer/xds/edsbalancer/edsbalancer_test.go b/balancer/xds/edsbalancer/edsbalancer_test.go
index b1d7c339..5bdddd1e 100644
--- a/balancer/xds/edsbalancer/edsbalancer_test.go
+++ b/balancer/xds/edsbalancer/edsbalancer_test.go
@@ -337,6 +337,13 @@ func TestEDS_TwoLocalities(t *testing.T) {
 	}
 }
 
+func TestClose(t *testing.T) {
+	edsb := NewXDSBalancer(nil, nil)
+	// This is what could happen when switching between fallback and eds. This
+	// make sure it doesn't panic.
+	edsb.Close()
+}
+
 func init() {
 	balancer.Register(&testConstBalancerBuilder{})
 }