Skip to content

Commit e3f3972

Browse files
committed
pg_copy_from using zend_string on success.
1 parent da8f483 commit e3f3972

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

ext/pgsql/pgsql.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3269,22 +3269,28 @@ PHP_FUNCTION(pg_copy_from)
32693269
int command_failed = 0;
32703270
PQclear(pgsql_result);
32713271
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pg_rows), value) {
3272+
zend_string *zquery = NULL;
32723273
zend_string *tmp = zval_try_get_string(value);
32733274
if (UNEXPECTED(!tmp)) {
32743275
return;
32753276
}
3276-
query = (char *)emalloc(ZSTR_LEN(tmp) + 2);
3277-
strlcpy(query, ZSTR_VAL(tmp), ZSTR_LEN(tmp) + 2);
3278-
if (ZSTR_LEN(tmp) > 0 && *(query + ZSTR_LEN(tmp) - 1) != '\n') {
3279-
strlcat(query, "\n", ZSTR_LEN(tmp) + 2);
3277+
zquery = zend_string_alloc(ZSTR_LEN(tmp) + 2, false);
3278+
if (UNEXPECTED(!zquery)) {
3279+
zend_string_release(tmp);
3280+
return;
3281+
}
3282+
memcpy(ZSTR_VAL(zquery), ZSTR_VAL(tmp), ZSTR_LEN(tmp) + 2);
3283+
ZSTR_VAL(zquery)[ZSTR_LEN(tmp) + 1] = 0;
3284+
if (ZSTR_LEN(zquery) > 0 && ZSTR_VAL(zquery)[ZSTR_LEN(tmp)] != '\n') {
3285+
ZSTR_VAL(zquery)[ZSTR_LEN(tmp) ] = '\n';
32803286
}
3281-
if (PQputCopyData(pgsql, query, (int)strlen(query)) != 1) {
3282-
efree(query);
3287+
if (PQputCopyData(pgsql, ZSTR_VAL(tmp), ZSTR_LEN(tmp)) != 1) {
3288+
zend_string_release(zquery);
32833289
zend_string_release(tmp);
32843290
PHP_PQ_ERROR("copy failed: %s", pgsql);
32853291
RETURN_FALSE;
32863292
}
3287-
efree(query);
3293+
zend_string_release(zquery);
32883294
zend_string_release(tmp);
32893295
} ZEND_HASH_FOREACH_END();
32903296

0 commit comments

Comments
 (0)