@@ -3269,22 +3269,28 @@ PHP_FUNCTION(pg_copy_from)
3269
3269
int command_failed = 0 ;
3270
3270
PQclear (pgsql_result );
3271
3271
ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (pg_rows ), value ) {
3272
+ zend_string * zquery = NULL ;
3272
3273
zend_string * tmp = zval_try_get_string (value );
3273
3274
if (UNEXPECTED (!tmp )) {
3274
3275
return ;
3275
3276
}
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' ;
3280
3286
}
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 );
3283
3289
zend_string_release (tmp );
3284
3290
PHP_PQ_ERROR ("copy failed: %s" , pgsql );
3285
3291
RETURN_FALSE ;
3286
3292
}
3287
- efree ( query );
3293
+ zend_string_release ( zquery );
3288
3294
zend_string_release (tmp );
3289
3295
} ZEND_HASH_FOREACH_END ();
3290
3296
0 commit comments