Commit ad468be
committed
fix(runtime): sandbox host calls via deferred promises, deadline-bounded pump
The QuickJS sandbox exposed `ctx.api.object(x).find/update/...` via
`newAsyncifiedFunction`. Asyncify unwinds the WASM stack for each host call and
forbids a second call while the first is unwound ("the stack cannot be unwound
twice"). A script that awaits two host calls in sequence — e.g. the real
`lead_apply_convert` action doing `findOne()` then `update()` — hit exactly
that: the second call was driven from a resumed continuation inside
`executePendingJobs` (a non-async frame), which corrupted the wasm heap
(`memory access out of bounds` / `Assertion failed: p->ref_count == 0`) and,
when it limped along, exhausted the fixed 1000-iteration pump budget, surfacing
in production as:
action 'lead_apply_convert' did not resolve after 1000 pump iterations
Verified empirically that asyncify cannot drive 2+ host calls per invocation
under any driver (manual pump or module top-level await) — both crash.
Fix:
- Expose host API methods as deferred QuickJS promises (`vm.newPromise()`)
instead of asyncified functions. Sequential `await`s become ordinary promises
with no stack unwinding, so any number of host calls compose safely. (Host
method calls now require `await`, which all real actions already do; the
`.object(name)` proxy getter stays synchronous.)
- Bound the pump loop by the configured `timeoutMs` deadline instead of a magic
1000-iteration cap, so a slow-but-progressing script (many sequential writes,
or one write that synchronously drives a downstream record-change automation)
finishes within its timeout, while a stuck/never-settling host call is cut off
with a clear timeout error (the interrupt handler can't fire while parked on a
host promise, so this deadline check is the backstop).
Regression tests (quickjs-runner.test.ts): a host call settling after >1000
event-loop turns, >1000 sequential host calls, and a never-settling host call
that must time out. Before the fix the sequential case crashed the wasm and the
never-settling case hung; both now pass.1 parent bb66231 commit ad468be
3 files changed
Lines changed: 170 additions & 22 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
212 | 212 | | |
213 | 213 | | |
214 | 214 | | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
159 | | - | |
| 159 | + | |
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
| |||
179 | 179 | | |
180 | 180 | | |
181 | 181 | | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
182 | 193 | | |
183 | | - | |
184 | | - | |
| 194 | + | |
| 195 | + | |
185 | 196 | | |
186 | 197 | | |
187 | 198 | | |
| |||
210 | 221 | | |
211 | 222 | | |
212 | 223 | | |
213 | | - | |
| 224 | + | |
214 | 225 | | |
215 | 226 | | |
216 | 227 | | |
217 | 228 | | |
218 | | - | |
219 | | - | |
220 | | - | |
221 | 229 | | |
222 | 230 | | |
223 | 231 | | |
| |||
230 | 238 | | |
231 | 239 | | |
232 | 240 | | |
233 | | - | |
234 | | - | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
235 | 244 | | |
236 | 245 | | |
237 | 246 | | |
| |||
320 | 329 | | |
321 | 330 | | |
322 | 331 | | |
323 | | - | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
324 | 343 | | |
325 | | - | |
326 | | - | |
327 | | - | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
328 | 351 | | |
329 | 352 | | |
330 | 353 | | |
| |||
336 | 359 | | |
337 | 360 | | |
338 | 361 | | |
339 | | - | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
340 | 365 | | |
341 | 366 | | |
342 | 367 | | |
| |||
346 | 371 | | |
347 | 372 | | |
348 | 373 | | |
| 374 | + | |
| 375 | + | |
349 | 376 | | |
350 | | - | |
351 | | - | |
352 | | - | |
353 | | - | |
354 | | - | |
355 | | - | |
356 | | - | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
357 | 405 | | |
358 | 406 | | |
359 | 407 | | |
| |||
0 commit comments