fix NULL deref with circular refs
[m6w6/ext-pq] / src / php_pqtxn.c
index 5fc1e9d5afcf7ebdbff9c6f213db3fa962bbee54..b48cf7e568b673b2052e7d07edb624b34bed5f79 100644 (file)
@@ -32,7 +32,7 @@ zend_class_entry *php_pqtxn_class_entry;
 static zend_object_handlers php_pqtxn_object_handlers;
 static HashTable php_pqtxn_object_prophandlers;
 
-const char *isolation_level(long *isolation)
+const char *php_pq_isolation_level(long *isolation)
 {
        switch (*isolation) {
        case PHP_PQTXN_SERIALIZABLE:
@@ -54,7 +54,7 @@ static void php_pqtxn_object_free(void *o TSRMLS_DC)
        fprintf(stderr, "FREE txn(#%d) %p (conn(#%d): %p)\n", obj->zv.handle, obj, obj->intern->conn->zv.handle, obj->intern->conn);
 #endif
        if (obj->intern) {
-               if (obj->intern->open) {
+               if (obj->intern->open && obj->intern->conn->intern) {
                        PGresult *res = PQexec(obj->intern->conn->intern->conn, "ROLLBACK");
 
                        if (res) {
@@ -704,7 +704,7 @@ static PHP_METHOD(pqtxn, openLOB) {
                        int lofd = lo_open(obj->intern->conn->intern->conn, loid, mode);
 
                        if (lofd < 0) {
-                               throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to open large object with oid=%u with mode '%s' (%s)", loid, strmode(mode), PHP_PQerrorMessage(obj->intern->conn->intern->conn));
+                               throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to open large object with oid=%u with mode '%s' (%s)", loid, php_pq_strmode(mode), PHP_PQerrorMessage(obj->intern->conn->intern->conn));
                        } else {
                                php_pqlob_t *lob = ecalloc(1, sizeof(*lob));
 
@@ -743,12 +743,12 @@ static PHP_METHOD(pqtxn, createLOB) {
                        Oid loid = lo_creat(obj->intern->conn->intern->conn, mode);
 
                        if (loid == InvalidOid) {
-                               throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to create large object with mode '%s' (%s)", strmode(mode), PHP_PQerrorMessage(obj->intern->conn->intern->conn));
+                               throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to create large object with mode '%s' (%s)", php_pq_strmode(mode), PHP_PQerrorMessage(obj->intern->conn->intern->conn));
                        } else {
                                int lofd = lo_open(obj->intern->conn->intern->conn, loid, mode);
 
                                if (lofd < 0) {
-                                       throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to open large object with oid=%u with mode '%s': %s", loid, strmode(mode), PHP_PQerrorMessage(obj->intern->conn->intern->conn));
+                                       throw_exce(EX_RUNTIME TSRMLS_CC, "Failed to open large object with oid=%u with mode '%s': %s", loid, php_pq_strmode(mode), PHP_PQerrorMessage(obj->intern->conn->intern->conn));
                                } else {
                                        php_pqlob_t *lob = ecalloc(1, sizeof(*lob));