guile-user
[Top][All Lists]
Advanced

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

Re: crash in guile-sqlite3


From: Sunjoong Lee
Subject: Re: crash in guile-sqlite3
Date: Sun, 29 Apr 2012 10:58:20 +0900

Hi, Joonas;

Yesterday, David said simple solution of yours. I think I found the case of segfault.

########## cut here ##########
--- sqlite3.scm.old 2012-01-24 00:22:10.000000000 +0900
+++ sqlite3.scm 2012-04-29 10:37:37.999722092 +0900
@@ -284,11 +284,11 @@
   (let ((bind-blob (pointer->procedure
                     int
                     (dynamic-func "sqlite3_bind_blob" libsqlite3)
-                    (list '* int '* int '*)))
+                    (list '* int '* int int)))
         (bind-text (pointer->procedure
                     int
                     (dynamic-func "sqlite3_bind_text" libsqlite3)
-                    (list '* int '* int '*)))
+                    (list '* int '* int int)))
         (bind-int64 (pointer->procedure
                      int
                      (dynamic-func "sqlite3_bind_int64" libsqlite3)
@@ -301,8 +301,7 @@
                     int
                     (dynamic-func "sqlite3_bind_null" libsqlite3)
                     (list '* int)))
-        (sqlite-transient (bytevector->pointer
-                           (make-bytevector (sizeof '*) #xff))))
+        (sqlite-transient -1))
     (lambda (stmt key val)
       (assert-live-stmt! stmt)
       (let ((idx (key->index stmt key))
########## cut here ##########

2012/4/27 Sunjoong Lee <address@hidden>
Same crash on Guile 2.0.5. It looks like string encoding problem. Suppose name be an integer not a string like 10, it would not crash. sqlite-bind of Guile-SQLite3 will deliver this 10 to sqlite3_bind_int64 of libsqlite3. If a string, it will use sqlite3_bind_text of libsqlite3. Before delivering, it will encoding this string to utf-8 string pointer because sqlite3_bind_text need to know string pointer and it's length. I think you or Andy may look around that.

 In the http://www.sqlite.org/c3ref/c_static.html ,
#define SQLITE_TRANSIENT   ((sqlite3_destructor_type)-1)

I.e, SQLITE_TRANSIENT is actually -1, not some position of memory. sqlite-bind of Guile-SQLite3 had treated it as a pointer, an address of memory position.

Oh, another one; your test code ex0.scm has a bug. 

--- ex0.scm.old 2012-04-29 10:57:09.717398060 +0900
+++ ex0.scm 2012-04-29 10:39:20.051261614 +0900
@@ -34,7 +34,7 @@
   ;; This finalize call in particular seems to break things
   (sqlite-finalize stmt)
   ;; This seems to be never reached.
-  (display "finalized\n")))
+  (display "finalized\n"))
 
 (display "closing\n")
 (sqlite-close db)
\ No newline at end of file


reply via email to

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