diff options
Diffstat (limited to 'src/lj_state.c')
-rw-r--r-- | src/lj_state.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/lj_state.c b/src/lj_state.c index 7081a474..a4d072be 100644 --- a/src/lj_state.c +++ b/src/lj_state.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include "lj_trace.h" | 25 | #include "lj_trace.h" |
26 | #include "lj_dispatch.h" | 26 | #include "lj_dispatch.h" |
27 | #include "lj_vm.h" | 27 | #include "lj_vm.h" |
28 | #include "lj_prng.h" | ||
28 | #include "lj_lex.h" | 29 | #include "lj_lex.h" |
29 | #include "lj_alloc.h" | 30 | #include "lj_alloc.h" |
30 | #include "luajit.h" | 31 | #include "luajit.h" |
@@ -185,16 +186,33 @@ static void close_state(lua_State *L) | |||
185 | } | 186 | } |
186 | 187 | ||
187 | #if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC)) | 188 | #if LJ_64 && !LJ_GC64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC)) |
188 | lua_State *lj_state_newstate(lua_Alloc f, void *ud) | 189 | lua_State *lj_state_newstate(lua_Alloc allocf, void *allocd) |
189 | #else | 190 | #else |
190 | LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) | 191 | LUA_API lua_State *lua_newstate(lua_Alloc allocf, void *allocd) |
191 | #endif | 192 | #endif |
192 | { | 193 | { |
193 | GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State)); | 194 | PRNGState prng; |
194 | lua_State *L = &GG->L; | 195 | GG_State *GG; |
195 | global_State *g = &GG->g; | 196 | lua_State *L; |
197 | global_State *g; | ||
198 | /* We need the PRNG for the memory allocator, so initialize this first. */ | ||
199 | if (!lj_prng_seed_secure(&prng)) { | ||
200 | lj_assertX(0, "secure PRNG seeding failed"); | ||
201 | /* Can only return NULL here, so this errors with "not enough memory". */ | ||
202 | return NULL; | ||
203 | } | ||
204 | #ifndef LUAJIT_USE_SYSMALLOC | ||
205 | if (allocf == LJ_ALLOCF_INTERNAL) { | ||
206 | allocd = lj_alloc_create(&prng); | ||
207 | if (!allocd) return NULL; | ||
208 | allocf = lj_alloc_f; | ||
209 | } | ||
210 | #endif | ||
211 | GG = (GG_State *)allocf(allocd, NULL, 0, sizeof(GG_State)); | ||
196 | if (GG == NULL || !checkptrGC(GG)) return NULL; | 212 | if (GG == NULL || !checkptrGC(GG)) return NULL; |
197 | memset(GG, 0, sizeof(GG_State)); | 213 | memset(GG, 0, sizeof(GG_State)); |
214 | L = &GG->L; | ||
215 | g = &GG->g; | ||
198 | L->gct = ~LJ_TTHREAD; | 216 | L->gct = ~LJ_TTHREAD; |
199 | L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */ | 217 | L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */ |
200 | L->dummy_ffid = FF_C; | 218 | L->dummy_ffid = FF_C; |
@@ -202,8 +220,14 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) | |||
202 | g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED; | 220 | g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED; |
203 | g->strempty.marked = LJ_GC_WHITE0; | 221 | g->strempty.marked = LJ_GC_WHITE0; |
204 | g->strempty.gct = ~LJ_TSTR; | 222 | g->strempty.gct = ~LJ_TSTR; |
205 | g->allocf = f; | 223 | g->allocf = allocf; |
206 | g->allocd = ud; | 224 | g->allocd = allocd; |
225 | g->prng = prng; | ||
226 | #ifndef LUAJIT_USE_SYSMALLOC | ||
227 | if (allocf == lj_alloc_f) { | ||
228 | lj_alloc_setprng(allocd, &g->prng); | ||
229 | } | ||
230 | #endif | ||
207 | setgcref(g->mainthref, obj2gco(L)); | 231 | setgcref(g->mainthref, obj2gco(L)); |
208 | setgcref(g->uvhead.prev, obj2gco(&g->uvhead)); | 232 | setgcref(g->uvhead.prev, obj2gco(&g->uvhead)); |
209 | setgcref(g->uvhead.next, obj2gco(&g->uvhead)); | 233 | setgcref(g->uvhead.next, obj2gco(&g->uvhead)); |