added more error info and keep test cases.
This commit is contained in:
parent
c782f22c5d
commit
8ea7501d8b
2 changed files with 32 additions and 19 deletions
|
@ -5,37 +5,50 @@ local original_randomseed = math.randomseed
|
||||||
|
|
||||||
local function get_seed_from_urandom()
|
local function get_seed_from_urandom()
|
||||||
local seed
|
local seed
|
||||||
local frandom = io.open("/dev/urandom", "rb")
|
local frandom, err = io.open("/dev/urandom", "rb")
|
||||||
if frandom then
|
if not frandom then
|
||||||
local str = frandom:read(4)
|
ngx.log(ngx.WARN, 'failed to open /dev/urandom: ', err)
|
||||||
frandom:close()
|
return nil
|
||||||
seed = 0
|
|
||||||
for i = 1, 4 do
|
|
||||||
seed = 256 * seed + str:byte(i)
|
|
||||||
end
|
|
||||||
end
|
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
|
return seed
|
||||||
end
|
end
|
||||||
|
|
||||||
math.randomseed = function()
|
math.randomseed = function(seed)
|
||||||
local pid = ngx.worker.pid()
|
local pid = ngx.worker.pid()
|
||||||
local seed = seeds[pid]
|
if seeds[pid] then
|
||||||
if seed then
|
|
||||||
ngx.log(ngx.WARN,
|
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
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
seed = get_seed_from_urandom()
|
|
||||||
if not seed then
|
|
||||||
seed = ngx.now() * 1000 + pid
|
|
||||||
end
|
|
||||||
original_randomseed(seed)
|
original_randomseed(seed)
|
||||||
seeds[pid] = seed
|
seeds[pid] = seed
|
||||||
end
|
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()
|
function _M.init_worker()
|
||||||
math.randomseed()
|
randomseed()
|
||||||
end
|
end
|
||||||
|
|
||||||
return _M
|
return _M
|
||||||
|
|
|
@ -2,8 +2,8 @@ describe("lua_ingress", function()
|
||||||
it("patches math.randomseed to not be called more than once per worker", function()
|
it("patches math.randomseed to not be called more than once per worker", function()
|
||||||
local s = spy.on(ngx, "log")
|
local s = spy.on(ngx, "log")
|
||||||
|
|
||||||
math.randomseed()
|
math.randomseed(100)
|
||||||
assert.spy(s).was_called_with(ngx.WARN,
|
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)
|
||||||
end)
|
end)
|
||||||
|
|
Loading…
Reference in a new issue