summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfilipe oliveira <filipecosta.90@gmail.com>2022-12-15 20:25:38 +0000
committerOran Agra <oran@redislabs.com>2022-12-16 12:52:57 +0200
commit41bff94b43c73acc01ad086039ae64d08d2c227a (patch)
tree4688c21a1e8e1ce98086c4f1e851f7fcb8a3bd94
parentc0924a8361281cc71a74a0dcf53960ee51d78455 (diff)
downloadredis-41bff94b43c73acc01ad086039ae64d08d2c227a.tar.gz
Fixed small distance replies on GEODIST and GEO commands WITHDIST (#11631)
Fixes a regression introduced by #11552 in 7.0.6. it causes replies in the GEO commands to contain garbage when the result is a very small distance (less than 1) Includes test to confirm indeed with junk in buffer now we properly reply (cherry picked from commit d7b4c9175e89c68aadd8e4a0e1cfb8530e473533)
-rw-r--r--src/util.c24
-rw-r--r--tests/unit/geo.tcl7
2 files changed, 24 insertions, 7 deletions
diff --git a/src/util.c b/src/util.c
index 0e146479d..e1524b5e3 100644
--- a/src/util.c
+++ b/src/util.c
@@ -643,9 +643,7 @@ int fixedpoint_d2string(char *dst, size_t dstlen, double dvalue, int fractional_
if (dvalue == 0) {
dst[0] = '0';
dst[1] = '.';
- for (int i = 0; i < fractional_digits; i++) {
- dst[2 + i] = '0';
- }
+ memset(dst + 2, '0', fractional_digits);
dst[fractional_digits+2] = '\0';
return fractional_digits + 2;
}
@@ -694,10 +692,8 @@ int fixedpoint_d2string(char *dst, size_t dstlen, double dvalue, int fractional_
}
dst[integer_digits] = '.';
int size = integer_digits + 1 + fractional_digits;
- /* fill with 0 if required until fractional_digits */
- for (int i = integer_digits + 1; i < fractional_digits; i++) {
- dst[i] = '0';
- }
+ /* fill with 0 from fractional digits until size */
+ memset(dst + integer_digits + 1, '0', fractional_digits);
int next = size - 1;
while (value >= 100) {
int const i = (value % 100) * 2;
@@ -1246,6 +1242,20 @@ static void test_fixedpoint_d2string(void) {
sz = fixedpoint_d2string(buf, sizeof buf, v, 1);
assert(sz == 3);
assert(!strcmp(buf, "0.0"));
+ /* set junk in buffer */
+ memset(buf,'A',32);
+ v = 0.0001;
+ sz = fixedpoint_d2string(buf, sizeof buf, v, 4);
+ assert(sz == 6);
+ assert(buf[sz] == '\0');
+ assert(!strcmp(buf, "0.0001"));
+ /* set junk in buffer */
+ memset(buf,'A',32);
+ v = 6.0642951598391699e-05;
+ sz = fixedpoint_d2string(buf, sizeof buf, v, 4);
+ assert(sz == 6);
+ assert(buf[sz] == '\0');
+ assert(!strcmp(buf, "0.0001"));
v = 0.01;
sz = fixedpoint_d2string(buf, sizeof buf, v, 4);
assert(sz == 6);
diff --git a/tests/unit/geo.tcl b/tests/unit/geo.tcl
index bacc3e230..aa74855c3 100644
--- a/tests/unit/geo.tcl
+++ b/tests/unit/geo.tcl
@@ -502,6 +502,13 @@ start_server {tags {"geo"}} {
assert_equal {point2 point1} [r geosearch points fromlonlat -179 37 bybox 400 400 km asc]
}
+ test {GEOSEARCH with small distance} {
+ r del points
+ r geoadd points -122.407107 37.794300 1
+ r geoadd points -122.227336 37.794300 2
+ assert_equal {{1 0.0001} {2 9.8182}} [r GEORADIUS points -122.407107 37.794300 30 mi ASC WITHDIST]
+ }
+
foreach {type} {byradius bybox} {
test "GEOSEARCH fuzzy test - $type" {
if {$::accurate} { set attempt 300 } else { set attempt 30 }