From 452e5bffc0188355d83bb73b283a6248c005609b Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Tue, 24 Nov 2015 16:49:45 -0500 Subject: [PATCH] etcdserver: Fix panic for v3 transaction compares on non-existent keys Fixes #3920 --- etcdserver/v3demo_server.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/etcdserver/v3demo_server.go b/etcdserver/v3demo_server.go index 1e044d1c2..30b277358 100644 --- a/etcdserver/v3demo_server.go +++ b/etcdserver/v3demo_server.go @@ -301,8 +301,19 @@ func applyCompare(txnID int64, kv dstorage.KV, c *pb.Compare) (int64, bool) { } return rev, false } - - ckv := ckvs[0] + var ckv storagepb.KeyValue + if len(ckvs) != 0 { + ckv = ckvs[0] + } else { + // Use the zero value of ckv normally. However... + if c.Target == pb.Compare_VALUE { + // Always fail if we're comparing a value on a key that doesn't exist. + // We can treat non-existence as the empty set explicitly, such that + // even a key with a value of length 0 bytes is still a real key + // that was written that way + return rev, false + } + } // -1 is less, 0 is equal, 1 is greater var result int