2020-08-06 15:41:58 -04:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
|
|
|
|
* Copyright (c) 2010-2014, Pieter Noordhuis <pcnoordhuis at gmail dot com>
|
|
|
|
* Copyright (c) 2015, Matt Stancliff <matt at genges dot com>,
|
|
|
|
* Jan-Erik Rediger <janerik at fnordig dot com>
|
|
|
|
*
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
*
|
|
|
|
* * Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* * Neither the name of Redis nor the names of its contributors may be used
|
|
|
|
* to endorse or promote products derived from this software without
|
|
|
|
* specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "fmacros.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
#include "hiredis.h"
|
|
|
|
#include "net.h"
|
|
|
|
#include "sds.h"
|
|
|
|
#include "async.h"
|
|
|
|
#include "win32.h"
|
|
|
|
|
|
|
|
extern int redisContextUpdateConnectTimeout(redisContext *c, const struct timeval *timeout);
|
|
|
|
extern int redisContextUpdateCommandTimeout(redisContext *c, const struct timeval *timeout);
|
|
|
|
|
|
|
|
static redisContextFuncs redisContextDefaultFuncs = {
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
.close = redisNetClose,
|
2020-08-06 15:41:58 -04:00
|
|
|
.free_privctx = NULL,
|
|
|
|
.async_read = redisAsyncRead,
|
|
|
|
.async_write = redisAsyncWrite,
|
|
|
|
.read = redisNetRead,
|
|
|
|
.write = redisNetWrite
|
|
|
|
};
|
|
|
|
|
|
|
|
static redisReply *createReplyObject(int type);
|
|
|
|
static void *createStringObject(const redisReadTask *task, char *str, size_t len);
|
|
|
|
static void *createArrayObject(const redisReadTask *task, size_t elements);
|
|
|
|
static void *createIntegerObject(const redisReadTask *task, long long value);
|
|
|
|
static void *createDoubleObject(const redisReadTask *task, double value, char *str, size_t len);
|
|
|
|
static void *createNilObject(const redisReadTask *task);
|
|
|
|
static void *createBoolObject(const redisReadTask *task, int bval);
|
|
|
|
|
|
|
|
/* Default set of functions to build the reply. Keep in mind that such a
|
|
|
|
* function returning NULL is interpreted as OOM. */
|
|
|
|
static redisReplyObjectFunctions defaultFunctions = {
|
|
|
|
createStringObject,
|
|
|
|
createArrayObject,
|
|
|
|
createIntegerObject,
|
|
|
|
createDoubleObject,
|
|
|
|
createNilObject,
|
|
|
|
createBoolObject,
|
|
|
|
freeReplyObject
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Create a reply object */
|
|
|
|
static redisReply *createReplyObject(int type) {
|
|
|
|
redisReply *r = hi_calloc(1,sizeof(*r));
|
|
|
|
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
r->type = type;
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free a reply object */
|
|
|
|
void freeReplyObject(void *reply) {
|
|
|
|
redisReply *r = reply;
|
|
|
|
size_t j;
|
|
|
|
|
|
|
|
if (r == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
switch(r->type) {
|
|
|
|
case REDIS_REPLY_INTEGER:
|
2022-02-14 06:51:42 -05:00
|
|
|
case REDIS_REPLY_NIL:
|
|
|
|
case REDIS_REPLY_BOOL:
|
2020-08-06 15:41:58 -04:00
|
|
|
break; /* Nothing to free */
|
|
|
|
case REDIS_REPLY_ARRAY:
|
|
|
|
case REDIS_REPLY_MAP:
|
|
|
|
case REDIS_REPLY_SET:
|
|
|
|
case REDIS_REPLY_PUSH:
|
|
|
|
if (r->element != NULL) {
|
|
|
|
for (j = 0; j < r->elements; j++)
|
|
|
|
freeReplyObject(r->element[j]);
|
|
|
|
hi_free(r->element);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case REDIS_REPLY_ERROR:
|
|
|
|
case REDIS_REPLY_STATUS:
|
|
|
|
case REDIS_REPLY_STRING:
|
|
|
|
case REDIS_REPLY_DOUBLE:
|
|
|
|
case REDIS_REPLY_VERB:
|
2022-02-14 06:51:42 -05:00
|
|
|
case REDIS_REPLY_BIGNUM:
|
2020-08-06 15:41:58 -04:00
|
|
|
hi_free(r->str);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
hi_free(r);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *createStringObject(const redisReadTask *task, char *str, size_t len) {
|
|
|
|
redisReply *r, *parent;
|
|
|
|
char *buf;
|
|
|
|
|
|
|
|
r = createReplyObject(task->type);
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
assert(task->type == REDIS_REPLY_ERROR ||
|
|
|
|
task->type == REDIS_REPLY_STATUS ||
|
|
|
|
task->type == REDIS_REPLY_STRING ||
|
2022-02-14 06:51:42 -05:00
|
|
|
task->type == REDIS_REPLY_VERB ||
|
|
|
|
task->type == REDIS_REPLY_BIGNUM);
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
/* Copy string value */
|
|
|
|
if (task->type == REDIS_REPLY_VERB) {
|
|
|
|
buf = hi_malloc(len-4+1); /* Skip 4 bytes of verbatim type header. */
|
|
|
|
if (buf == NULL) goto oom;
|
|
|
|
|
|
|
|
memcpy(r->vtype,str,3);
|
|
|
|
r->vtype[3] = '\0';
|
|
|
|
memcpy(buf,str+4,len-4);
|
|
|
|
buf[len-4] = '\0';
|
|
|
|
r->len = len - 4;
|
|
|
|
} else {
|
|
|
|
buf = hi_malloc(len+1);
|
|
|
|
if (buf == NULL) goto oom;
|
|
|
|
|
|
|
|
memcpy(buf,str,len);
|
|
|
|
buf[len] = '\0';
|
|
|
|
r->len = len;
|
|
|
|
}
|
|
|
|
r->str = buf;
|
|
|
|
|
|
|
|
if (task->parent) {
|
|
|
|
parent = task->parent->obj;
|
|
|
|
assert(parent->type == REDIS_REPLY_ARRAY ||
|
|
|
|
parent->type == REDIS_REPLY_MAP ||
|
|
|
|
parent->type == REDIS_REPLY_SET ||
|
|
|
|
parent->type == REDIS_REPLY_PUSH);
|
|
|
|
parent->element[task->idx] = r;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
|
|
|
|
oom:
|
|
|
|
freeReplyObject(r);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *createArrayObject(const redisReadTask *task, size_t elements) {
|
|
|
|
redisReply *r, *parent;
|
|
|
|
|
|
|
|
r = createReplyObject(task->type);
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (elements > 0) {
|
|
|
|
r->element = hi_calloc(elements,sizeof(redisReply*));
|
|
|
|
if (r->element == NULL) {
|
|
|
|
freeReplyObject(r);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
r->elements = elements;
|
|
|
|
|
|
|
|
if (task->parent) {
|
|
|
|
parent = task->parent->obj;
|
|
|
|
assert(parent->type == REDIS_REPLY_ARRAY ||
|
|
|
|
parent->type == REDIS_REPLY_MAP ||
|
|
|
|
parent->type == REDIS_REPLY_SET ||
|
|
|
|
parent->type == REDIS_REPLY_PUSH);
|
|
|
|
parent->element[task->idx] = r;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *createIntegerObject(const redisReadTask *task, long long value) {
|
|
|
|
redisReply *r, *parent;
|
|
|
|
|
|
|
|
r = createReplyObject(REDIS_REPLY_INTEGER);
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
r->integer = value;
|
|
|
|
|
|
|
|
if (task->parent) {
|
|
|
|
parent = task->parent->obj;
|
|
|
|
assert(parent->type == REDIS_REPLY_ARRAY ||
|
|
|
|
parent->type == REDIS_REPLY_MAP ||
|
|
|
|
parent->type == REDIS_REPLY_SET ||
|
|
|
|
parent->type == REDIS_REPLY_PUSH);
|
|
|
|
parent->element[task->idx] = r;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *createDoubleObject(const redisReadTask *task, double value, char *str, size_t len) {
|
|
|
|
redisReply *r, *parent;
|
|
|
|
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
if (len == SIZE_MAX) // Prevents hi_malloc(0) if len equals to SIZE_MAX
|
|
|
|
return NULL;
|
|
|
|
|
2020-08-06 15:41:58 -04:00
|
|
|
r = createReplyObject(REDIS_REPLY_DOUBLE);
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
r->dval = value;
|
|
|
|
r->str = hi_malloc(len+1);
|
|
|
|
if (r->str == NULL) {
|
|
|
|
freeReplyObject(r);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* The double reply also has the original protocol string representing a
|
|
|
|
* double as a null terminated string. This way the caller does not need
|
|
|
|
* to format back for string conversion, especially since Redis does efforts
|
|
|
|
* to make the string more human readable avoiding the calssical double
|
|
|
|
* decimal string conversion artifacts. */
|
|
|
|
memcpy(r->str, str, len);
|
|
|
|
r->str[len] = '\0';
|
2022-02-14 06:51:42 -05:00
|
|
|
r->len = len;
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
if (task->parent) {
|
|
|
|
parent = task->parent->obj;
|
|
|
|
assert(parent->type == REDIS_REPLY_ARRAY ||
|
|
|
|
parent->type == REDIS_REPLY_MAP ||
|
2022-02-14 06:51:42 -05:00
|
|
|
parent->type == REDIS_REPLY_SET ||
|
|
|
|
parent->type == REDIS_REPLY_PUSH);
|
2020-08-06 15:41:58 -04:00
|
|
|
parent->element[task->idx] = r;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *createNilObject(const redisReadTask *task) {
|
|
|
|
redisReply *r, *parent;
|
|
|
|
|
|
|
|
r = createReplyObject(REDIS_REPLY_NIL);
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (task->parent) {
|
|
|
|
parent = task->parent->obj;
|
|
|
|
assert(parent->type == REDIS_REPLY_ARRAY ||
|
|
|
|
parent->type == REDIS_REPLY_MAP ||
|
2022-02-14 06:51:42 -05:00
|
|
|
parent->type == REDIS_REPLY_SET ||
|
|
|
|
parent->type == REDIS_REPLY_PUSH);
|
2020-08-06 15:41:58 -04:00
|
|
|
parent->element[task->idx] = r;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void *createBoolObject(const redisReadTask *task, int bval) {
|
|
|
|
redisReply *r, *parent;
|
|
|
|
|
|
|
|
r = createReplyObject(REDIS_REPLY_BOOL);
|
|
|
|
if (r == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
r->integer = bval != 0;
|
|
|
|
|
|
|
|
if (task->parent) {
|
|
|
|
parent = task->parent->obj;
|
|
|
|
assert(parent->type == REDIS_REPLY_ARRAY ||
|
|
|
|
parent->type == REDIS_REPLY_MAP ||
|
2022-02-14 06:51:42 -05:00
|
|
|
parent->type == REDIS_REPLY_SET ||
|
|
|
|
parent->type == REDIS_REPLY_PUSH);
|
2020-08-06 15:41:58 -04:00
|
|
|
parent->element[task->idx] = r;
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return the number of digits of 'v' when converted to string in radix 10.
|
|
|
|
* Implementation borrowed from link in redis/src/util.c:string2ll(). */
|
|
|
|
static uint32_t countDigits(uint64_t v) {
|
|
|
|
uint32_t result = 1;
|
|
|
|
for (;;) {
|
|
|
|
if (v < 10) return result;
|
|
|
|
if (v < 100) return result + 1;
|
|
|
|
if (v < 1000) return result + 2;
|
|
|
|
if (v < 10000) return result + 3;
|
|
|
|
v /= 10000U;
|
|
|
|
result += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Helper that calculates the bulk length given a certain string length. */
|
|
|
|
static size_t bulklen(size_t len) {
|
|
|
|
return 1+countDigits(len)+2+len+2;
|
|
|
|
}
|
|
|
|
|
|
|
|
int redisvFormatCommand(char **target, const char *format, va_list ap) {
|
|
|
|
const char *c = format;
|
|
|
|
char *cmd = NULL; /* final command */
|
|
|
|
int pos; /* position in final command */
|
2020-08-15 15:24:31 -04:00
|
|
|
hisds curarg, newarg; /* current argument */
|
2020-08-06 15:41:58 -04:00
|
|
|
int touched = 0; /* was the current argument touched? */
|
|
|
|
char **curargv = NULL, **newargv = NULL;
|
|
|
|
int argc = 0;
|
|
|
|
int totlen = 0;
|
|
|
|
int error_type = 0; /* 0 = no error; -1 = memory error; -2 = format error */
|
|
|
|
int j;
|
|
|
|
|
|
|
|
/* Abort if there is not target to set */
|
|
|
|
if (target == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* Build the command string accordingly to protocol */
|
2020-08-15 15:24:31 -04:00
|
|
|
curarg = hi_sdsempty();
|
2020-08-06 15:41:58 -04:00
|
|
|
if (curarg == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
while(*c != '\0') {
|
|
|
|
if (*c != '%' || c[1] == '\0') {
|
|
|
|
if (*c == ' ') {
|
|
|
|
if (touched) {
|
|
|
|
newargv = hi_realloc(curargv,sizeof(char*)*(argc+1));
|
|
|
|
if (newargv == NULL) goto memory_err;
|
|
|
|
curargv = newargv;
|
|
|
|
curargv[argc++] = curarg;
|
2020-08-15 15:24:31 -04:00
|
|
|
totlen += bulklen(hi_sdslen(curarg));
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
/* curarg is put in argv so it can be overwritten. */
|
2020-08-15 15:24:31 -04:00
|
|
|
curarg = hi_sdsempty();
|
2020-08-06 15:41:58 -04:00
|
|
|
if (curarg == NULL) goto memory_err;
|
|
|
|
touched = 0;
|
|
|
|
}
|
|
|
|
} else {
|
2020-08-15 15:24:31 -04:00
|
|
|
newarg = hi_sdscatlen(curarg,c,1);
|
2020-08-06 15:41:58 -04:00
|
|
|
if (newarg == NULL) goto memory_err;
|
|
|
|
curarg = newarg;
|
|
|
|
touched = 1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
char *arg;
|
|
|
|
size_t size;
|
|
|
|
|
|
|
|
/* Set newarg so it can be checked even if it is not touched. */
|
|
|
|
newarg = curarg;
|
|
|
|
|
|
|
|
switch(c[1]) {
|
|
|
|
case 's':
|
|
|
|
arg = va_arg(ap,char*);
|
|
|
|
size = strlen(arg);
|
|
|
|
if (size > 0)
|
2020-08-15 15:24:31 -04:00
|
|
|
newarg = hi_sdscatlen(curarg,arg,size);
|
2020-08-06 15:41:58 -04:00
|
|
|
break;
|
|
|
|
case 'b':
|
|
|
|
arg = va_arg(ap,char*);
|
|
|
|
size = va_arg(ap,size_t);
|
|
|
|
if (size > 0)
|
2020-08-15 15:24:31 -04:00
|
|
|
newarg = hi_sdscatlen(curarg,arg,size);
|
2020-08-06 15:41:58 -04:00
|
|
|
break;
|
|
|
|
case '%':
|
2020-08-15 15:24:31 -04:00
|
|
|
newarg = hi_sdscat(curarg,"%");
|
2020-08-06 15:41:58 -04:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* Try to detect printf format */
|
|
|
|
{
|
|
|
|
static const char intfmts[] = "diouxX";
|
|
|
|
static const char flags[] = "#0-+ ";
|
|
|
|
char _format[16];
|
|
|
|
const char *_p = c+1;
|
|
|
|
size_t _l = 0;
|
|
|
|
va_list _cpy;
|
|
|
|
|
|
|
|
/* Flags */
|
|
|
|
while (*_p != '\0' && strchr(flags,*_p) != NULL) _p++;
|
|
|
|
|
|
|
|
/* Field width */
|
|
|
|
while (*_p != '\0' && isdigit(*_p)) _p++;
|
|
|
|
|
|
|
|
/* Precision */
|
|
|
|
if (*_p == '.') {
|
|
|
|
_p++;
|
|
|
|
while (*_p != '\0' && isdigit(*_p)) _p++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Copy va_list before consuming with va_arg */
|
|
|
|
va_copy(_cpy,ap);
|
|
|
|
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
/* Make sure we have more characters otherwise strchr() accepts
|
|
|
|
* '\0' as an integer specifier. This is checked after above
|
|
|
|
* va_copy() to avoid UB in fmt_invalid's call to va_end(). */
|
|
|
|
if (*_p == '\0') goto fmt_invalid;
|
|
|
|
|
2020-08-06 15:41:58 -04:00
|
|
|
/* Integer conversion (without modifiers) */
|
|
|
|
if (strchr(intfmts,*_p) != NULL) {
|
|
|
|
va_arg(ap,int);
|
|
|
|
goto fmt_valid;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Double conversion (without modifiers) */
|
|
|
|
if (strchr("eEfFgGaA",*_p) != NULL) {
|
|
|
|
va_arg(ap,double);
|
|
|
|
goto fmt_valid;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Size: char */
|
|
|
|
if (_p[0] == 'h' && _p[1] == 'h') {
|
|
|
|
_p += 2;
|
|
|
|
if (*_p != '\0' && strchr(intfmts,*_p) != NULL) {
|
|
|
|
va_arg(ap,int); /* char gets promoted to int */
|
|
|
|
goto fmt_valid;
|
|
|
|
}
|
|
|
|
goto fmt_invalid;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Size: short */
|
|
|
|
if (_p[0] == 'h') {
|
|
|
|
_p += 1;
|
|
|
|
if (*_p != '\0' && strchr(intfmts,*_p) != NULL) {
|
|
|
|
va_arg(ap,int); /* short gets promoted to int */
|
|
|
|
goto fmt_valid;
|
|
|
|
}
|
|
|
|
goto fmt_invalid;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Size: long long */
|
|
|
|
if (_p[0] == 'l' && _p[1] == 'l') {
|
|
|
|
_p += 2;
|
|
|
|
if (*_p != '\0' && strchr(intfmts,*_p) != NULL) {
|
|
|
|
va_arg(ap,long long);
|
|
|
|
goto fmt_valid;
|
|
|
|
}
|
|
|
|
goto fmt_invalid;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Size: long */
|
|
|
|
if (_p[0] == 'l') {
|
|
|
|
_p += 1;
|
|
|
|
if (*_p != '\0' && strchr(intfmts,*_p) != NULL) {
|
|
|
|
va_arg(ap,long);
|
|
|
|
goto fmt_valid;
|
|
|
|
}
|
|
|
|
goto fmt_invalid;
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt_invalid:
|
|
|
|
va_end(_cpy);
|
|
|
|
goto format_err;
|
|
|
|
|
|
|
|
fmt_valid:
|
|
|
|
_l = (_p+1)-c;
|
|
|
|
if (_l < sizeof(_format)-2) {
|
|
|
|
memcpy(_format,c,_l);
|
|
|
|
_format[_l] = '\0';
|
2020-08-15 15:24:31 -04:00
|
|
|
newarg = hi_sdscatvprintf(curarg,_format,_cpy);
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
/* Update current position (note: outer blocks
|
|
|
|
* increment c twice so compensate here) */
|
|
|
|
c = _p-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
va_end(_cpy);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newarg == NULL) goto memory_err;
|
|
|
|
curarg = newarg;
|
|
|
|
|
|
|
|
touched = 1;
|
|
|
|
c++;
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
if (*c == '\0')
|
|
|
|
break;
|
2020-08-06 15:41:58 -04:00
|
|
|
}
|
|
|
|
c++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add the last argument if needed */
|
|
|
|
if (touched) {
|
|
|
|
newargv = hi_realloc(curargv,sizeof(char*)*(argc+1));
|
|
|
|
if (newargv == NULL) goto memory_err;
|
|
|
|
curargv = newargv;
|
|
|
|
curargv[argc++] = curarg;
|
2020-08-15 15:24:31 -04:00
|
|
|
totlen += bulklen(hi_sdslen(curarg));
|
2020-08-06 15:41:58 -04:00
|
|
|
} else {
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(curarg);
|
2020-08-06 15:41:58 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Clear curarg because it was put in curargv or was free'd. */
|
|
|
|
curarg = NULL;
|
|
|
|
|
|
|
|
/* Add bytes needed to hold multi bulk count */
|
|
|
|
totlen += 1+countDigits(argc)+2;
|
|
|
|
|
|
|
|
/* Build the command at protocol level */
|
|
|
|
cmd = hi_malloc(totlen+1);
|
|
|
|
if (cmd == NULL) goto memory_err;
|
|
|
|
|
|
|
|
pos = sprintf(cmd,"*%d\r\n",argc);
|
|
|
|
for (j = 0; j < argc; j++) {
|
2020-08-15 15:24:31 -04:00
|
|
|
pos += sprintf(cmd+pos,"$%zu\r\n",hi_sdslen(curargv[j]));
|
|
|
|
memcpy(cmd+pos,curargv[j],hi_sdslen(curargv[j]));
|
|
|
|
pos += hi_sdslen(curargv[j]);
|
|
|
|
hi_sdsfree(curargv[j]);
|
2020-08-06 15:41:58 -04:00
|
|
|
cmd[pos++] = '\r';
|
|
|
|
cmd[pos++] = '\n';
|
|
|
|
}
|
|
|
|
assert(pos == totlen);
|
|
|
|
cmd[pos] = '\0';
|
|
|
|
|
|
|
|
hi_free(curargv);
|
|
|
|
*target = cmd;
|
|
|
|
return totlen;
|
|
|
|
|
|
|
|
format_err:
|
|
|
|
error_type = -2;
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
memory_err:
|
|
|
|
error_type = -1;
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
if (curargv) {
|
|
|
|
while(argc--)
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(curargv[argc]);
|
2020-08-06 15:41:58 -04:00
|
|
|
hi_free(curargv);
|
|
|
|
}
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(curarg);
|
2020-08-06 15:41:58 -04:00
|
|
|
hi_free(cmd);
|
|
|
|
|
|
|
|
return error_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Format a command according to the Redis protocol. This function
|
|
|
|
* takes a format similar to printf:
|
|
|
|
*
|
|
|
|
* %s represents a C null terminated string you want to interpolate
|
|
|
|
* %b represents a binary safe string
|
|
|
|
*
|
|
|
|
* When using %b you need to provide both the pointer to the string
|
|
|
|
* and the length in bytes as a size_t. Examples:
|
|
|
|
*
|
|
|
|
* len = redisFormatCommand(target, "GET %s", mykey);
|
|
|
|
* len = redisFormatCommand(target, "SET %s %b", mykey, myval, myvallen);
|
|
|
|
*/
|
|
|
|
int redisFormatCommand(char **target, const char *format, ...) {
|
|
|
|
va_list ap;
|
|
|
|
int len;
|
|
|
|
va_start(ap,format);
|
|
|
|
len = redisvFormatCommand(target,format,ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
/* The API says "-1" means bad result, but we now also return "-2" in some
|
|
|
|
* cases. Force the return value to always be -1. */
|
|
|
|
if (len < 0)
|
|
|
|
len = -1;
|
|
|
|
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
/* Format a command according to the Redis protocol using an hisds string and
|
|
|
|
* hi_sdscatfmt for the processing of arguments. This function takes the
|
2020-08-06 15:41:58 -04:00
|
|
|
* number of arguments, an array with arguments and an array with their
|
|
|
|
* lengths. If the latter is set to NULL, strlen will be used to compute the
|
|
|
|
* argument lengths.
|
|
|
|
*/
|
2020-08-15 15:24:31 -04:00
|
|
|
long long redisFormatSdsCommandArgv(hisds *target, int argc, const char **argv,
|
2022-02-14 06:51:42 -05:00
|
|
|
const size_t *argvlen)
|
2020-08-06 15:41:58 -04:00
|
|
|
{
|
2020-08-15 15:24:31 -04:00
|
|
|
hisds cmd, aux;
|
2022-02-14 06:51:42 -05:00
|
|
|
unsigned long long totlen, len;
|
2020-08-06 15:41:58 -04:00
|
|
|
int j;
|
|
|
|
|
|
|
|
/* Abort on a NULL target */
|
|
|
|
if (target == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* Calculate our total size */
|
|
|
|
totlen = 1+countDigits(argc)+2;
|
|
|
|
for (j = 0; j < argc; j++) {
|
|
|
|
len = argvlen ? argvlen[j] : strlen(argv[j]);
|
|
|
|
totlen += bulklen(len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Use an SDS string for command construction */
|
2020-08-15 15:24:31 -04:00
|
|
|
cmd = hi_sdsempty();
|
2020-08-06 15:41:58 -04:00
|
|
|
if (cmd == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* We already know how much storage we need */
|
2020-08-15 15:24:31 -04:00
|
|
|
aux = hi_sdsMakeRoomFor(cmd, totlen);
|
2020-08-06 15:41:58 -04:00
|
|
|
if (aux == NULL) {
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(cmd);
|
2020-08-06 15:41:58 -04:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd = aux;
|
|
|
|
|
|
|
|
/* Construct command */
|
2020-08-15 15:24:31 -04:00
|
|
|
cmd = hi_sdscatfmt(cmd, "*%i\r\n", argc);
|
2020-08-06 15:41:58 -04:00
|
|
|
for (j=0; j < argc; j++) {
|
|
|
|
len = argvlen ? argvlen[j] : strlen(argv[j]);
|
2020-08-15 15:24:31 -04:00
|
|
|
cmd = hi_sdscatfmt(cmd, "$%U\r\n", len);
|
|
|
|
cmd = hi_sdscatlen(cmd, argv[j], len);
|
|
|
|
cmd = hi_sdscatlen(cmd, "\r\n", sizeof("\r\n")-1);
|
2020-08-06 15:41:58 -04:00
|
|
|
}
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
assert(hi_sdslen(cmd)==totlen);
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
*target = cmd;
|
|
|
|
return totlen;
|
|
|
|
}
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
void redisFreeSdsCommand(hisds cmd) {
|
|
|
|
hi_sdsfree(cmd);
|
2020-08-06 15:41:58 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Format a command according to the Redis protocol. This function takes the
|
|
|
|
* number of arguments, an array with arguments and an array with their
|
|
|
|
* lengths. If the latter is set to NULL, strlen will be used to compute the
|
|
|
|
* argument lengths.
|
|
|
|
*/
|
2022-02-14 06:51:42 -05:00
|
|
|
long long redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen) {
|
2020-08-06 15:41:58 -04:00
|
|
|
char *cmd = NULL; /* final command */
|
2022-02-14 06:51:42 -05:00
|
|
|
size_t pos; /* position in final command */
|
|
|
|
size_t len, totlen;
|
|
|
|
int j;
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
/* Abort on a NULL target */
|
|
|
|
if (target == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* Calculate number of bytes needed for the command */
|
|
|
|
totlen = 1+countDigits(argc)+2;
|
|
|
|
for (j = 0; j < argc; j++) {
|
|
|
|
len = argvlen ? argvlen[j] : strlen(argv[j]);
|
|
|
|
totlen += bulklen(len);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Build the command at protocol level */
|
|
|
|
cmd = hi_malloc(totlen+1);
|
|
|
|
if (cmd == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
pos = sprintf(cmd,"*%d\r\n",argc);
|
|
|
|
for (j = 0; j < argc; j++) {
|
|
|
|
len = argvlen ? argvlen[j] : strlen(argv[j]);
|
|
|
|
pos += sprintf(cmd+pos,"$%zu\r\n",len);
|
|
|
|
memcpy(cmd+pos,argv[j],len);
|
|
|
|
pos += len;
|
|
|
|
cmd[pos++] = '\r';
|
|
|
|
cmd[pos++] = '\n';
|
|
|
|
}
|
|
|
|
assert(pos == totlen);
|
|
|
|
cmd[pos] = '\0';
|
|
|
|
|
|
|
|
*target = cmd;
|
|
|
|
return totlen;
|
|
|
|
}
|
|
|
|
|
|
|
|
void redisFreeCommand(char *cmd) {
|
|
|
|
hi_free(cmd);
|
|
|
|
}
|
|
|
|
|
|
|
|
void __redisSetError(redisContext *c, int type, const char *str) {
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
c->err = type;
|
|
|
|
if (str != NULL) {
|
|
|
|
len = strlen(str);
|
|
|
|
len = len < (sizeof(c->errstr)-1) ? len : (sizeof(c->errstr)-1);
|
|
|
|
memcpy(c->errstr,str,len);
|
|
|
|
c->errstr[len] = '\0';
|
|
|
|
} else {
|
|
|
|
/* Only REDIS_ERR_IO may lack a description! */
|
|
|
|
assert(type == REDIS_ERR_IO);
|
|
|
|
strerror_r(errno, c->errstr, sizeof(c->errstr));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
redisReader *redisReaderCreate(void) {
|
|
|
|
return redisReaderCreateWithFunctions(&defaultFunctions);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void redisPushAutoFree(void *privdata, void *reply) {
|
|
|
|
(void)privdata;
|
|
|
|
freeReplyObject(reply);
|
|
|
|
}
|
|
|
|
|
|
|
|
static redisContext *redisContextInit(void) {
|
|
|
|
redisContext *c;
|
|
|
|
|
|
|
|
c = hi_calloc(1, sizeof(*c));
|
|
|
|
if (c == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
c->funcs = &redisContextDefaultFuncs;
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
c->obuf = hi_sdsempty();
|
2020-08-06 15:41:58 -04:00
|
|
|
c->reader = redisReaderCreate();
|
|
|
|
c->fd = REDIS_INVALID_FD;
|
|
|
|
|
|
|
|
if (c->obuf == NULL || c->reader == NULL) {
|
|
|
|
redisFree(c);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
void redisFree(redisContext *c) {
|
|
|
|
if (c == NULL)
|
|
|
|
return;
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
|
|
|
|
if (c->funcs && c->funcs->close) {
|
|
|
|
c->funcs->close(c);
|
|
|
|
}
|
2020-08-06 15:41:58 -04:00
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(c->obuf);
|
2020-08-06 15:41:58 -04:00
|
|
|
redisReaderFree(c->reader);
|
|
|
|
hi_free(c->tcp.host);
|
|
|
|
hi_free(c->tcp.source_addr);
|
|
|
|
hi_free(c->unix_sock.path);
|
|
|
|
hi_free(c->connect_timeout);
|
|
|
|
hi_free(c->command_timeout);
|
|
|
|
hi_free(c->saddr);
|
|
|
|
|
|
|
|
if (c->privdata && c->free_privdata)
|
|
|
|
c->free_privdata(c->privdata);
|
|
|
|
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
if (c->funcs && c->funcs->free_privctx)
|
2020-08-06 15:41:58 -04:00
|
|
|
c->funcs->free_privctx(c->privctx);
|
|
|
|
|
|
|
|
memset(c, 0xff, sizeof(*c));
|
|
|
|
hi_free(c);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisFD redisFreeKeepFd(redisContext *c) {
|
|
|
|
redisFD fd = c->fd;
|
|
|
|
c->fd = REDIS_INVALID_FD;
|
|
|
|
redisFree(c);
|
|
|
|
return fd;
|
|
|
|
}
|
|
|
|
|
|
|
|
int redisReconnect(redisContext *c) {
|
|
|
|
c->err = 0;
|
|
|
|
memset(c->errstr, '\0', strlen(c->errstr));
|
|
|
|
|
|
|
|
if (c->privctx && c->funcs->free_privctx) {
|
|
|
|
c->funcs->free_privctx(c->privctx);
|
|
|
|
c->privctx = NULL;
|
|
|
|
}
|
|
|
|
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
if (c->funcs && c->funcs->close) {
|
|
|
|
c->funcs->close(c);
|
|
|
|
}
|
2020-08-06 15:41:58 -04:00
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(c->obuf);
|
2020-08-06 15:41:58 -04:00
|
|
|
redisReaderFree(c->reader);
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
c->obuf = hi_sdsempty();
|
2020-08-06 15:41:58 -04:00
|
|
|
c->reader = redisReaderCreate();
|
|
|
|
|
|
|
|
if (c->obuf == NULL || c->reader == NULL) {
|
|
|
|
__redisSetError(c, REDIS_ERR_OOM, "Out of memory");
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ret = REDIS_ERR;
|
|
|
|
if (c->connection_type == REDIS_CONN_TCP) {
|
|
|
|
ret = redisContextConnectBindTcp(c, c->tcp.host, c->tcp.port,
|
|
|
|
c->connect_timeout, c->tcp.source_addr);
|
|
|
|
} else if (c->connection_type == REDIS_CONN_UNIX) {
|
|
|
|
ret = redisContextConnectUnix(c, c->unix_sock.path, c->connect_timeout);
|
|
|
|
} else {
|
|
|
|
/* Something bad happened here and shouldn't have. There isn't
|
|
|
|
enough information in the context to reconnect. */
|
|
|
|
__redisSetError(c,REDIS_ERR_OTHER,"Not enough information to reconnect");
|
|
|
|
ret = REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (c->command_timeout != NULL && (c->flags & REDIS_BLOCK) && c->fd != REDIS_INVALID_FD) {
|
|
|
|
redisContextSetTimeout(c, *c->command_timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectWithOptions(const redisOptions *options) {
|
|
|
|
redisContext *c = redisContextInit();
|
|
|
|
if (c == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (!(options->options & REDIS_OPT_NONBLOCK)) {
|
|
|
|
c->flags |= REDIS_BLOCK;
|
|
|
|
}
|
|
|
|
if (options->options & REDIS_OPT_REUSEADDR) {
|
|
|
|
c->flags |= REDIS_REUSEADDR;
|
|
|
|
}
|
|
|
|
if (options->options & REDIS_OPT_NOAUTOFREE) {
|
|
|
|
c->flags |= REDIS_NO_AUTO_FREE;
|
|
|
|
}
|
2022-02-14 06:51:42 -05:00
|
|
|
if (options->options & REDIS_OPT_NOAUTOFREEREPLIES) {
|
|
|
|
c->flags |= REDIS_NO_AUTO_FREE_REPLIES;
|
|
|
|
}
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
if (options->options & REDIS_OPT_PREFER_IPV4) {
|
|
|
|
c->flags |= REDIS_PREFER_IPV4;
|
|
|
|
}
|
|
|
|
if (options->options & REDIS_OPT_PREFER_IPV6) {
|
|
|
|
c->flags |= REDIS_PREFER_IPV6;
|
|
|
|
}
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
/* Set any user supplied RESP3 PUSH handler or use freeReplyObject
|
|
|
|
* as a default unless specifically flagged that we don't want one. */
|
|
|
|
if (options->push_cb != NULL)
|
|
|
|
redisSetPushCallback(c, options->push_cb);
|
|
|
|
else if (!(options->options & REDIS_OPT_NO_PUSH_AUTOFREE))
|
|
|
|
redisSetPushCallback(c, redisPushAutoFree);
|
|
|
|
|
|
|
|
c->privdata = options->privdata;
|
|
|
|
c->free_privdata = options->free_privdata;
|
|
|
|
|
|
|
|
if (redisContextUpdateConnectTimeout(c, options->connect_timeout) != REDIS_OK ||
|
|
|
|
redisContextUpdateCommandTimeout(c, options->command_timeout) != REDIS_OK) {
|
|
|
|
__redisSetError(c, REDIS_ERR_OOM, "Out of memory");
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (options->type == REDIS_CONN_TCP) {
|
|
|
|
redisContextConnectBindTcp(c, options->endpoint.tcp.ip,
|
|
|
|
options->endpoint.tcp.port, options->connect_timeout,
|
|
|
|
options->endpoint.tcp.source_addr);
|
|
|
|
} else if (options->type == REDIS_CONN_UNIX) {
|
|
|
|
redisContextConnectUnix(c, options->endpoint.unix_socket,
|
|
|
|
options->connect_timeout);
|
|
|
|
} else if (options->type == REDIS_CONN_USERFD) {
|
|
|
|
c->fd = options->endpoint.fd;
|
|
|
|
c->flags |= REDIS_CONNECTED;
|
|
|
|
} else {
|
2022-02-14 06:51:42 -05:00
|
|
|
redisFree(c);
|
2020-08-06 15:41:58 -04:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
if (c->err == 0 && c->fd != REDIS_INVALID_FD &&
|
|
|
|
options->command_timeout != NULL && (c->flags & REDIS_BLOCK))
|
|
|
|
{
|
2020-08-06 15:41:58 -04:00
|
|
|
redisContextSetTimeout(c, *options->command_timeout);
|
|
|
|
}
|
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Connect to a Redis instance. On error the field error in the returned
|
|
|
|
* context will be set to the return value of the error function.
|
|
|
|
* When no set of reply functions is given, the default set will be used. */
|
|
|
|
redisContext *redisConnect(const char *ip, int port) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_TCP(&options, ip, port);
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_TCP(&options, ip, port);
|
|
|
|
options.connect_timeout = &tv;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectNonBlock(const char *ip, int port) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_TCP(&options, ip, port);
|
|
|
|
options.options |= REDIS_OPT_NONBLOCK;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectBindNonBlock(const char *ip, int port,
|
|
|
|
const char *source_addr) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_TCP(&options, ip, port);
|
|
|
|
options.endpoint.tcp.source_addr = source_addr;
|
|
|
|
options.options |= REDIS_OPT_NONBLOCK;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port,
|
|
|
|
const char *source_addr) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_TCP(&options, ip, port);
|
|
|
|
options.endpoint.tcp.source_addr = source_addr;
|
|
|
|
options.options |= REDIS_OPT_NONBLOCK|REDIS_OPT_REUSEADDR;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectUnix(const char *path) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_UNIX(&options, path);
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_UNIX(&options, path);
|
|
|
|
options.connect_timeout = &tv;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectUnixNonBlock(const char *path) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
REDIS_OPTIONS_SET_UNIX(&options, path);
|
|
|
|
options.options |= REDIS_OPT_NONBLOCK;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
redisContext *redisConnectFd(redisFD fd) {
|
|
|
|
redisOptions options = {0};
|
|
|
|
options.type = REDIS_CONN_USERFD;
|
|
|
|
options.endpoint.fd = fd;
|
|
|
|
return redisConnectWithOptions(&options);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set read/write timeout on a blocking socket. */
|
|
|
|
int redisSetTimeout(redisContext *c, const struct timeval tv) {
|
|
|
|
if (c->flags & REDIS_BLOCK)
|
|
|
|
return redisContextSetTimeout(c,tv);
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
int redisEnableKeepAliveWithInterval(redisContext *c, int interval) {
|
|
|
|
return redisKeepAlive(c, interval);
|
|
|
|
}
|
|
|
|
|
2020-08-06 15:41:58 -04:00
|
|
|
/* Enable connection KeepAlive. */
|
|
|
|
int redisEnableKeepAlive(redisContext *c) {
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
return redisKeepAlive(c, REDIS_KEEPALIVE_INTERVAL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set the socket option TCP_USER_TIMEOUT. */
|
|
|
|
int redisSetTcpUserTimeout(redisContext *c, unsigned int timeout) {
|
|
|
|
return redisContextSetTcpUserTimeout(c, timeout);
|
2020-08-06 15:41:58 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Set a user provided RESP3 PUSH handler and return any old one set. */
|
|
|
|
redisPushFn *redisSetPushCallback(redisContext *c, redisPushFn *fn) {
|
|
|
|
redisPushFn *old = c->push_cb;
|
|
|
|
c->push_cb = fn;
|
|
|
|
return old;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Use this function to handle a read event on the descriptor. It will try
|
|
|
|
* and read some bytes from the socket and feed them to the reply parser.
|
|
|
|
*
|
|
|
|
* After this function is called, you may use redisGetReplyFromReader to
|
|
|
|
* see if there is a reply available. */
|
|
|
|
int redisBufferRead(redisContext *c) {
|
|
|
|
char buf[1024*16];
|
|
|
|
int nread;
|
|
|
|
|
|
|
|
/* Return early when the context has seen an error. */
|
|
|
|
if (c->err)
|
|
|
|
return REDIS_ERR;
|
|
|
|
|
|
|
|
nread = c->funcs->read(c, buf, sizeof(buf));
|
2022-02-14 06:51:42 -05:00
|
|
|
if (nread < 0) {
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
if (nread > 0 && redisReaderFeed(c->reader, buf, nread) != REDIS_OK) {
|
|
|
|
__redisSetError(c, c->reader->err, c->reader->errstr);
|
2020-08-06 15:41:58 -04:00
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Write the output buffer to the socket.
|
|
|
|
*
|
|
|
|
* Returns REDIS_OK when the buffer is empty, or (a part of) the buffer was
|
|
|
|
* successfully written to the socket. When the buffer is empty after the
|
|
|
|
* write operation, "done" is set to 1 (if given).
|
|
|
|
*
|
Squashed 'deps/hiredis/' changes from f8de9a4bd..b6a052fe0
b6a052fe0 Helper for setting TCP_USER_TIMEOUT socket option (#1188)
3fa9b6944 Add RedisModule adapter (#1182)
d13c091e9 Fix wincrypt symbols conflict
5d84c8cfd Add a test ensuring we don't clobber connection error.
3f95fcdae Don't attempt to set a timeout if we are in an error state.
aacb84b8d Fix typo in makefile.
563b062e3 Accept -nan per the RESP3 spec recommendation.
04c1b5b02 Fix colliding option values
4ca8e73f6 Rework searching for openssl
cd208812f Attempt to find the correct path for openssl.
011f7093c Allow specifying the keepalive interval
e9243d4f7 Cmake static or shared (#1160)
1cbd5bc76 Write a version file for the CMake package (#1165)
6f5bae8c6 fix typo
acd09461d CMakeLists.txt: respect BUILD_SHARED_LIBS
97fcf0fd1 Add sdevent adapter
ccff093bc Bump dev version for the next release cycle.
c14775b4e Prepare for v1.1.0 GA
f0bdf8405 Add support for nan in RESP3 double (#1133)
991b0b0b3 Add an example that calls redisCommandArgv (#1140)
a36686f84 CI updates (#1139)
8ad4985e9 fix flag reference
7583ebb1b Make freeing a NULL redisAsyncContext a no op.
2c53dea7f Update version in dev branch.
f063370ed Prepare for v1.1.0-rc1
2b069573a CI fixes in preparation of release
e1e9eb40d Add author information to release-drafter template.
afc29ee1a Update for mingw cross compile
ceb8a8815 fixed cpp build error with adapters/libhv.h
3b15a04b5 Fixup of PR734: Coverage of hiredis.c (#1124)
c245df9fb CMake corrections for building on Windows (#1122)
9c338a598 Fix PUSH handler tests for Redis >= 7.0.5
6d5c3ee74 Install on windows fixes (#1117)
68b29e1ad Add timeout support to libhv adapter. (#1109)
722e3409c Additional include directory given by pkg-config (#1118)
bd9ccb8c4 Use __attribute__ when building with clang on windows
5392adc26 set default SSL certificate directory
560e66486 Minor refactor
d756f68a5 Add libhv example to our standard Makefile
a66916719 Add adapters/libhv
855b48a81 Fix pkgconfig for hiredis_ssl
79ae5ffc6 Fix protocol error (#1106)
61b5b299f Use a windows specific keepalive function. (#1104)
fce8abc1c Introduce .close method for redisContextFuncs
cfb6ca881 Add REDIS_OPT_PREFER_UNSPEC (#1101)
cc7c35ce6 Update documentation to explain redisConnectWithOptions.
bc8d837b7 fix heap-buffer-overflow (#957)
ca4a0e850 uvadapter: reduce number of uv_poll_start calls
35d398c90 Fix cmake config path on Linux. CMake config files were installed to `/usr/local/share/hiredis`, which is not recognizable by `find_package()`. I'm not sure why it was set that way. Given the commit introducing it is for Windows, I keep that behavior consistent there, but fix the rest.
10c78c6e1 Add possibility to prefer IPv6, IPv4 or unspecified
1abe0c828 fuzzer: No alloc in redisFormatCommand() when fail
329eaf9ba Fix heap-buffer-overflow issue in redisvFormatCommad
eaae7321c Polling adapter requires sockcompat.h
0a5fa3dde Regression test for off-by-one parsing error
9e174e8f7 Add do while(0) protection for macros
4ad99c69a Rework asSleep to be a generic millisleep function.
75cb6c1ea Do store command timeout in the context for redisSetTimeout (#593)
c57cad658 CMake: remove dict.c form hiredis_sources
8491a65a9 Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
77e4f09ea Merge pull request #964 from afcidk/fix-createDoubleObject
9219f7e7c Merge pull request #901 from devnexen/illumos_test_fix
810cc6104 Merge pull request #905 from sundb/master
df8b74d69 Merge pull request #1091 from redis/ssl-error-ub-fix
0ed6cdec3 Fix some undefined behaviour
507a6dcaa Merge pull request #1090 from Nordix/subscribe-oom-error
b044eaa6a Copy error to redisAsyncContext when finding subscribe cb
e0200b797 Merge pull request #1087 from redis/const-and-non-const-callback
6a3e96ad2 Maintain backward compatibiliy withour onConnect callback.
e7afd998f Merge pull request #1079 from SukkaW/drop-macos-10.15-runner
17c8fe079 Merge pull request #931 from kristjanvalur/pr2
b808c0c20 Merge pull request #1083 from chayim/ck-drafter
367a82bf0 Merge pull request #1085 from stanhu/ssl-improve-options-setting
71119a71d Make it possible to set SSL verify mode
dd7979ac1 Merge pull request #1084 from stanhu/sh-improve-ssl-docs
c71116178 Improve example for SSL initialization in README.md
5c9b6b571 Release drafter
a606ccf2a CI: use recommended `vmactions/freebsd-vm@v0`
0865c115b Merge pull request #1080 from Nordix/readme-corrections
f6cee7142 Fix README typos
06be7ff31 Merge pull request #1050 from smmir-cent/fix-cmake-version
7dd833d54 CI: bump macos runner version
f69fac769 Drop `const` on redisAsyncContext in redisConnectCallback Since the callback is now re-entrant, it can call apis such as redisAsyncDisconnect()
005d7edeb Support calling redisAsyncDisconnect from the onConnected callback, by deferring context deletion
6ed060920 Add async regression test for issue #931
eaa2a7ee7 Merge pull request #932 from kristjanvalur/pr3
2ccef30f3 Add regression test for issue #945
4b901d44a Initial async tests
31c91408e Polling adapter and example
8a15f4d65 Merge pull request #1057 from orgads/static-name
902dd047f Merge pull request #1054 from kristjanvalur/pr08
c78d0926b Merge pull request #1074 from michael-grunder/kristjanvalur-pr4
2b115d56c Whitespace
1343988ce Fix typos
47b57aa24 Add some documentation on connect/disconnect callbacks and command callbacks
a890d9ce2 Merge pull request #1073 from michael-grunder/kristjanvalur-pr1
f246ee433 Whitespace, style
94c1985bd Use correct type for getsockopt()
5e002bc21 Support failed async connects on windows.
5d68ad2f4 Merge pull request #1072 from michael-grunder/fix-redis7-unit-tests
f4b6ed289 Fix tests so they work for Redis 7.0
95a0c1283 Merge pull request #1058 from orgads/win64
eedb37a65 Fix warnings on Win64
47c3ecefc Merge pull request #1062 from yossigo/fix-push-notification-order
e23d91c97 Merge pull request #1061 from yossigo/update-redis-apt
34211ad54 Merge pull request #1063 from redis/fix-windows-tests
9957af7e3 Whitelist hiredis repo path in cygwin
b455b3381 Handle push notifications before or after reply.
aed9ce446 Use official repository for redis package.
d7683f35a Merge pull request #1047 from Nordix/unsubscribe-handling
7c44a9d7e Merge pull request #1045 from Nordix/sds-updates
dd4bf9783 Use the same name for static and shared libraries
ff57c18b9 Embed debug information in windows static lib, rather than create a .pdb file
8310ad4f5 fix cmake version
7123b87f6 Handle any pipelined unsubscribe in async
b6fb548fc Ignore pubsub replies without a channel/pattern
00b82683b Handle overflows as errors instead of asserting
64062a1d4 Catch size_t overflows in sds.c
066c6de79 Use size_t/long to avoid truncation
c6657ef65 Merge branch 'redis:master' into master
50cdcab49 Fix potential fault at createDoubleObject
fd033e983 Remove semicolon after do-while in _EL_CLEANUP
664c415e7 Illumos test fixes, error message difference fot bad hostname test.
git-subtree-dir: deps/hiredis
git-subtree-split: b6a052fe0959dae69e16b9d74449faeb1b70dbe1
2023-05-30 15:23:45 -04:00
|
|
|
* Returns REDIS_ERR if an unrecoverable error occurred in the underlying
|
|
|
|
* c->funcs->write function.
|
2020-08-06 15:41:58 -04:00
|
|
|
*/
|
|
|
|
int redisBufferWrite(redisContext *c, int *done) {
|
|
|
|
|
|
|
|
/* Return early when the context has seen an error. */
|
|
|
|
if (c->err)
|
|
|
|
return REDIS_ERR;
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
if (hi_sdslen(c->obuf) > 0) {
|
2020-08-06 15:41:58 -04:00
|
|
|
ssize_t nwritten = c->funcs->write(c);
|
|
|
|
if (nwritten < 0) {
|
|
|
|
return REDIS_ERR;
|
|
|
|
} else if (nwritten > 0) {
|
2020-08-15 15:24:31 -04:00
|
|
|
if (nwritten == (ssize_t)hi_sdslen(c->obuf)) {
|
|
|
|
hi_sdsfree(c->obuf);
|
|
|
|
c->obuf = hi_sdsempty();
|
2020-08-06 15:41:58 -04:00
|
|
|
if (c->obuf == NULL)
|
|
|
|
goto oom;
|
|
|
|
} else {
|
2020-08-15 15:24:31 -04:00
|
|
|
if (hi_sdsrange(c->obuf,nwritten,-1) < 0) goto oom;
|
2020-08-06 15:41:58 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-08-15 15:24:31 -04:00
|
|
|
if (done != NULL) *done = (hi_sdslen(c->obuf) == 0);
|
2020-08-06 15:41:58 -04:00
|
|
|
return REDIS_OK;
|
|
|
|
|
|
|
|
oom:
|
|
|
|
__redisSetError(c, REDIS_ERR_OOM, "Out of memory");
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Internal helper that returns 1 if the reply was a RESP3 PUSH
|
|
|
|
* message and we handled it with a user-provided callback. */
|
|
|
|
static int redisHandledPushReply(redisContext *c, void *reply) {
|
|
|
|
if (reply && c->push_cb && redisIsPushReply(reply)) {
|
|
|
|
c->push_cb(c->privdata, reply);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-02-14 06:51:42 -05:00
|
|
|
/* Get a reply from our reader or set an error in the context. */
|
|
|
|
int redisGetReplyFromReader(redisContext *c, void **reply) {
|
|
|
|
if (redisReaderGetReply(c->reader, reply) == REDIS_ERR) {
|
|
|
|
__redisSetError(c,c->reader->err,c->reader->errstr);
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Internal helper to get the next reply from our reader while handling
|
|
|
|
* any PUSH messages we encounter along the way. This is separate from
|
|
|
|
* redisGetReplyFromReader so as to not change its behavior. */
|
|
|
|
static int redisNextInBandReplyFromReader(redisContext *c, void **reply) {
|
|
|
|
do {
|
|
|
|
if (redisGetReplyFromReader(c, reply) == REDIS_ERR)
|
|
|
|
return REDIS_ERR;
|
|
|
|
} while (redisHandledPushReply(c, *reply));
|
|
|
|
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
2020-08-06 15:41:58 -04:00
|
|
|
int redisGetReply(redisContext *c, void **reply) {
|
|
|
|
int wdone = 0;
|
|
|
|
void *aux = NULL;
|
|
|
|
|
|
|
|
/* Try to read pending replies */
|
2022-02-14 06:51:42 -05:00
|
|
|
if (redisNextInBandReplyFromReader(c,&aux) == REDIS_ERR)
|
2020-08-06 15:41:58 -04:00
|
|
|
return REDIS_ERR;
|
|
|
|
|
|
|
|
/* For the blocking context, flush output buffer and read reply */
|
|
|
|
if (aux == NULL && c->flags & REDIS_BLOCK) {
|
|
|
|
/* Write until done */
|
|
|
|
do {
|
|
|
|
if (redisBufferWrite(c,&wdone) == REDIS_ERR)
|
|
|
|
return REDIS_ERR;
|
|
|
|
} while (!wdone);
|
|
|
|
|
|
|
|
/* Read until there is a reply */
|
|
|
|
do {
|
|
|
|
if (redisBufferRead(c) == REDIS_ERR)
|
|
|
|
return REDIS_ERR;
|
|
|
|
|
2022-02-14 06:51:42 -05:00
|
|
|
if (redisNextInBandReplyFromReader(c,&aux) == REDIS_ERR)
|
|
|
|
return REDIS_ERR;
|
2020-08-06 15:41:58 -04:00
|
|
|
} while (aux == NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set reply or free it if we were passed NULL */
|
|
|
|
if (reply != NULL) {
|
|
|
|
*reply = aux;
|
|
|
|
} else {
|
|
|
|
freeReplyObject(aux);
|
|
|
|
}
|
|
|
|
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Helper function for the redisAppendCommand* family of functions.
|
|
|
|
*
|
|
|
|
* Write a formatted command to the output buffer. When this family
|
|
|
|
* is used, you need to call redisGetReply yourself to retrieve
|
|
|
|
* the reply (or replies in pub/sub).
|
|
|
|
*/
|
|
|
|
int __redisAppendCommand(redisContext *c, const char *cmd, size_t len) {
|
2020-08-15 15:24:31 -04:00
|
|
|
hisds newbuf;
|
2020-08-06 15:41:58 -04:00
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
newbuf = hi_sdscatlen(c->obuf,cmd,len);
|
2020-08-06 15:41:58 -04:00
|
|
|
if (newbuf == NULL) {
|
|
|
|
__redisSetError(c,REDIS_ERR_OOM,"Out of memory");
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
c->obuf = newbuf;
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t len) {
|
|
|
|
|
|
|
|
if (__redisAppendCommand(c, cmd, len) != REDIS_OK) {
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int redisvAppendCommand(redisContext *c, const char *format, va_list ap) {
|
|
|
|
char *cmd;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
len = redisvFormatCommand(&cmd,format,ap);
|
|
|
|
if (len == -1) {
|
|
|
|
__redisSetError(c,REDIS_ERR_OOM,"Out of memory");
|
|
|
|
return REDIS_ERR;
|
|
|
|
} else if (len == -2) {
|
|
|
|
__redisSetError(c,REDIS_ERR_OTHER,"Invalid format string");
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (__redisAppendCommand(c,cmd,len) != REDIS_OK) {
|
|
|
|
hi_free(cmd);
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
hi_free(cmd);
|
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int redisAppendCommand(redisContext *c, const char *format, ...) {
|
|
|
|
va_list ap;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
va_start(ap,format);
|
|
|
|
ret = redisvAppendCommand(c,format,ap);
|
|
|
|
va_end(ap);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen) {
|
2020-08-15 15:24:31 -04:00
|
|
|
hisds cmd;
|
2022-02-14 06:51:42 -05:00
|
|
|
long long len;
|
2020-08-06 15:41:58 -04:00
|
|
|
|
|
|
|
len = redisFormatSdsCommandArgv(&cmd,argc,argv,argvlen);
|
|
|
|
if (len == -1) {
|
|
|
|
__redisSetError(c,REDIS_ERR_OOM,"Out of memory");
|
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (__redisAppendCommand(c,cmd,len) != REDIS_OK) {
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(cmd);
|
2020-08-06 15:41:58 -04:00
|
|
|
return REDIS_ERR;
|
|
|
|
}
|
|
|
|
|
2020-08-15 15:24:31 -04:00
|
|
|
hi_sdsfree(cmd);
|
2020-08-06 15:41:58 -04:00
|
|
|
return REDIS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Helper function for the redisCommand* family of functions.
|
|
|
|
*
|
|
|
|
* Write a formatted command to the output buffer. If the given context is
|
|
|
|
* blocking, immediately read the reply into the "reply" pointer. When the
|
|
|
|
* context is non-blocking, the "reply" pointer will not be used and the
|
|
|
|
* command is simply appended to the write buffer.
|
|
|
|
*
|
|
|
|
* Returns the reply when a reply was successfully retrieved. Returns NULL
|
|
|
|
* otherwise. When NULL is returned in a blocking context, the error field
|
|
|
|
* in the context will be set.
|
|
|
|
*/
|
|
|
|
static void *__redisBlockForReply(redisContext *c) {
|
|
|
|
void *reply;
|
|
|
|
|
|
|
|
if (c->flags & REDIS_BLOCK) {
|
|
|
|
if (redisGetReply(c,&reply) != REDIS_OK)
|
|
|
|
return NULL;
|
|
|
|
return reply;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *redisvCommand(redisContext *c, const char *format, va_list ap) {
|
|
|
|
if (redisvAppendCommand(c,format,ap) != REDIS_OK)
|
|
|
|
return NULL;
|
|
|
|
return __redisBlockForReply(c);
|
|
|
|
}
|
|
|
|
|
|
|
|
void *redisCommand(redisContext *c, const char *format, ...) {
|
|
|
|
va_list ap;
|
|
|
|
va_start(ap,format);
|
|
|
|
void *reply = redisvCommand(c,format,ap);
|
|
|
|
va_end(ap);
|
|
|
|
return reply;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen) {
|
|
|
|
if (redisAppendCommandArgv(c,argc,argv,argvlen) != REDIS_OK)
|
|
|
|
return NULL;
|
|
|
|
return __redisBlockForReply(c);
|
|
|
|
}
|