diff options
| author | Paul Eggert | 2016-04-01 01:24:55 -0700 |
|---|---|---|
| committer | Paul Eggert | 2016-04-01 01:25:14 -0700 |
| commit | 423d6a6156cea32757f13277e31a5867aec12dca (patch) | |
| tree | 104abc47b8cd5da1caac4fc026fa99f8bfcd347b /src | |
| parent | 750e1e19429cd781e2e60b462d19ef827d4da943 (diff) | |
| download | emacs-423d6a6156cea32757f13277e31a5867aec12dca.tar.gz emacs-423d6a6156cea32757f13277e31a5867aec12dca.zip | |
Fix check for subscript errors in module calls
* src/emacs-module.c (check_vec_index): New function.
(module_vec_set, module_vec_get): Use it instead of a
not-strict-enough check.
Diffstat (limited to 'src')
| -rw-r--r-- | src/emacs-module.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/emacs-module.c b/src/emacs-module.c index f9ede84ed17..b57636e54e5 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c | |||
| @@ -588,13 +588,21 @@ module_set_user_finalizer (emacs_env *env, emacs_value uptr, | |||
| 588 | } | 588 | } |
| 589 | 589 | ||
| 590 | static void | 590 | static void |
| 591 | check_vec_index (Lisp_Object lvec, ptrdiff_t i) | ||
| 592 | { | ||
| 593 | CHECK_VECTOR (lvec); | ||
| 594 | if (! (0 <= i && i < ASIZE (lvec))) | ||
| 595 | args_out_of_range_3 (make_fixnum_or_float (i), | ||
| 596 | make_number (0), make_number (ASIZE (lvec) - 1)); | ||
| 597 | } | ||
| 598 | |||
| 599 | static void | ||
| 591 | module_vec_set (emacs_env *env, emacs_value vec, ptrdiff_t i, emacs_value val) | 600 | module_vec_set (emacs_env *env, emacs_value vec, ptrdiff_t i, emacs_value val) |
| 592 | { | 601 | { |
| 593 | /* FIXME: This function should return bool because it can fail. */ | 602 | /* FIXME: This function should return bool because it can fail. */ |
| 594 | MODULE_FUNCTION_BEGIN (); | 603 | MODULE_FUNCTION_BEGIN (); |
| 595 | Lisp_Object lvec = value_to_lisp (vec); | 604 | Lisp_Object lvec = value_to_lisp (vec); |
| 596 | CHECK_VECTOR (lvec); | 605 | check_vec_index (lvec, i); |
| 597 | CHECK_RANGED_INTEGER (make_number (i), 0, ASIZE (lvec) - 1); | ||
| 598 | ASET (lvec, i, value_to_lisp (val)); | 606 | ASET (lvec, i, value_to_lisp (val)); |
| 599 | } | 607 | } |
| 600 | 608 | ||
| @@ -603,8 +611,7 @@ module_vec_get (emacs_env *env, emacs_value vec, ptrdiff_t i) | |||
| 603 | { | 611 | { |
| 604 | MODULE_FUNCTION_BEGIN (module_nil); | 612 | MODULE_FUNCTION_BEGIN (module_nil); |
| 605 | Lisp_Object lvec = value_to_lisp (vec); | 613 | Lisp_Object lvec = value_to_lisp (vec); |
| 606 | CHECK_VECTOR (lvec); | 614 | check_vec_index (lvec, i); |
| 607 | CHECK_RANGED_INTEGER (make_number (i), 0, ASIZE (lvec) - 1); | ||
| 608 | return lisp_to_value (AREF (lvec, i)); | 615 | return lisp_to_value (AREF (lvec, i)); |
| 609 | } | 616 | } |
| 610 | 617 | ||