@@ -169,6 +169,10 @@ static jas_stream_t *jas_stream_create()
169
169
return stream ;
170
170
}
171
171
172
+ #if 0
173
+
174
+ /* Obsolete code. */
175
+
172
176
jas_stream_t * jas_stream_memopen (char * buf , int bufsize )
173
177
{
174
178
jas_stream_t * stream ;
@@ -238,6 +242,136 @@ jas_stream_t *jas_stream_memopen(char *buf, int bufsize)
238
242
return stream ;
239
243
}
240
244
245
+ #else
246
+
247
+ /*
248
+ This function will eventually replace jas_stream_memopen.
249
+ If buf is 0 and bufsize > 0:
250
+ a buffer is dynamically allocated with size bufsize and this buffer is
251
+ not growable.
252
+ If buf is 0 and bufsize is 0:
253
+ a buffer is dynamically allocated whose size will automatically grow to
254
+ accommodate the amount of data written.
255
+ If buf is not 0:
256
+ bufsize (which, in this case, is not currently allowed to be zero) is
257
+ the size of the (nongrowable) buffer pointed to by buf.
258
+ */
259
+
260
+ jas_stream_t * jas_stream_memopen2 (char * buf , size_t bufsize )
261
+ {
262
+ jas_stream_t * stream ;
263
+ jas_stream_memobj_t * obj ;
264
+
265
+ JAS_DBGLOG (100 , ("jas_stream_memopen2(%p, %zu)\n" , buf , bufsize ));
266
+
267
+ assert ((buf && bufsize > 0 ) || (!buf ));
268
+
269
+ if (!(stream = jas_stream_create ())) {
270
+ return 0 ;
271
+ }
272
+
273
+ /* A stream associated with a memory buffer is always opened
274
+ for both reading and writing in binary mode. */
275
+ stream -> openmode_ = JAS_STREAM_READ | JAS_STREAM_WRITE | JAS_STREAM_BINARY ;
276
+
277
+ /* Since the stream data is already resident in memory, buffering
278
+ is not necessary. */
279
+ /* But... It still may be faster to use buffering anyways. */
280
+ jas_stream_initbuf (stream , JAS_STREAM_FULLBUF , 0 , 0 );
281
+
282
+ /* Select the operations for a memory stream. */
283
+ stream -> ops_ = & jas_stream_memops ;
284
+
285
+ /* Allocate memory for the underlying memory stream object. */
286
+ if (!(obj = jas_malloc (sizeof (jas_stream_memobj_t )))) {
287
+ jas_stream_destroy (stream );
288
+ return 0 ;
289
+ }
290
+ stream -> obj_ = (void * ) obj ;
291
+
292
+ /* Initialize a few important members of the memory stream object. */
293
+ obj -> myalloc_ = 0 ;
294
+ obj -> buf_ = 0 ;
295
+
296
+ /* If the buffer size specified is nonpositive, then the buffer
297
+ is allocated internally and automatically grown as needed. */
298
+ if (!bufsize ) {
299
+ obj -> bufsize_ = 1024 ;
300
+ obj -> growable_ = 1 ;
301
+ } else {
302
+ obj -> bufsize_ = bufsize ;
303
+ obj -> growable_ = 0 ;
304
+ }
305
+ if (buf ) {
306
+ obj -> buf_ = JAS_CAST (unsigned char * , buf );
307
+ } else {
308
+ obj -> buf_ = jas_malloc (obj -> bufsize_ );
309
+ obj -> myalloc_ = 1 ;
310
+ }
311
+ if (!obj -> buf_ ) {
312
+ jas_stream_close (stream );
313
+ return 0 ;
314
+ }
315
+ JAS_DBGLOG (100 , ("jas_stream_memopen2 buffer buf=%p myalloc=%d\n" ,
316
+ obj -> buf_ , obj -> myalloc_ ));
317
+
318
+ if (bufsize > 0 && buf ) {
319
+ /* If a buffer was supplied by the caller and its length is positive,
320
+ make the associated buffer data appear in the stream initially. */
321
+ obj -> len_ = bufsize ;
322
+ } else {
323
+ /* The stream is initially empty. */
324
+ obj -> len_ = 0 ;
325
+ }
326
+ obj -> pos_ = 0 ;
327
+
328
+ return stream ;
329
+ }
330
+
331
+ /*
332
+ NOTE:
333
+ The version of the function jas_stream_memopen only exists for backwards
334
+ compatibility.
335
+ Eventually, it should be replaced by jas_stream_memopen2.
336
+ In retrospect, it was a very poor choice to have specified the buffer
337
+ size parameter (bufsize) to have type int. On some machines, int may only
338
+ be a 16-bit integer. This precludes larger-sized buffer allocations, which
339
+ are needed in practice.
340
+
341
+ If bufsize <= 0, the buffer is growable; otherwise, the buffer has a fixed
342
+ size of bufsize.
343
+ If buf is 0, the buffer is dynamically allocated with jas_malloc.
344
+ If buf is not 0 and bufsize <= 0 (which is not permitted in any
345
+ circumstances), bad things will happen (especially if the buf was not
346
+ allocated with jas_malloc).
347
+ */
348
+ jas_stream_t * jas_stream_memopen (char * buf , int bufsize )
349
+ {
350
+ char * new_buf ;
351
+ size_t new_bufsize ;
352
+
353
+ JAS_DBGLOG (100 , ("jas_stream_memopen(%p, %d)\n" , buf , bufsize ));
354
+ if (bufsize < 0 ) {
355
+ jas_deprecated ("negative buffer size for jas_stream_memopen" );
356
+ }
357
+ if (buf && bufsize <= 0 ) {
358
+ // This was never a valid thing to do with the old API.
359
+ jas_eprintf ("Invalid use of jas_stream_memopen detected.\n" );
360
+ jas_deprecated ("A user-provided buffer for "
361
+ "jas_stream_memopen cannot be growable.\n" );
362
+ }
363
+ if (bufsize <= 0 ) {
364
+ new_bufsize = 0 ;
365
+ new_buf = 0 ;
366
+ } else {
367
+ new_bufsize = bufsize ;
368
+ new_buf = buf ;
369
+ }
370
+ return jas_stream_memopen2 (new_buf , new_bufsize );
371
+ }
372
+
373
+ #endif
374
+
241
375
jas_stream_t * jas_stream_fopen (const char * filename , const char * mode )
242
376
{
243
377
jas_stream_t * stream ;
@@ -520,6 +654,10 @@ int jas_stream_read(jas_stream_t *stream, void *buf, int cnt)
520
654
int c ;
521
655
char * bufptr ;
522
656
657
+ if (cnt < 0 ) {
658
+ jas_deprecated ("negative count for jas_stream_read" );
659
+ }
660
+
523
661
bufptr = buf ;
524
662
525
663
n = 0 ;
@@ -539,6 +677,10 @@ int jas_stream_write(jas_stream_t *stream, const void *buf, int cnt)
539
677
int n ;
540
678
const char * bufptr ;
541
679
680
+ if (cnt < 0 ) {
681
+ jas_deprecated ("negative count for jas_stream_write" );
682
+ }
683
+
542
684
bufptr = buf ;
543
685
544
686
n = 0 ;
@@ -604,6 +746,9 @@ char *jas_stream_gets(jas_stream_t *stream, char *buf, int bufsize)
604
746
int jas_stream_gobble (jas_stream_t * stream , int n )
605
747
{
606
748
int m ;
749
+ if (n < 0 ) {
750
+ jas_deprecated ("negative count for jas_stream_gobble" );
751
+ }
607
752
m = n ;
608
753
for (m = n ; m > 0 ; -- m ) {
609
754
if (jas_stream_getc (stream ) == EOF ) {
@@ -616,6 +761,9 @@ int jas_stream_gobble(jas_stream_t *stream, int n)
616
761
int jas_stream_pad (jas_stream_t * stream , int n , int c )
617
762
{
618
763
int m ;
764
+ if (n < 0 ) {
765
+ jas_deprecated ("negative count for jas_stream_pad" );
766
+ }
619
767
m = n ;
620
768
for (m = n ; m > 0 ; -- m ) {
621
769
if (jas_stream_putc (stream , c ) == EOF )
@@ -988,7 +1136,7 @@ long jas_stream_length(jas_stream_t *stream)
988
1136
989
1137
static int mem_read (jas_stream_obj_t * obj , char * buf , int cnt )
990
1138
{
991
- int n ;
1139
+ ssize_t n ;
992
1140
assert (cnt >= 0 );
993
1141
assert (buf );
994
1142
@@ -1001,14 +1149,21 @@ static int mem_read(jas_stream_obj_t *obj, char *buf, int cnt)
1001
1149
return cnt ;
1002
1150
}
1003
1151
1004
- static int mem_resize (jas_stream_memobj_t * m , int bufsize )
1152
+ static int mem_resize (jas_stream_memobj_t * m , size_t bufsize )
1005
1153
{
1006
1154
unsigned char * buf ;
1007
1155
1008
1156
//assert(m->buf_);
1009
- assert (bufsize >= 0 );
1157
+ //assert(bufsize >= 0);
1158
+
1159
+ JAS_DBGLOG (100 , ("mem_resize(%p, %zu)\n" , m , bufsize ));
1160
+ if (!bufsize ) {
1161
+ jas_eprintf (
1162
+ "mem_resize was not really designed to handle a buffer of size 0\n"
1163
+ "This may not work.\n"
1164
+ );
1165
+ }
1010
1166
1011
- JAS_DBGLOG (100 , ("mem_resize(%p, %d)\n" , m , bufsize ));
1012
1167
if (!(buf = jas_realloc2 (m -> buf_ , bufsize , sizeof (unsigned char ))) &&
1013
1168
bufsize ) {
1014
1169
JAS_DBGLOG (100 , ("mem_resize realloc failed\n" ));
@@ -1022,11 +1177,11 @@ static int mem_resize(jas_stream_memobj_t *m, int bufsize)
1022
1177
1023
1178
static int mem_write (jas_stream_obj_t * obj , char * buf , int cnt )
1024
1179
{
1025
- int n ;
1180
+ size_t n ;
1026
1181
int ret ;
1027
1182
jas_stream_memobj_t * m = (jas_stream_memobj_t * )obj ;
1028
- long newbufsize ;
1029
- long newpos ;
1183
+ size_t newbufsize ;
1184
+ size_t newpos ;
1030
1185
1031
1186
assert (buf );
1032
1187
assert (cnt >= 0 );
@@ -1036,13 +1191,15 @@ static int mem_write(jas_stream_obj_t *obj, char *buf, int cnt)
1036
1191
if (newpos > m -> bufsize_ && m -> growable_ ) {
1037
1192
newbufsize = m -> bufsize_ ;
1038
1193
while (newbufsize < newpos ) {
1039
- newbufsize <<= 1 ;
1040
- assert (newbufsize >= 0 );
1194
+ //newbufsize <<= 1;
1195
+ if (!jas_safe_size_mul (newbufsize , 2 , & newbufsize )) {
1196
+ JAS_DBGLOG (100 , ("new buffer size would cause overflow\n" ));
1197
+ return -1 ;
1198
+ }
1041
1199
}
1042
- JAS_DBGLOG (100 , ("mem_write resizing from %d to %z \n" , m -> bufsize_ ,
1200
+ JAS_DBGLOG (100 , ("mem_write resizing from %d to %zu \n" , m -> bufsize_ ,
1043
1201
newbufsize ));
1044
- JAS_DBGLOG (100 , ("mem_write resizing from %d to %ul\n" , m -> bufsize_ ,
1045
- JAS_CAST (unsigned long , newbufsize )));
1202
+ assert (newbufsize > 0 );
1046
1203
if (mem_resize (m , newbufsize )) {
1047
1204
return -1 ;
1048
1205
}
@@ -1076,7 +1233,7 @@ static int mem_write(jas_stream_obj_t *obj, char *buf, int cnt)
1076
1233
static long mem_seek (jas_stream_obj_t * obj , long offset , int origin )
1077
1234
{
1078
1235
jas_stream_memobj_t * m = (jas_stream_memobj_t * )obj ;
1079
- long newpos ;
1236
+ size_t newpos ;
1080
1237
1081
1238
JAS_DBGLOG (100 , ("mem_seek(%p, %ld, %d)\n" , obj , offset , origin ));
1082
1239
switch (origin ) {
0 commit comments