@@ -33,9 +33,8 @@ PHPAPI size_t php_url_decode(char *str, size_t len);
33
33
/* {{{ ------- MEMORY stream implementation -------*/
34
34
35
35
typedef struct {
36
- char * data ;
36
+ zend_string * data ;
37
37
size_t fpos ;
38
- size_t fsize ;
39
38
int mode ;
40
39
} php_stream_memory_data ;
41
40
@@ -49,23 +48,16 @@ static ssize_t php_stream_memory_write(php_stream *stream, const char *buf, size
49
48
if (ms -> mode & TEMP_STREAM_READONLY ) {
50
49
return (ssize_t ) -1 ;
51
50
} else if (ms -> mode & TEMP_STREAM_APPEND ) {
52
- ms -> fpos = ms -> fsize ;
51
+ ms -> fpos = ZSTR_LEN ( ms -> data ) ;
53
52
}
54
- if (ms -> fpos + count > ms -> fsize ) {
55
- char * tmp ;
56
- if (!ms -> data ) {
57
- tmp = emalloc (ms -> fpos + count );
58
- } else {
59
- tmp = erealloc (ms -> data , ms -> fpos + count );
60
- }
61
- ms -> data = tmp ;
62
- ms -> fsize = ms -> fpos + count ;
53
+ if (ms -> fpos + count > ZSTR_LEN (ms -> data )) {
54
+ ms -> data = zend_string_realloc (ms -> data , ms -> fpos + count , 0 );
55
+ } else {
56
+ ms -> data = zend_string_separate (ms -> data , 0 );
63
57
}
64
- if (!ms -> data )
65
- count = 0 ;
66
58
if (count ) {
67
- assert (buf != NULL );
68
- memcpy (ms -> data + ms -> fpos , (char * )buf , count );
59
+ ZEND_ASSERT (buf != NULL );
60
+ memcpy (ZSTR_VAL ( ms -> data ) + ms -> fpos , (char * ) buf , count );
69
61
ms -> fpos += count ;
70
62
}
71
63
return count ;
@@ -79,17 +71,16 @@ static ssize_t php_stream_memory_read(php_stream *stream, char *buf, size_t coun
79
71
php_stream_memory_data * ms = (php_stream_memory_data * )stream -> abstract ;
80
72
assert (ms != NULL );
81
73
82
- if (ms -> fpos == ms -> fsize ) {
74
+ if (ms -> fpos == ZSTR_LEN ( ms -> data ) ) {
83
75
stream -> eof = 1 ;
84
76
count = 0 ;
85
77
} else {
86
- if (ms -> fpos + count >= ms -> fsize ) {
87
- count = ms -> fsize - ms -> fpos ;
78
+ if (ms -> fpos + count > ZSTR_LEN ( ms -> data ) ) {
79
+ count = ZSTR_LEN ( ms -> data ) - ms -> fpos ;
88
80
}
89
81
if (count ) {
90
- assert (ms -> data != NULL );
91
- assert (buf != NULL );
92
- memcpy (buf , ms -> data + ms -> fpos , count );
82
+ ZEND_ASSERT (buf != NULL );
83
+ memcpy (buf , ZSTR_VAL (ms -> data ) + ms -> fpos , count );
93
84
ms -> fpos += count ;
94
85
}
95
86
}
@@ -102,11 +93,8 @@ static ssize_t php_stream_memory_read(php_stream *stream, char *buf, size_t coun
102
93
static int php_stream_memory_close (php_stream * stream , int close_handle )
103
94
{
104
95
php_stream_memory_data * ms = (php_stream_memory_data * )stream -> abstract ;
105
- assert (ms != NULL );
106
-
107
- if (ms -> data && close_handle && ms -> mode != TEMP_STREAM_READONLY ) {
108
- efree (ms -> data );
109
- }
96
+ ZEND_ASSERT (ms != NULL );
97
+ zend_string_release (ms -> data );
110
98
efree (ms );
111
99
return 0 ;
112
100
}
@@ -142,8 +130,8 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe
142
130
return 0 ;
143
131
}
144
132
} else {
145
- if (ms -> fpos + (size_t )(offset ) > ms -> fsize ) {
146
- ms -> fpos = ms -> fsize ;
133
+ if (ms -> fpos + (size_t )(offset ) > ZSTR_LEN ( ms -> data ) ) {
134
+ ms -> fpos = ZSTR_LEN ( ms -> data ) ;
147
135
* newoffs = -1 ;
148
136
return -1 ;
149
137
} else {
@@ -154,8 +142,8 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe
154
142
}
155
143
}
156
144
case SEEK_SET :
157
- if (ms -> fsize < (size_t )(offset )) {
158
- ms -> fpos = ms -> fsize ;
145
+ if (ZSTR_LEN ( ms -> data ) < (size_t )(offset )) {
146
+ ms -> fpos = ZSTR_LEN ( ms -> data ) ;
159
147
* newoffs = -1 ;
160
148
return -1 ;
161
149
} else {
@@ -166,15 +154,15 @@ static int php_stream_memory_seek(php_stream *stream, zend_off_t offset, int whe
166
154
}
167
155
case SEEK_END :
168
156
if (offset > 0 ) {
169
- ms -> fpos = ms -> fsize ;
157
+ ms -> fpos = ZSTR_LEN ( ms -> data ) ;
170
158
* newoffs = -1 ;
171
159
return -1 ;
172
- } else if (ms -> fsize < (size_t )(- offset )) {
160
+ } else if (ZSTR_LEN ( ms -> data ) < (size_t )(- offset )) {
173
161
ms -> fpos = 0 ;
174
162
* newoffs = -1 ;
175
163
return -1 ;
176
164
} else {
177
- ms -> fpos = ms -> fsize + offset ;
165
+ ms -> fpos = ZSTR_LEN ( ms -> data ) + offset ;
178
166
* newoffs = ms -> fpos ;
179
167
stream -> eof = 0 ;
180
168
return 0 ;
@@ -204,7 +192,7 @@ static int php_stream_memory_stat(php_stream *stream, php_stream_statbuf *ssb) /
204
192
205
193
ssb -> sb .st_mode = ms -> mode & TEMP_STREAM_READONLY ? 0444 : 0666 ;
206
194
207
- ssb -> sb .st_size = ms -> fsize ;
195
+ ssb -> sb .st_size = ZSTR_LEN ( ms -> data ) ;
208
196
ssb -> sb .st_mode |= S_IFREG ; /* regular file */
209
197
ssb -> sb .st_mtime = timestamp ;
210
198
ssb -> sb .st_atime = timestamp ;
@@ -241,16 +229,16 @@ static int php_stream_memory_set_option(php_stream *stream, int option, int valu
241
229
return PHP_STREAM_OPTION_RETURN_ERR ;
242
230
}
243
231
newsize = * (size_t * )ptrparam ;
244
- if (newsize <= ms -> fsize ) {
232
+ if (newsize <= ZSTR_LEN (ms -> data )) {
233
+ ms -> data = zend_string_truncate (ms -> data , newsize , 0 );
245
234
if (newsize < ms -> fpos ) {
246
235
ms -> fpos = newsize ;
247
236
}
248
237
} else {
249
- ms -> data = erealloc (ms -> data , newsize );
250
- memset ( ms -> data + ms -> fsize , 0 , newsize - ms -> fsize );
251
- ms -> fsize = newsize ;
238
+ size_t old_size = ZSTR_LEN (ms -> data );
239
+ ms -> data = zend_string_realloc ( ms -> data , newsize , 0 );
240
+ memset ( ZSTR_VAL ( ms -> data ) + old_size , 0 , newsize - old_size ) ;
252
241
}
253
- ms -> fsize = newsize ;
254
242
return PHP_STREAM_OPTION_RETURN_OK ;
255
243
}
256
244
}
@@ -300,9 +288,8 @@ PHPAPI php_stream *_php_stream_memory_create(int mode STREAMS_DC)
300
288
php_stream * stream ;
301
289
302
290
self = emalloc (sizeof (* self ));
303
- self -> data = NULL ;
291
+ self -> data = ZSTR_EMPTY_ALLOC () ;
304
292
self -> fpos = 0 ;
305
- self -> fsize = 0 ;
306
293
self -> mode = mode ;
307
294
308
295
stream = php_stream_alloc_rel (& php_stream_memory_ops , self , 0 , _php_stream_mode_to_str (mode ));
@@ -313,39 +300,25 @@ PHPAPI php_stream *_php_stream_memory_create(int mode STREAMS_DC)
313
300
314
301
315
302
/* {{{ */
316
- PHPAPI php_stream * _php_stream_memory_open (int mode , const char * buf , size_t length STREAMS_DC )
303
+ PHPAPI php_stream * _php_stream_memory_open (int mode , zend_string * buf STREAMS_DC )
317
304
{
318
305
php_stream * stream ;
319
306
php_stream_memory_data * ms ;
320
307
321
308
if ((stream = php_stream_memory_create_rel (mode )) != NULL ) {
322
309
ms = (php_stream_memory_data * )stream -> abstract ;
323
-
324
- if (mode == TEMP_STREAM_READONLY || mode == TEMP_STREAM_TAKE_BUFFER ) {
325
- /* use the buffer directly */
326
- ms -> data = (char * ) buf ;
327
- ms -> fsize = length ;
328
- } else {
329
- if (length ) {
330
- assert (buf != NULL );
331
- php_stream_write (stream , buf , length );
332
- }
333
- }
310
+ ms -> data = zend_string_copy (buf );
334
311
}
335
312
return stream ;
336
313
}
337
314
/* }}} */
338
315
339
316
340
317
/* {{{ */
341
- PHPAPI char * _php_stream_memory_get_buffer (php_stream * stream , size_t * length STREAMS_DC )
318
+ PHPAPI zend_string * _php_stream_memory_get_buffer (php_stream * stream STREAMS_DC )
342
319
{
343
320
php_stream_memory_data * ms = (php_stream_memory_data * )stream -> abstract ;
344
-
345
- assert (ms != NULL );
346
- assert (length != 0 );
347
-
348
- * length = ms -> fsize ;
321
+ ZEND_ASSERT (ms != NULL );
349
322
return ms -> data ;
350
323
}
351
324
/* }}} */
@@ -373,16 +346,15 @@ static ssize_t php_stream_temp_write(php_stream *stream, const char *buf, size_t
373
346
return -1 ;
374
347
}
375
348
if (php_stream_is (ts -> innerstream , PHP_STREAM_IS_MEMORY )) {
376
- size_t memsize ;
377
- char * membuf = php_stream_memory_get_buffer (ts -> innerstream , & memsize );
349
+ zend_string * membuf = php_stream_memory_get_buffer (ts -> innerstream );
378
350
379
- if (memsize + count >= ts -> smax ) {
351
+ if (ZSTR_LEN ( membuf ) + count >= ts -> smax ) {
380
352
php_stream * file = php_stream_fopen_temporary_file (ts -> tmpdir , "php" , NULL );
381
353
if (file == NULL ) {
382
354
php_error_docref (NULL , E_WARNING , "Unable to create temporary file, Check permissions in temporary files directory." );
383
355
return 0 ;
384
356
}
385
- php_stream_write (file , membuf , memsize );
357
+ php_stream_write (file , ZSTR_VAL ( membuf ), ZSTR_LEN ( membuf ) );
386
358
php_stream_free_enclosed (ts -> innerstream , PHP_STREAM_FREE_CLOSE );
387
359
ts -> innerstream = file ;
388
360
php_stream_encloses (stream , ts -> innerstream );
@@ -477,8 +449,7 @@ static int php_stream_temp_cast(php_stream *stream, int castas, void **ret)
477
449
{
478
450
php_stream_temp_data * ts = (php_stream_temp_data * )stream -> abstract ;
479
451
php_stream * file ;
480
- size_t memsize ;
481
- char * membuf ;
452
+ zend_string * membuf ;
482
453
zend_off_t pos ;
483
454
484
455
assert (ts != NULL );
@@ -511,8 +482,8 @@ static int php_stream_temp_cast(php_stream *stream, int castas, void **ret)
511
482
}
512
483
513
484
/* perform the conversion and then pass the request on to the innerstream */
514
- membuf = php_stream_memory_get_buffer (ts -> innerstream , & memsize );
515
- php_stream_write (file , membuf , memsize );
485
+ membuf = php_stream_memory_get_buffer (ts -> innerstream );
486
+ php_stream_write (file , ZSTR_VAL ( membuf ), ZSTR_LEN ( membuf ) );
516
487
pos = php_stream_tell (ts -> innerstream );
517
488
518
489
php_stream_free_enclosed (ts -> innerstream , PHP_STREAM_FREE_CLOSE );
0 commit comments