From bf6501f2ee754bf696c27674b8750384ce661c1b Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Mon, 9 Jun 2014 17:43:40 +0800 Subject: [PATCH 1/5] check mongo reply data stream --- lualib-src/lua-bson.c | 13 +++++++++++-- lualib-src/lua-mongo.c | 7 +++++++ lualib/mongo.lua | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lualib-src/lua-bson.c b/lualib-src/lua-bson.c index ca73bae0..1799d7bf 100644 --- a/lualib-src/lua-bson.c +++ b/lualib-src/lua-bson.c @@ -68,6 +68,13 @@ struct bson_reader { int size; }; +static inline int32_t +get_length(const uint8_t * data) { + const uint8_t * b = (const uint8_t *)data; + int32_t len = b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24; + return len; +} + static inline void bson_destroy(struct bson *b) { if (b->ptr != b->buffer) { @@ -644,7 +651,7 @@ static int lmakeindex(lua_State *L) { int32_t *bson = luaL_checkudata(L,1,"bson"); const uint8_t * start = (const uint8_t *)bson; - struct bson_reader br = { start+4, *bson - 5 }; + struct bson_reader br = { start+4, get_length(start) - 5 }; lua_newtable(L); for (;;) { @@ -820,7 +827,9 @@ ldecode(lua_State *L) { if (data == NULL) { return 0; } - struct bson_reader br = { (const uint8_t *)data , *data }; + const uint8_t * b = (const uint8_t *)data; + int32_t len = get_length(b); + struct bson_reader br = { b , len }; unpack_dict(L, &br, false); diff --git a/lualib-src/lua-mongo.c b/lualib-src/lua-mongo.c index a0d312fd..3e4666dc 100644 --- a/lualib-src/lua-mongo.c +++ b/lualib-src/lua-mongo.c @@ -260,6 +260,13 @@ op_reply(lua_State *L) { lua_pushnil(L); lua_rawseti(L, 2, i); } + } else { + if (sz >= 4) { + sz -= get_length((document)doc); + } + } + if (sz != 0) { + return luaL_error(L, "Invalid result bson document"); } lua_pushboolean(L,1); lua_pushinteger(L, id); diff --git a/lualib/mongo.lua b/lualib/mongo.lua index 7b1c6f69..b04f7b46 100644 --- a/lualib/mongo.lua +++ b/lualib/mongo.lua @@ -98,7 +98,7 @@ function mongo.client( conf ) host = obj.host, port = obj.port, response = dispatch_reply, - auth = mongo_auth(conf), + auth = mongo_auth(obj), } setmetatable(obj, client_meta) obj.__sock:connect(true) -- try connect only once From 4bc2e800fdb14c07ab78687c5a088fa86547f1be Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Mon, 9 Jun 2014 18:08:23 +0800 Subject: [PATCH 2/5] bugfix: lua mongo result --- lualib/mongo.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lualib/mongo.lua b/lualib/mongo.lua index b04f7b46..f9eece35 100644 --- a/lualib/mongo.lua +++ b/lualib/mongo.lua @@ -167,7 +167,9 @@ function mongo_db:runCommand(cmd,cmd_v,...) bson_cmd = bson_encode_order(cmd,cmd_v,...) end local pack = driver.query(request_id, 0, self.__cmd, 0, 1, bson_cmd) - local doc = sock:request(pack, request_id).document + -- we must hold req (req.data), because req.document is a lightuserdata, it's a pointer to the string (req.data) + local req = sock:request(pack, request_id) + local doc = req.document return bson_decode(doc) end @@ -224,7 +226,9 @@ function mongo_collection:findOne(query, selector) local request_id = conn:genId() local sock = conn.__sock local pack = driver.query(request_id, 0, self.full_name, 0, 1, query and bson_encode(query) or empty_bson, selector and bson_encode(selector)) - local doc = sock:request(pack, request_id).document + -- we must hold req (req.data), because req.document is a lightuserdata, it's a pointer to the string (req.data) + local req = sock:request(pack, request_id) + local doc = req.document return bson_decode(doc) end From 0f64e909fa10784f1a8b6d6b9fea634af76a75d2 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 11 Jun 2014 15:11:18 +0800 Subject: [PATCH 3/5] big-endian encoding bson objectid --- HISTORY.md | 6 ++++++ lualib-src/lua-bson.c | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index e498068a..828a8a00 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,9 @@ +Dev version +----------- +* Bugfix: lua mongo driver . Hold reply string before decode bson data. +* More check in bson decoding. +* Use big-endian for encoding bson objectid. + v0.3.0 (2014-6-2) ----------- * Add cluster support diff --git a/lualib-src/lua-bson.c b/lualib-src/lua-bson.c index 1799d7bf..07fb77e2 100644 --- a/lualib-src/lua-bson.c +++ b/lualib-src/lua-bson.c @@ -1149,14 +1149,14 @@ lobjectid(lua_State *L) { } } else { time_t ti = time(NULL); - oid[2] = ti & 0xff; - oid[3] = (ti>>8) & 0xff; - oid[4] = (ti>>16) & 0xff; - oid[5] = (ti>>24) & 0xff; + oid[2] = (ti>>24) & 0xff; + oid[3] = (ti>>16) & 0xff; + oid[4] = (ti>>8) & 0xff; + oid[5] = ti & 0xff; memcpy(oid+6 , oid_header, 5); - oid[11] = oid_counter & 0xff; + oid[11] = (oid_counter>>16) & 0xff; oid[12] = (oid_counter>>8) & 0xff; - oid[13] = (oid_counter>>16) & 0xff; + oid[13] = oid_counter & 0xff; ++oid_counter; } lua_pushlstring( L, (const char *)oid, 14); From 87d276caf6e85da4255a174b3773bce7a5c98cb0 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Thu, 12 Jun 2014 17:28:54 +0800 Subject: [PATCH 4/5] typo fix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9c84351d..3c5fd446 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ $(CSERVICE_PATH) : define CSERVICE_TEMP $$(CSERVICE_PATH)/$(1).so : service-src/service_$(1).c | $$(CSERVICE_PATH) - $(CC) $$(CFLAGS) $$(SHARED) $$< -o $$@ -Iskynet-src + $$(CC) $$(CFLAGS) $$(SHARED) $$< -o $$@ -Iskynet-src endef $(foreach v, $(CSERVICE), $(eval $(call CSERVICE_TEMP,$(v)))) From 4fbd433199a5bbacd0d7865425e085aecdb94818 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Mon, 16 Jun 2014 10:10:18 +0800 Subject: [PATCH 5/5] release v0.3.1 --- HISTORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 828a8a00..9d39efaf 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,4 +1,4 @@ -Dev version +v0.3.1 (2014-6-16) ----------- * Bugfix: lua mongo driver . Hold reply string before decode bson data. * More check in bson decoding.