[cffi-objects-cvs] r12 -

rklochkov at common-lisp.net rklochkov at common-lisp.net
Sun Oct 7 11:59:54 UTC 2012

Author: rklochkov
Date: Sun Oct  7 04:59:54 2012
New Revision: 12

Fixed double free of object due to use of with-slots instead of setf (pointer object)


Modified: freeable.lisp
--- freeable.lisp	Fri Aug 24 13:47:10 2012	(r11)
+++ freeable.lisp	Sun Oct  7 04:59:54 2012	(r12)
@@ -54,10 +54,10 @@
   (free-returned-if-needed type ptr))
 (define-foreign-type freeable-out (freeable)
-  ((out :accessor object-out :initarg :out :initform t
+  ((out :accessor object-out :initarg :out :initform nil
         :documentation "This is out param (for fill in foreign side)"))
   (:documentation "For returning data in out params.
-To use translate-to-foreign MUST return (values ptr place)"))
+If OUT is t, then translate-to-foreign MUST return (values ptr place)"))
 (defgeneric copy-from-foreign (type ptr place)
   (:documentation "Transfers data from pointer PTR to PLACE"))

Modified: object.lisp
--- object.lisp	Fri Aug 24 13:47:10 2012	(r11)
+++ object.lisp	Sun Oct  7 04:59:54 2012	(r12)
@@ -21,9 +21,9 @@
              :initarg :volatile :initform t
              :documentation "Will not be saved in hash")
    (free-after :type boolean :initarg :free-after :initform t
-               :documentation "Should be freed by finalizer")
+               :documentation "Should be freed by finalizer or FREE")
    (initialized :type list :initform nil 
-                :documentation "For SETF-INIT. To avoid double-init")
+                :documentation "For SETF-INIT. To avoid double init")
    (id :type symbol :accessor id :initarg :id :initform nil))
   (:documentation "Lisp wrapper for any object. VOLATILE slot set when object
 shouldn't be stored in *OBJECTS*. Stored pointer GC'ed, if VOLATILE."))
@@ -31,6 +31,7 @@
 (defmethod (setf pointer) :after (value (object object))
   (declare (type foreign-pointer value))
   (tg:cancel-finalization object)
+  ;(format t "Set pointer: ~a~%" object)
   (when (and (slot-value object 'free-after) (not (null-pointer-p value)))
     (let ((class (class-of object)))
       (format t "Set finalizer: ~a ~a ~a~%" object class value)
@@ -70,13 +71,16 @@
   (:documentation "Removes object pointer from lisp hashes."))
 (defmethod free ((object object))
+  ;(format t "Called free ~a~%" object)
   (with-slots (id pointer free-after) object
     (unless (null-pointer-p pointer)
       (remhash (pointer-address pointer) *objects*)
       (remhash id *objects-ids*)
       (when free-after
         (free-ptr (class-of object) pointer))
-      (setf pointer (null-pointer)
+      ;; if use (setf pointer (null-pointer)) then 
+      ;;   (setf pointer) method is not called
+      (setf (pointer object) (null-pointer) 
             id  nil))))
 (defun find-object (pointer &optional class)

Modified: struct.lisp
--- struct.lisp	Fri Aug 24 13:47:10 2012	(r11)
+++ struct.lisp	Sun Oct  7 04:59:54 2012	(r12)
@@ -99,7 +99,8 @@
         (mapc (lambda (slot) 
                 (let ((val (getf (slot-value object 'value) slot default)))
                   (unless (eq val default)
-                    (setf (foreign-slot-value res class slot) val))))
+                    (setf (foreign-slot-value res (list :struct class) slot) 
+                          val))))
               (foreign-slot-names class))
       (pointer object)))
@@ -119,7 +120,7 @@
             (unless (null-pointer-p struct)
               (dolist (slot (foreign-slot-names class))
                 (setf (getf (slot-value %object 'value) slot) 
-                      (foreign-slot-value struct class slot)))))
+                      (foreign-slot-value struct (list :struct class) slot)))))
           (setf (pointer %object) struct))
@@ -128,7 +129,7 @@
   (:actual-type :pointer))
 (defmethod free-sent-ptr ((type cffi-struct) ptr place)
-  (when (and (slot-boundp place 'value) (not (null-pointer-p ptr)))
+  (when (and (not (null-pointer-p ptr)) (slot-boundp place 'value))
     (free-struct (object-class type) ptr)))
 (defmethod free-returned-ptr ((type cffi-struct) ptr)

More information about the cffi-objects-cvs mailing list