From 4c200e098520ff9e5826f77cfb53b2c3931cb309 Mon Sep 17 00:00:00 2001 From: chendianqiang Date: Sun, 28 Aug 2022 16:33:41 +0800 Subject: [PATCH] fix hincrbyfloat not to create a key if the new value is invalid (#11149) Check the validity of the value before performing the create operation, prevents new data from being generated even if the request fails to execute. Co-authored-by: Oran Agra Co-authored-by: chendianqiang Co-authored-by: Binbin --- src/t_hash.cpp | 4 ++++ tests/unit/type/hash.tcl | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/t_hash.cpp b/src/t_hash.cpp index 1d152c463..5be55b218 100644 --- a/src/t_hash.cpp +++ b/src/t_hash.cpp @@ -729,6 +729,10 @@ void hincrbyfloatCommand(client *c) { unsigned int vlen; if (getLongDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return; + if (isnan(incr) || isinf(incr)) { + addReplyError(c,"value is NaN or Infinity"); + return; + } if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if (hashTypeGetValue(o,szFromObj(c->argv[2]),&vstr,&vlen,&ll) == C_OK) { if (vstr) { diff --git a/tests/unit/type/hash.tcl b/tests/unit/type/hash.tcl index 76a1e53df..916ebd534 100644 --- a/tests/unit/type/hash.tcl +++ b/tests/unit/type/hash.tcl @@ -833,4 +833,8 @@ start_server {tags {"hash"}} { set _ $k } {ZIP_INT_8B 127 ZIP_INT_16B 32767 ZIP_INT_32B 2147483647 ZIP_INT_64B 9223372036854775808 ZIP_INT_IMM_MIN 0 ZIP_INT_IMM_MAX 12} + test {HINCRBYFLOAT does not allow NaN or Infinity} { + assert_error "*value is NaN or Infinity*" {r hincrbyfloat hfoo field +inf} + assert_equal 0 [r exists hfoo] + } }