diff options
-rw-r--r-- | ext/interbase/interbase.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index bf942d9dd6..a57d82bd86 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -3347,6 +3347,8 @@ PHP_FUNCTION(ibase_blob_add) { zval **blob_arg, **string_arg; ibase_blob_handle *ib_blob; + unsigned long put_cnt = 0, rem_cnt; + unsigned short chunk_size; RESET_ERRMSG; @@ -3360,9 +3362,15 @@ PHP_FUNCTION(ibase_blob_add) convert_to_string_ex(string_arg); - if (isc_put_segment(IB_STATUS, &ib_blob->bl_handle, (unsigned short) Z_STRLEN_PP(string_arg), Z_STRVAL_PP(string_arg))) { - _php_ibase_error(TSRMLS_C); - RETURN_FALSE; + for (rem_cnt = Z_STRLEN_PP(string_arg); rem_cnt > 0; rem_cnt -= chunk_size) { + + chunk_size = rem_cnt > USHRT_MAX ? USHRT_MAX : rem_cnt; + + if (isc_put_segment(IB_STATUS, &ib_blob->bl_handle, chunk_size, &Z_STRVAL_PP(string_arg)[put_cnt] )) { + _php_ibase_error(TSRMLS_C); + RETURN_FALSE; + } + put_cnt += chunk_size; } RETURN_TRUE; } |