Skip to content

Commit 3e76414

Browse files
committed
PdoPgsql::setNoticeCallback(): theorical memory leak
c265b90#r142275842 Redefines PDO_CONSTRUCT_CHECK to make room for an optional cleanup
1 parent c6e2e00 commit 3e76414

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

ext/pdo/php_pdo.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,22 @@ 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+
zend_throw_error(NULL, "%s object is uninitialized", ZSTR_VAL(Z_OBJ(EX(This))->ce->name));
61+
5862
#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)); \
63+
if (!(PDO_CONSTRUCT_CHECK_COND)) { \
64+
PDO_CONSTRUCT_CHECK_FAIL \
6165
RETURN_THROWS(); \
6266
} \
6367

6468

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

ext/pdo_pgsql/pgsql_driver.c

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

12541254
pdo_dbh_t *dbh = Z_PDO_DBH_P(ZEND_THIS);
1255-
PDO_CONSTRUCT_CHECK;
1255+
PDO_CONSTRUCT_CHECK_WITH_CLEANUP(cleanup);
12561256

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

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

0 commit comments

Comments
 (0)