From be71e3c8cfed085e32b2f56425bc35e0a80f7647 Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Tue, 4 Nov 2008 03:22:23 +0000 Subject: [PATCH] Fixed memory corruption with statics strings in GValues Organization: Straylight/Edgeware From: espen --- glib/defpackage.lisp | 5 +++-- glib/gobject.lisp | 9 ++++++--- glib/gparam.lisp | 17 +++++++++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/glib/defpackage.lisp b/glib/defpackage.lisp index 33ef768..cf6a999 100644 --- a/glib/defpackage.lisp +++ b/glib/defpackage.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: defpackage.lisp,v 1.27 2008-10-09 18:20:52 espen Exp $ +;; $Id: defpackage.lisp,v 1.28 2008-11-04 03:22:23 espen Exp $ (defpackage "GLIB" @@ -51,7 +51,8 @@ (defpackage "GLIB" ;; Symbols from gparam.lisp (:export "GVALUE" "GVALUE-INIT" "GVALUE-NEW" "GVALUE-FREE" "GVALUE-TYPE" "GVALUE-GET" "GVALUE-SET" "GVALUE-UNSET" "VALUE-P" "WITH-GVALUE" - "+GVALUE-SIZE+" "+GVALUE-VALUE-OFFSET+" "PARAM-FLAG-TYPE" "PARAM" + "+GVALUE-SIZE+" "+GVALUE-VALUE-OFFSET+" "GVALUE-STATIC-P" + "PARAM-FLAG-TYPE" "PARAM" "PARAM-CHAR" "PARAM-UNSIGNED-CHAR" "PARAM-BOOLEAN" "PARAM-INT" "PARAM-UNSIGNED-INT" "PARAM-LONG" "PARAM-UNSIGNED-LONG" "PARAM-UNICHAR" "PARAM-ENUM" "PARAM-FLAGS" "PARAM-SINGLE-FLOAT" diff --git a/glib/gobject.lisp b/glib/gobject.lisp index a9d4735..bfde9d1 100644 --- a/glib/gobject.lisp +++ b/glib/gobject.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gobject.lisp,v 1.58 2008-10-09 18:20:52 espen Exp $ +;; $Id: gobject.lisp,v 1.59 2008-11-04 03:22:23 espen Exp $ (in-package "GLIB") @@ -152,12 +152,15 @@ (defmethod compute-slot-reader-function ((slotd effective-property-slot-definiti (declare (ignore signal-unbound-p)) (let* ((type (slot-definition-type slotd)) (pname (slot-definition-pname slotd)) - (reader (reader-function type :ref :get))) + (get-reader (reader-function type :ref :get)) + (peek-reader (reader-function type :ref :peek))) #'(lambda (object) (with-memory (gvalue +gvalue-size+) (%gvalue-init gvalue (find-type-number type)) (%object-get-property object pname gvalue) - (funcall reader gvalue +gvalue-value-offset+))))) + (if (gvalue-static-p gvalue) + (funcall peek-reader gvalue +gvalue-value-offset+) + (funcall get-reader gvalue +gvalue-value-offset+)))))) (defmethod compute-slot-writer-function :around ((slotd effective-property-slot-definition)) (if (construct-only-property-p slotd) diff --git a/glib/gparam.lisp b/glib/gparam.lisp index ea3fa44..15a9f68 100644 --- a/glib/gparam.lisp +++ b/glib/gparam.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gparam.lisp,v 1.26 2007-08-20 10:50:25 espen Exp $ +;; $Id: gparam.lisp,v 1.27 2008-11-04 03:22:23 espen Exp $ (in-package "GLIB") @@ -34,6 +34,9 @@ (defbinding (size-of-gvalue "size_of_gvalue") () unsigned-int)) (defconstant +gvalue-size+ (size-of-gvalue)) (defconstant +gvalue-value-offset+ (max (size-of 'type-number) (type-alignment '(unsigned-byte 64)))) +(defconstant +gvalue-flags-offset+ + (+ +gvalue-value-offset+ (size-of '(unsigned-byte 64)))) +(defconstant +gvalue-nocopy-contents-flag+ 27) (defbinding (%gvalue-init "g_value_init") () nil (value gvalue) @@ -76,6 +79,15 @@ (defun gvalue-type (gvalue) ;; This will signal an error if the type hierarchy is unknown (type-from-number type-number t)))))) +(let ((flags-reader nil)) + (defun gvalue-static-p (gvalue) + (unless flags-reader + (setf flags-reader (reader-function 'unsigned-int))) + (prog1 + (ldb-test (byte 1 +gvalue-nocopy-contents-flag+) + (funcall flags-reader gvalue +gvalue-flags-offset+)) + (force-output)))) + (defun gvalue-get (gvalue) (funcall (reader-function (gvalue-type gvalue)) gvalue +gvalue-value-offset+)) @@ -85,7 +97,8 @@ (defun gvalue-peek (gvalue) gvalue +gvalue-value-offset+)) (defun gvalue-take (gvalue) - (funcall (reader-function (gvalue-type gvalue) :ref :get) + (funcall (reader-function (gvalue-type gvalue) + :ref (if (gvalue-static-p gvalue) :peek :get)) gvalue +gvalue-value-offset+)) (defun gvalue-set (gvalue value) -- [mdw]