Skip to content

Commit 0e4c7b6

Browse files
committed
Pdo\Pgsql::setNoticeCallback(): theorical memory leak
c265b90#r142275842 Redefines PDO_CONSTRUCT_CHECK to make room for an optional cleanup
1 parent 4899172 commit 0e4c7b6

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

ext/pdo/php_pdo.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,24 @@ PHP_MINFO_FUNCTION(pdo);
5555

5656
#define LONG_CONST(c) (zend_long) c
5757

58+
#define PDO_CONSTRUCT_CHECK_COND dbh->driver
59+
#define PDO_CONSTRUCT_CHECK_FAIL() \
60+
{ \
61+
zend_throw_error(NULL, "%s object is uninitialized", ZSTR_VAL(Z_OBJ(EX(This))->ce->name)); \
62+
} \
63+
5864
#define PDO_CONSTRUCT_CHECK \
59-
if (!dbh->driver) { \
60-
zend_throw_error(NULL, "%s object is uninitialized", ZSTR_VAL(Z_OBJ(EX(This))->ce->name)); \
65+
if (!(PDO_CONSTRUCT_CHECK_COND)) { \
66+
PDO_CONSTRUCT_CHECK_FAIL(); \
6167
RETURN_THROWS(); \
6268
} \
6369

6470

71+
#define PDO_CONSTRUCT_CHECK_WITH_CLEANUP(cleanup) \
72+
if (!(PDO_CONSTRUCT_CHECK_COND)) { \
73+
PDO_CONSTRUCT_CHECK_FAIL(); \
74+
goto cleanup; \
75+
} \
76+
77+
6578
#endif /* PHP_PDO_H */

ext/pdo_pgsql/pgsql_driver.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ PHP_METHOD(PDO_PGSql_Ext, pgsqlSetNoticeCallback)
12511251
}
12521252

12531253
pdo_dbh_t *dbh = Z_PDO_DBH_P(ZEND_THIS);
1254-
PDO_CONSTRUCT_CHECK;
1254+
PDO_CONSTRUCT_CHECK_WITH_CLEANUP(cleanup);
12551255

12561256
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
12571257

@@ -1261,6 +1261,14 @@ PHP_METHOD(PDO_PGSql_Ext, pgsqlSetNoticeCallback)
12611261
H->notice_callback = emalloc(sizeof(zend_fcall_info_cache));
12621262
zend_fcc_dup(H->notice_callback, &fcc);
12631263
}
1264+
1265+
return;
1266+
1267+
cleanup:
1268+
if (ZEND_FCC_INITIALIZED(fcc)) {
1269+
zend_fcc_dtor(&fcc);
1270+
}
1271+
RETURN_THROWS();
12641272
}
12651273
/* }}} */
12661274

0 commit comments

Comments
 (0)