bugfix: fixed duplicated seeds.

ngx.time() + ngx.worker.pid() maybe get duplicated seeds. get from /dev/urandom first.
This commit is contained in:
WenMing 2019-01-18 00:21:25 +08:00
parent d968ee9cfd
commit 011062967a

View file

@ -2,25 +2,40 @@ local _M = {}
local seeds = {} local seeds = {}
local original_randomseed = math.randomseed local original_randomseed = math.randomseed
math.randomseed = function(seed)
local pid = ngx.worker.pid()
if seeds[pid] then 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
end
return seed
end
math.randomseed = function()
local pid = ngx.worker.pid()
local seed = seeds[pid]
if seed then
ngx.log(ngx.WARN, ngx.log(ngx.WARN,
string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", seed, 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()
math.randomseed(ngx.time() + ngx.worker.pid())
end
function _M.init_worker() function _M.init_worker()
randomseed() math.randomseed()
end end
return _M return _M