]> granicus.if.org Git - php/commitdiff
Always fill entire buffer in ibase_blob_get()
authorArd Biesheuvel <abies@php.net>
Sat, 16 Aug 2003 19:48:32 +0000 (19:48 +0000)
committerArd Biesheuvel <abies@php.net>
Sat, 16 Aug 2003 19:48:32 +0000 (19:48 +0000)
ext/interbase/interbase.c

index a57d82bd86f24621cb88890f715ee1792cc9a442..6eac189167c572bc9d442db7508d1117d09db1e0 100644 (file)
@@ -3364,7 +3364,7 @@ PHP_FUNCTION(ibase_blob_add)
 
        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;
+               chunk_size = rem_cnt > USHRT_MAX ? USHRT_MAX : (unsigned short)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);
@@ -3381,9 +3381,8 @@ PHP_FUNCTION(ibase_blob_add)
 PHP_FUNCTION(ibase_blob_get)
 {
        zval **blob_arg, **len_arg;
-       int stat;
+       ISC_STATUS stat;
        char *bl_data;
-       unsigned short seg_len;
        unsigned long max_len, cur_len;
        ibase_blob_handle *ib_blob;
 
@@ -3404,20 +3403,20 @@ PHP_FUNCTION(ibase_blob_get)
                
                bl_data = emalloc(max_len + 1);
 
-               for (cur_len = stat = 0; stat == 0;) {
-                       unsigned short next_chunk_size = (max_len-cur_len) > USHRT_MAX ? USHRT_MAX : (max_len-cur_len);
+               for (cur_len = stat = 0; stat == 0 || stat == isc_segment;  ) {
+                       unsigned short seg_len, chunk_size = (max_len-cur_len) > USHRT_MAX ? USHRT_MAX : (unsigned short)(max_len-cur_len);
+
+                       stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, &seg_len, chunk_size, &bl_data[cur_len]); 
 
-                       stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, &seg_len, next_chunk_size, &bl_data[cur_len]);
                        cur_len += seg_len;
-                       if (cur_len > max_len) { /* never!*/
-                               efree(bl_data);
-                               _php_ibase_module_error("PHP module internal error");
-                               RETURN_FALSE;
+                       
+                       if (cur_len == max_len) {
+                               break;
                        }
                }
 
                bl_data[cur_len] = '\0';
-               if (IB_STATUS[0] && (IB_STATUS[1] != isc_segstr_eof && IB_STATUS[1] != isc_segment)) {
+               if (IB_STATUS[0] == 1 && (stat != 0 && stat != isc_segstr_eof && stat != isc_segment)) {
                        efree(bl_data);
                        _php_ibase_error(TSRMLS_C);
                        RETURN_FALSE;