summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2020-02-13 16:58:07 +0100
committerantirez <antirez@gmail.com>2020-02-13 16:58:07 +0100
commit6922ccc0b98156e787b3d2f35daf0299e7844250 (patch)
tree5a66127e705f6950bdfbbf53f616a77826737d64
parent40194a2a6809520b5f01da4a7b41afe2a2441f64 (diff)
downloadredis-6922ccc0b98156e787b3d2f35daf0299e7844250.tar.gz
Tracking: fix sending messages bug + tracking off bug.
-rw-r--r--src/networking.c42
-rw-r--r--src/tracking.c6
2 files changed, 28 insertions, 20 deletions
diff --git a/src/networking.c b/src/networking.c
index 46534253e..1b4b19645 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -2250,37 +2250,39 @@ NULL
prefix = zrealloc(prefix,sizeof(robj*)*(numprefix+1));
prefix[numprefix++] = c->argv[j];
} else {
+ zfree(prefix);
addReply(c,shared.syntaxerr);
return;
}
}
- /* Make sure options are compatible among each other and with the
- * current state of the client. */
- if (!bcast && numprefix) {
- addReplyError(c,"PREFIX option requires BCAST mode to be enabled");
- zfree(prefix);
- return;
- }
-
- if (c->flags & CLIENT_TRACKING) {
- int oldbcast = !!c->flags & CLIENT_TRACKING_BCAST;
- if (oldbcast != bcast) {
- }
- addReplyError(c,
- "You can't switch BCAST mode on/off before disabling "
- "tracking for this client, and then re-enabling it with "
- "a different mode.");
- zfree(prefix);
- return;
- }
-
/* Options are ok: enable or disable the tracking for this client. */
if (!strcasecmp(c->argv[2]->ptr,"on")) {
+ /* Before enabling tracking, make sure options are compatible
+ * among each other and with the current state of the client. */
+ if (!bcast && numprefix) {
+ addReplyError(c,
+ "PREFIX option requires BCAST mode to be enabled");
+ zfree(prefix);
+ return;
+ }
+
+ if (c->flags & CLIENT_TRACKING) {
+ int oldbcast = !!c->flags & CLIENT_TRACKING_BCAST;
+ if (oldbcast != bcast) {
+ addReplyError(c,
+ "You can't switch BCAST mode on/off before disabling "
+ "tracking for this client, and then re-enabling it with "
+ "a different mode.");
+ zfree(prefix);
+ return;
+ }
+ }
enableTracking(c,redir,bcast,prefix,numprefix);
} else if (!strcasecmp(c->argv[2]->ptr,"off")) {
disableTracking(c);
} else {
+ zfree(prefix);
addReply(c,shared.syntaxerr);
return;
}
diff --git a/src/tracking.c b/src/tracking.c
index 672b886a3..ef5840863 100644
--- a/src/tracking.c
+++ b/src/tracking.c
@@ -211,6 +211,12 @@ void sendTrackingMessage(client *c, char *keyname, size_t keylen, int proto) {
/* We use a static object to speedup things, however we assume
* that addReplyPubsubMessage() will not take a reference. */
addReplyPubsubMessage(c,TrackingChannelName,NULL);
+ } else {
+ /* If are here, the client is not using RESP3, nor is
+ * redirecting to another client. We can't send anything to
+ * it since RESP2 does not support push messages in the same
+ * connection. */
+ return;
}
/* Send the "value" part, which is the array of keys. */