Hello,

I’ve discovered a bug in org-babel-execute-src-block.  Calls to setf can
leak outside of the function and affect the library of babel.  The
attached org file illustrates the problem.  The attached patch fixes it.

* Bug

Step 1: place the foo code block below into a different file and ingest that
file into the library of babel.  (It must be in a separate file for the
bug to manifest.)

#+name: foo
#+BEGIN_SRC emacs-lisp
  2
#+END_SRC

Step 2: evaluate this code block.  The result should be =(:results . replace)=

#+BEGIN_SRC emacs-lisp :results append
  (assq :results (nth 2 (cdr (assq 'foo org-babel-library-of-babel))))
#+END_SRC

#+RESULTS:
: (:results . replace)
: (:results . silent)

Step 3: evaluate this source block:

#+BEGIN_SRC emacs-lisp :var bar=foo
  bar
#+END_SRC

#+RESULTS:
: 2

Step 4: re-evaluate the block from step 2.  The result should be =(:results . 
silent)=
>From 84531966dc5ca50fb56c61726694e988da3053eb Mon Sep 17 00:00:00 2001
From: Aaron Ecay <aarone...@gmail.com>
Date: Thu, 18 Apr 2013 04:02:47 -0400
Subject: [PATCH 4/4] Fix bug in org-babel-execute-src-block

* lisp/ob-core.el (org-babel-execute-src-block): copy the info

Otherwise, the setf calls in this function can reach into and change
other configuration variables, such as the library of babel.
---
 lisp/ob-core.el | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lisp/ob-core.el b/lisp/ob-core.el
index 12fcecc..71e9d61 100644
--- a/lisp/ob-core.el
+++ b/lisp/ob-core.el
@@ -547,7 +547,9 @@ Optionally supply a value for PARAMS which will be merged with
 the header arguments specified at the front of the source code
 block."
   (interactive)
-  (let* ((info (or info (org-babel-get-src-block-info)))
+  (let* ((info (if info
+		   (copy-tree info)
+		 (org-babel-get-src-block-info)))
 	 (merged-params (org-babel-merge-params (nth 2 info) params)))
     (when (org-babel-check-evaluate
 	   (let ((i info)) (setf (nth 2 i) merged-params) i))
-- 
1.8.2.1

-- 
Aaron Ecay

Reply via email to