aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 92406a78c32..7c73696a99a 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -258,6 +258,10 @@ Lisp_Object Qbytecode;
258 if (consing_since_gc > gc_cons_threshold) \ 258 if (consing_since_gc > gc_cons_threshold) \
259 Fgarbage_collect (); 259 Fgarbage_collect ();
260 260
261/* Check for jumping out of range. */
262#define CHECK_RANGE(ARG) \
263 if (ARG >= bytestr_length) abort ()
264
261DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0, 265DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0,
262 "Function used internally in byte-compiled code.\n\ 266 "Function used internally in byte-compiled code.\n\
263The first argument, BYTESTR, is a string of byte code;\n\ 267The first argument, BYTESTR, is a string of byte code;\n\
@@ -288,6 +292,7 @@ If the third argument is incorrect, Emacs may crash.")
288 /* Cached address of beginning of string, 292 /* Cached address of beginning of string,
289 valid if BYTESTR equals STRING_SAVED. */ 293 valid if BYTESTR equals STRING_SAVED. */
290 register unsigned char *strbeg; 294 register unsigned char *strbeg;
295 int bytestr_length = XSTRING (bytestr)->size;
291 296
292 CHECK_STRING (bytestr, 0); 297 CHECK_STRING (bytestr, 0);
293 if (!VECTORP (vector)) 298 if (!VECTORP (vector))
@@ -441,6 +446,7 @@ If the third argument is incorrect, Emacs may crash.")
441 MAYBE_GC (); 446 MAYBE_GC ();
442 QUIT; 447 QUIT;
443 op = FETCH2; /* pc = FETCH2 loses since FETCH2 contains pc++ */ 448 op = FETCH2; /* pc = FETCH2 loses since FETCH2 contains pc++ */
449 CHECK_RANGE (op);
444 pc = XSTRING (string_saved)->data + op; 450 pc = XSTRING (string_saved)->data + op;
445 break; 451 break;
446 452
@@ -450,6 +456,7 @@ If the third argument is incorrect, Emacs may crash.")
450 if (NILP (POP)) 456 if (NILP (POP))
451 { 457 {
452 QUIT; 458 QUIT;
459 CHECK_RANGE (op);
453 pc = XSTRING (string_saved)->data + op; 460 pc = XSTRING (string_saved)->data + op;
454 } 461 }
455 break; 462 break;
@@ -460,6 +467,7 @@ If the third argument is incorrect, Emacs may crash.")
460 if (!NILP (POP)) 467 if (!NILP (POP))
461 { 468 {
462 QUIT; 469 QUIT;
470 CHECK_RANGE (op);
463 pc = XSTRING (string_saved)->data + op; 471 pc = XSTRING (string_saved)->data + op;
464 } 472 }
465 break; 473 break;
@@ -470,6 +478,7 @@ If the third argument is incorrect, Emacs may crash.")
470 if (NILP (TOP)) 478 if (NILP (TOP))
471 { 479 {
472 QUIT; 480 QUIT;
481 CHECK_RANGE (op);
473 pc = XSTRING (string_saved)->data + op; 482 pc = XSTRING (string_saved)->data + op;
474 } 483 }
475 else DISCARD (1); 484 else DISCARD (1);
@@ -481,6 +490,7 @@ If the third argument is incorrect, Emacs may crash.")
481 if (!NILP (TOP)) 490 if (!NILP (TOP))
482 { 491 {
483 QUIT; 492 QUIT;
493 CHECK_RANGE (op);
484 pc = XSTRING (string_saved)->data + op; 494 pc = XSTRING (string_saved)->data + op;
485 } 495 }
486 else DISCARD (1); 496 else DISCARD (1);