]> git.saurik.com Git - redis.git/commitdiff
EVALSHA is now case insensitive.
authorantirez <antirez@gmail.com>
Thu, 22 Nov 2012 14:50:00 +0000 (15:50 +0100)
committerantirez <antirez@gmail.com>
Thu, 22 Nov 2012 14:51:01 +0000 (15:51 +0100)
EVALSHA used to crash if the SHA1 was not lowercase (Issue #783).
Fixed using a case insensitive dictionary type for the sha -> script
map used for replication of scripts.

src/redis.c
src/redis.h
src/scripting.c
tests/unit/scripting.tcl

index c4c1adb0b5902bf3b7d22901389c2f8df97ecab4..eb4418e772735b7b931ad0f0b6910fe38b2ac908 100644 (file)
@@ -391,7 +391,8 @@ int dictSdsKeyCompare(void *privdata, const void *key1,
     return memcmp(key1, key2, l1) == 0;
 }
 
-/* A case insensitive version used for the command lookup table. */
+/* A case insensitive version used for the command lookup table and other
+ * places where case insensitive non binary-safe comparison is needed. */
 int dictSdsKeyCaseCompare(void *privdata, const void *key1,
         const void *key2)
 {
@@ -506,6 +507,16 @@ dictType dbDictType = {
     dictRedisObjectDestructor   /* val destructor */
 };
 
+/* server.lua_scripts sha (as sds string) -> scripts (as robj) cache. */
+dictType shaScriptObjectDictType = {
+    dictSdsCaseHash,            /* hash function */
+    NULL,                       /* key dup */
+    NULL,                       /* val dup */
+    dictSdsKeyCaseCompare,      /* key compare */
+    dictSdsDestructor,          /* key destructor */
+    dictRedisObjectDestructor   /* val destructor */
+};
+
 /* Db->expires */
 dictType keyptrDictType = {
     dictSdsHash,               /* hash function */
index b75e4bd82bb517e16d36a148c06a7848ea12bd10..8fd6f447d386b0c74237b253bd7cc36aeadaae90 100644 (file)
@@ -755,6 +755,7 @@ extern struct sharedObjectsStruct shared;
 extern dictType setDictType;
 extern dictType zsetDictType;
 extern dictType dbDictType;
+extern dictType shaScriptObjectDictType;
 extern double R_Zero, R_PosInf, R_NegInf, R_Nan;
 extern dictType hashDictType;
 
index 23404338b40989e92d045477de0eb5b241f711ad..d614f42a13f87d14d383604ff59c1224b8d70fa9 100644 (file)
@@ -532,7 +532,7 @@ void scriptingInit(void) {
     /* Initialize a dictionary we use to map SHAs to scripts.
      * This is useful for replication, as we need to replicate EVALSHA
      * as EVAL, so we need to remember the associated script. */
-    server.lua_scripts = dictCreate(&dbDictType,NULL);
+    server.lua_scripts = dictCreate(&shaScriptObjectDictType,NULL);
 
     /* Register the redis commands table and fields */
     lua_newtable(lua);
index f96d0fc6489ef878f46780a316b22fdd5d3dd503..f1df11f3c575af536d31168fb56989e7babbabe5 100644 (file)
@@ -47,6 +47,10 @@ start_server {tags {"scripting"}} {
         r evalsha 9bd632c7d33e571e9f24556ebed26c3479a87129 0
     } {myval}
 
+    test {EVALSHA - Can we call a SHA1 in uppercase?} {
+        r evalsha 9BD632C7D33E571E9F24556EBED26C3479A87129 0
+    } {myval}
+
     test {EVALSHA - Do we get an error on invalid SHA1?} {
         catch {r evalsha NotValidShaSUM 0} e
         set _ $e