diff options
author | Salvatore Sanfilippo <antirez@gmail.com> | 2020-06-12 12:31:15 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-12 12:31:15 +0200 |
commit | a66298e6f1360cbfd52bded0b14af0f1855a5f8a (patch) | |
tree | 33ca0e44425b959d06d3335f99ae318339b8ba8a /src/t_string.c | |
parent | ca58198a76e70e148a06b4c695502d51c4ffe5cc (diff) | |
parent | 7008a0ba66fe13af0d584071eaa5fe3f34c56512 (diff) | |
download | redis-a66298e6f1360cbfd52bded0b14af0f1855a5f8a.tar.gz |
Merge pull request #7375 from hwware/lcs_crash_fix
Fix Server Crash in LCS Command
Diffstat (limited to 'src/t_string.c')
-rw-r--r-- | src/t_string.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/t_string.c b/src/t_string.c index 5306069bf..8e367ec80 100644 --- a/src/t_string.c +++ b/src/t_string.c @@ -516,13 +516,13 @@ void stralgoLCS(client *c) { withmatchlen = 1; } else if (!strcasecmp(opt,"MINMATCHLEN") && moreargs) { if (getLongLongFromObjectOrReply(c,c->argv[j+1],&minmatchlen,NULL) - != C_OK) return; + != C_OK) goto clean_up_obj; if (minmatchlen < 0) minmatchlen = 0; j++; } else if (!strcasecmp(opt,"STRINGS") && moreargs > 1) { if (a != NULL) { addReplyError(c,"Either use STRINGS or KEYS"); - return; + goto clean_up_obj; } a = c->argv[j+1]->ptr; b = c->argv[j+2]->ptr; @@ -530,10 +530,14 @@ void stralgoLCS(client *c) { } else if (!strcasecmp(opt,"KEYS") && moreargs > 1) { if (a != NULL) { addReplyError(c,"Either use STRINGS or KEYS"); - return; + goto clean_up_obj; } obja = lookupKeyRead(c->db,c->argv[j+1]); objb = lookupKeyRead(c->db,c->argv[j+2]); + if ( !(obja->type == OBJ_STRING) || !(objb->type == OBJ_STRING) ) { + addReplyError(c,"Object associate with KEYS option should only be string type"); + goto clean_up_obj; + } obja = obja ? getDecodedObject(obja) : createStringObject("",0); objb = objb ? getDecodedObject(objb) : createStringObject("",0); a = obja->ptr; @@ -541,7 +545,7 @@ void stralgoLCS(client *c) { j += 2; } else { addReply(c,shared.syntaxerr); - return; + goto clean_up_obj; } } @@ -549,12 +553,12 @@ void stralgoLCS(client *c) { if (a == NULL) { addReplyError(c,"Please specify two strings: " "STRINGS or KEYS options are mandatory"); - return; + goto clean_up_obj; } else if (getlen && getidx) { addReplyError(c, "If you want both the length and indexes, please " "just use IDX."); - return; + goto clean_up_obj; } /* Compute the LCS using the vanilla dynamic programming technique of @@ -689,10 +693,12 @@ void stralgoLCS(client *c) { } /* Cleanup. */ - if (obja) decrRefCount(obja); - if (objb) decrRefCount(objb); sdsfree(result); zfree(lcs); + +clean_up_obj: + if (obja) decrRefCount(obja); + if (objb) decrRefCount(objb); return; } |