Commit df560ee
committed
sqlite: narrow user-callback guard to per-statement reentry
The previous commit's db-wide IsInUserFunctionCallback guard was too
broad: it rejected legitimate cross-statement use from inside a user
function (the common "lookup" pattern), e.g.
const lookup = db.prepare('SELECT v FROM lookup WHERE id = ?');
db.function('lookup_v', (id) => lookup.get(id).v);
SQLite only forbids reentry into the *currently running* statement
(recursive sqlite3_step, sqlite3_reset, or sqlite3_finalize), not
operations on other statements on the same connection.
Track per-statement stepping_ on StatementSync, set via a MarkStepping
RAII guard wrapped around each sqlite3_step caller. JS methods that
would step, reset, or finalize a statement (StatementSync run/get/all/
iterate, iterator next/return, SQLTagStore run/get/all/iterate) check
that flag on the specific statement instead of the db-wide depth.
Keep the db-wide IsInUserFunctionCallback check only where the
operation is broadly invasive: db.close, db.deserialize, and SQL tag
store .clear, all of which finalize tracked statements (potentially
the running one).
Drop the authorizer scope: SQLite's authorizer rules are stricter
than user-defined functions (prepare/exec are forbidden too) and
warrant a separate change rather than partial coverage here.
Add tests for the legitimate cross-statement and cross-tag-store
patterns (now passing), and for db[Symbol.dispose]() being a
documented no-op when invoked from a callback.
Signed-off-by: Matthew McEachen <matthew@photostructure.com>1 parent 20d7ffa commit df560ee
3 files changed
Lines changed: 116 additions & 68 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2520 | 2520 | | |
2521 | 2521 | | |
2522 | 2522 | | |
2523 | | - | |
2524 | | - | |
2525 | | - | |
2526 | | - | |
2527 | | - | |
2528 | | - | |
| 2523 | + | |
| 2524 | + | |
2529 | 2525 | | |
2530 | 2526 | | |
2531 | 2527 | | |
| |||
3042 | 3038 | | |
3043 | 3039 | | |
3044 | 3040 | | |
3045 | | - | |
3046 | | - | |
3047 | | - | |
| 3041 | + | |
| 3042 | + | |
3048 | 3043 | | |
3049 | 3044 | | |
3050 | 3045 | | |
| |||
3054 | 3049 | | |
3055 | 3050 | | |
3056 | 3051 | | |
| 3052 | + | |
3057 | 3053 | | |
3058 | 3054 | | |
3059 | 3055 | | |
| |||
3073 | 3069 | | |
3074 | 3070 | | |
3075 | 3071 | | |
3076 | | - | |
3077 | | - | |
3078 | | - | |
| 3072 | + | |
| 3073 | + | |
3079 | 3074 | | |
3080 | 3075 | | |
3081 | 3076 | | |
| |||
3101 | 3096 | | |
3102 | 3097 | | |
3103 | 3098 | | |
3104 | | - | |
3105 | | - | |
3106 | | - | |
| 3099 | + | |
| 3100 | + | |
3107 | 3101 | | |
3108 | 3102 | | |
3109 | 3103 | | |
| |||
3112 | 3106 | | |
3113 | 3107 | | |
3114 | 3108 | | |
| 3109 | + | |
3115 | 3110 | | |
3116 | 3111 | | |
3117 | 3112 | | |
| |||
3130 | 3125 | | |
3131 | 3126 | | |
3132 | 3127 | | |
3133 | | - | |
3134 | | - | |
3135 | | - | |
| 3128 | + | |
| 3129 | + | |
3136 | 3130 | | |
3137 | 3131 | | |
3138 | 3132 | | |
| |||
3141 | 3135 | | |
3142 | 3136 | | |
3143 | 3137 | | |
| 3138 | + | |
3144 | 3139 | | |
3145 | 3140 | | |
3146 | 3141 | | |
| |||
3386 | 3381 | | |
3387 | 3382 | | |
3388 | 3383 | | |
3389 | | - | |
3390 | | - | |
3391 | | - | |
3392 | | - | |
3393 | | - | |
3394 | 3384 | | |
3395 | 3385 | | |
3396 | 3386 | | |
3397 | 3387 | | |
3398 | 3388 | | |
3399 | 3389 | | |
3400 | 3390 | | |
| 3391 | + | |
| 3392 | + | |
| 3393 | + | |
3401 | 3394 | | |
3402 | 3395 | | |
3403 | 3396 | | |
| |||
3410 | 3403 | | |
3411 | 3404 | | |
3412 | 3405 | | |
| 3406 | + | |
3413 | 3407 | | |
3414 | 3408 | | |
3415 | 3409 | | |
| |||
3424 | 3418 | | |
3425 | 3419 | | |
3426 | 3420 | | |
3427 | | - | |
3428 | | - | |
3429 | | - | |
3430 | | - | |
3431 | | - | |
3432 | 3421 | | |
3433 | 3422 | | |
3434 | 3423 | | |
3435 | 3424 | | |
3436 | 3425 | | |
3437 | 3426 | | |
3438 | 3427 | | |
| 3428 | + | |
| 3429 | + | |
| 3430 | + | |
3439 | 3431 | | |
3440 | 3432 | | |
3441 | 3433 | | |
| |||
3464 | 3456 | | |
3465 | 3457 | | |
3466 | 3458 | | |
3467 | | - | |
3468 | | - | |
3469 | | - | |
3470 | | - | |
3471 | | - | |
3472 | 3459 | | |
3473 | 3460 | | |
3474 | 3461 | | |
3475 | 3462 | | |
3476 | 3463 | | |
3477 | 3464 | | |
3478 | 3465 | | |
| 3466 | + | |
| 3467 | + | |
| 3468 | + | |
3479 | 3469 | | |
3480 | 3470 | | |
3481 | 3471 | | |
| |||
3491 | 3481 | | |
3492 | 3482 | | |
3493 | 3483 | | |
| 3484 | + | |
3494 | 3485 | | |
3495 | 3486 | | |
3496 | 3487 | | |
| |||
3508 | 3499 | | |
3509 | 3500 | | |
3510 | 3501 | | |
3511 | | - | |
3512 | | - | |
3513 | | - | |
3514 | | - | |
3515 | | - | |
3516 | 3502 | | |
3517 | 3503 | | |
3518 | 3504 | | |
3519 | 3505 | | |
3520 | 3506 | | |
3521 | 3507 | | |
3522 | 3508 | | |
| 3509 | + | |
| 3510 | + | |
| 3511 | + | |
3523 | 3512 | | |
3524 | 3513 | | |
3525 | 3514 | | |
| |||
3535 | 3524 | | |
3536 | 3525 | | |
3537 | 3526 | | |
| 3527 | + | |
3538 | 3528 | | |
3539 | 3529 | | |
3540 | 3530 | | |
| |||
3747 | 3737 | | |
3748 | 3738 | | |
3749 | 3739 | | |
3750 | | - | |
3751 | | - | |
3752 | | - | |
| 3740 | + | |
| 3741 | + | |
3753 | 3742 | | |
3754 | 3743 | | |
3755 | 3744 | | |
| |||
3772 | 3761 | | |
3773 | 3762 | | |
3774 | 3763 | | |
| 3764 | + | |
3775 | 3765 | | |
3776 | 3766 | | |
3777 | 3767 | | |
| |||
3828 | 3818 | | |
3829 | 3819 | | |
3830 | 3820 | | |
3831 | | - | |
3832 | | - | |
3833 | | - | |
| 3821 | + | |
| 3822 | + | |
3834 | 3823 | | |
3835 | 3824 | | |
3836 | 3825 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
229 | | - | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
230 | 234 | | |
231 | 235 | | |
232 | 236 | | |
| |||
298 | 302 | | |
299 | 303 | | |
300 | 304 | | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
301 | 317 | | |
302 | 318 | | |
303 | 319 | | |
| |||
310 | 326 | | |
311 | 327 | | |
312 | 328 | | |
| 329 | + | |
313 | 330 | | |
314 | 331 | | |
315 | 332 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| |||
417 | 417 | | |
418 | 418 | | |
419 | 419 | | |
420 | | - | |
| 420 | + | |
421 | 421 | | |
422 | | - | |
| 422 | + | |
423 | 423 | | |
424 | 424 | | |
425 | 425 | | |
| |||
551 | 551 | | |
552 | 552 | | |
553 | 553 | | |
554 | | - | |
| 554 | + | |
555 | 555 | | |
556 | 556 | | |
557 | 557 | | |
| |||
561 | 561 | | |
562 | 562 | | |
563 | 563 | | |
564 | | - | |
| 564 | + | |
565 | 565 | | |
566 | 566 | | |
567 | 567 | | |
| |||
626 | 626 | | |
627 | 627 | | |
628 | 628 | | |
629 | | - | |
630 | | - | |
631 | | - | |
632 | | - | |
633 | | - | |
634 | | - | |
635 | | - | |
636 | | - | |
637 | | - | |
638 | | - | |
639 | | - | |
640 | | - | |
641 | | - | |
642 | 629 | | |
643 | 630 | | |
644 | 631 | | |
| |||
650 | 637 | | |
651 | 638 | | |
652 | 639 | | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
653 | 695 | | |
654 | 696 | | |
0 commit comments