emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-25 d443710: Do more checks on bytecode objects (Bug#


From: Andreas Schwab
Subject: [Emacs-diffs] emacs-25 d443710: Do more checks on bytecode objects (Bug#21929)
Date: Mon, 16 Nov 2015 23:19:23 +0000

branch: emacs-25
commit d443710169d98e73869247fd80e27914f25b784e
Author: Andreas Schwab <address@hidden>
Commit: Andreas Schwab <address@hidden>

    Do more checks on bytecode objects (Bug#21929)
    
    * src/eval.c (funcall_lambda): Check size of compiled function
    object.
    (Ffetch_bytecode): Likewise.
---
 src/eval.c |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/eval.c b/src/eval.c
index ac98ca1..d460048 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2792,6 +2792,9 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs,
     }
   else if (COMPILEDP (fun))
     {
+      ptrdiff_t size = ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK;
+      if (size <= COMPILED_STACK_DEPTH)
+       xsignal1 (Qinvalid_function, fun);
       syms_left = AREF (fun, COMPILED_ARGLIST);
       if (INTEGERP (syms_left))
        /* A byte-code object with a non-nil `push args' slot means we
@@ -2889,19 +2892,25 @@ DEFUN ("fetch-bytecode", Ffetch_bytecode, 
Sfetch_bytecode,
 {
   Lisp_Object tem;
 
-  if (COMPILEDP (object) && CONSP (AREF (object, COMPILED_BYTECODE)))
+  if (COMPILEDP (object))
     {
-      tem = read_doc_string (AREF (object, COMPILED_BYTECODE));
-      if (!CONSP (tem))
+      ptrdiff_t size = ASIZE (object) & PSEUDOVECTOR_SIZE_MASK;
+      if (size <= COMPILED_STACK_DEPTH)
+       xsignal1 (Qinvalid_function, object);
+      if (CONSP (AREF (object, COMPILED_BYTECODE)))
        {
-         tem = AREF (object, COMPILED_BYTECODE);
-         if (CONSP (tem) && STRINGP (XCAR (tem)))
-           error ("Invalid byte code in %s", SDATA (XCAR (tem)));
-         else
-           error ("Invalid byte code");
+         tem = read_doc_string (AREF (object, COMPILED_BYTECODE));
+         if (!CONSP (tem))
+           {
+             tem = AREF (object, COMPILED_BYTECODE);
+             if (CONSP (tem) && STRINGP (XCAR (tem)))
+               error ("Invalid byte code in %s", SDATA (XCAR (tem)));
+             else
+               error ("Invalid byte code");
+           }
+         ASET (object, COMPILED_BYTECODE, XCAR (tem));
+         ASET (object, COMPILED_CONSTANTS, XCDR (tem));
        }
-      ASET (object, COMPILED_BYTECODE, XCAR (tem));
-      ASET (object, COMPILED_CONSTANTS, XCDR (tem));
     }
   return object;
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]