From 8ea7501d8b4f14b748ef2c8d00e617ca16c43b9a Mon Sep 17 00:00:00 2001 From: WenMing Date: Mon, 21 Jan 2019 17:26:52 +0800 Subject: [PATCH] added more error info and keep test cases. --- rootfs/etc/nginx/lua/lua_ingress.lua | 47 ++++++++++++------- .../etc/nginx/lua/test/lua_ingress_test.lua | 4 +- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/rootfs/etc/nginx/lua/lua_ingress.lua b/rootfs/etc/nginx/lua/lua_ingress.lua index 0dab84226..35077f9d8 100644 --- a/rootfs/etc/nginx/lua/lua_ingress.lua +++ b/rootfs/etc/nginx/lua/lua_ingress.lua @@ -5,37 +5,50 @@ local original_randomseed = math.randomseed local function get_seed_from_urandom() local seed - local frandom = io.open("/dev/urandom", "rb") - if frandom then - local str = frandom:read(4) - frandom:close() - seed = 0 - for i = 1, 4 do - seed = 256 * seed + str:byte(i) - end + local frandom, err = io.open("/dev/urandom", "rb") + if not frandom then + ngx.log(ngx.WARN, 'failed to open /dev/urandom: ', err) + return nil end + + local str = frandom:read(4) + frandom:close() + if not str then + ngx.log(ngx.WARN, 'failed to read data from /dev/urandom') + return nil + end + + seed = 0 + for i = 1, 4 do + seed = 256 * seed + str:byte(i) + end + return seed end -math.randomseed = function() +math.randomseed = function(seed) local pid = ngx.worker.pid() - local seed = seeds[pid] - if seed then + if seeds[pid] then ngx.log(ngx.WARN, - string.format("ignoring math.randomseed() since PRNG is already seeded for worker %d", pid)) + string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", seed, pid)) return end - seed = get_seed_from_urandom() - if not seed then - seed = ngx.now() * 1000 + pid - end original_randomseed(seed) seeds[pid] = seed end +local function randomseed() + local seed = get_seed_from_urandom() + if not seed then + ngx.log(ngx.WARN, 'failed to get seed from urandom') + seed = ngx.now() * 1000 + ngx.worker.pid() + end + math.randomseed(seed) +end + function _M.init_worker() - math.randomseed() + randomseed() end return _M diff --git a/rootfs/etc/nginx/lua/test/lua_ingress_test.lua b/rootfs/etc/nginx/lua/test/lua_ingress_test.lua index fc983a872..89d3150ef 100644 --- a/rootfs/etc/nginx/lua/test/lua_ingress_test.lua +++ b/rootfs/etc/nginx/lua/test/lua_ingress_test.lua @@ -2,8 +2,8 @@ describe("lua_ingress", function() it("patches math.randomseed to not be called more than once per worker", function() local s = spy.on(ngx, "log") - math.randomseed() + math.randomseed(100) assert.spy(s).was_called_with(ngx.WARN, - string.format("ignoring math.randomseed() since PRNG is already seeded for worker %d", ngx.worker.pid())) + string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", 100, ngx.worker.pid())) end) end)