summaryrefslogtreecommitdiff
path: root/ext/sqlite3/sqlite3.c
diff options
context:
space:
mode:
authorDanack <Danack@basereality.com>2015-01-06 22:09:13 +0000
committerStanislav Malyshev <stas@php.net>2015-03-22 16:46:02 -0700
commit0c27a8eb61813f04c92caf578d24bb3b76eb6651 (patch)
tree18bc1b7a55b2822f9937cb6bd850786b59a9ee0d /ext/sqlite3/sqlite3.c
parenta759c40872a7287a5bef0e54b068695404566c88 (diff)
downloadphp-git-0c27a8eb61813f04c92caf578d24bb3b76eb6651.tar.gz
Fix #68760: Fix freeing null segfault. Added test for behaviour.
Diffstat (limited to 'ext/sqlite3/sqlite3.c')
-rw-r--r--ext/sqlite3/sqlite3.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c
index 3ff0242cc4..8178d4f3b2 100644
--- a/ext/sqlite3/sqlite3.c
+++ b/ext/sqlite3/sqlite3.c
@@ -898,16 +898,21 @@ static int php_sqlite3_callback_compare(void *coll, int a_len, const void *a, in
efree(zargs[1]);
efree(zargs);
- //retval ought to contain a ZVAL_LONG by now
- // (the result of a comparison, i.e. most likely -1, 0, or 1)
- //I suppose we could accept any scalar return type, though.
- if (Z_TYPE_P(retval) != IS_LONG){
+ if (!retval) {
+ //Exception was thrown by callback, default to 0 for compare
+ ret = 0;
+ } else if (Z_TYPE_P(retval) != IS_LONG) {
+ //retval ought to contain a ZVAL_LONG by now
+ // (the result of a comparison, i.e. most likely -1, 0, or 1)
+ //I suppose we could accept any scalar return type, though.
php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the compare callback (invalid return type). Collation behaviour is undefined.");
- }else{
+ } else {
ret = Z_LVAL_P(retval);
}
- zval_ptr_dtor(&retval);
+ if (retval) {
+ zval_ptr_dtor(&retval);
+ }
return ret;
}