@@ -148,7 +148,7 @@ PHP_FUNCTION(pack)
148
148
}
149
149
else if (c >= '0' && c <= '9' ) {
150
150
arg = atoi (& format [i ]);
151
-
151
+
152
152
while (format [i ] >= '0' && format [i ] <= '9' && i < formatlen ) {
153
153
i ++ ;
154
154
}
@@ -158,8 +158,8 @@ PHP_FUNCTION(pack)
158
158
/* Handle special arg '*' for all codes and check argv overflows */
159
159
switch ((int ) code ) {
160
160
/* Never uses any args */
161
- case 'x' :
162
- case 'X' :
161
+ case 'x' :
162
+ case 'X' :
163
163
case '@' :
164
164
if (arg < 0 ) {
165
165
php_error_docref (NULL TSRMLS_CC , E_WARNING , "Type %c: '*' ignored" , code );
@@ -168,9 +168,9 @@ PHP_FUNCTION(pack)
168
168
break ;
169
169
170
170
/* Always uses one arg */
171
- case 'a' :
172
- case 'A' :
173
- case 'h' :
171
+ case 'a' :
172
+ case 'A' :
173
+ case 'h' :
174
174
case 'H' :
175
175
if (currentarg >= num_args ) {
176
176
efree (argv );
@@ -192,20 +192,20 @@ PHP_FUNCTION(pack)
192
192
break ;
193
193
194
194
/* Use as many args as specified */
195
- case 'c' :
196
- case 'C' :
197
- case 's' :
198
- case 'S' :
199
- case 'i' :
195
+ case 'c' :
196
+ case 'C' :
197
+ case 's' :
198
+ case 'S' :
199
+ case 'i' :
200
200
case 'I' :
201
- case 'l' :
202
- case 'L' :
203
- case 'n' :
204
- case 'N' :
205
- case 'v' :
201
+ case 'l' :
202
+ case 'L' :
203
+ case 'n' :
204
+ case 'N' :
205
+ case 'v' :
206
206
case 'V' :
207
- case 'f' :
208
- case 'd' :
207
+ case 'f' :
208
+ case 'd' :
209
209
if (arg < 0 ) {
210
210
arg = num_args - currentarg ;
211
211
}
@@ -243,34 +243,34 @@ PHP_FUNCTION(pack)
243
243
int arg = formatargs [i ];
244
244
245
245
switch ((int ) code ) {
246
- case 'h' :
247
- case 'H' :
246
+ case 'h' :
247
+ case 'H' :
248
248
INC_OUTPUTPOS ((arg + (arg % 2 )) / 2 ,1 ) /* 4 bit per arg */
249
249
break ;
250
250
251
- case 'a' :
251
+ case 'a' :
252
252
case 'A' :
253
- case 'c' :
253
+ case 'c' :
254
254
case 'C' :
255
255
case 'x' :
256
256
INC_OUTPUTPOS (arg ,1 ) /* 8 bit per arg */
257
257
break ;
258
258
259
- case 's' :
260
- case 'S' :
261
- case 'n' :
259
+ case 's' :
260
+ case 'S' :
261
+ case 'n' :
262
262
case 'v' :
263
263
INC_OUTPUTPOS (arg ,2 ) /* 16 bit per arg */
264
264
break ;
265
265
266
- case 'i' :
266
+ case 'i' :
267
267
case 'I' :
268
268
INC_OUTPUTPOS (arg ,sizeof (int ))
269
269
break ;
270
270
271
- case 'l' :
272
- case 'L' :
273
- case 'N' :
271
+ case 'l' :
272
+ case 'L' :
273
+ case 'N' :
274
274
case 'V' :
275
275
INC_OUTPUTPOS (arg ,4 ) /* 32 bit per arg */
276
276
break ;
@@ -313,8 +313,8 @@ PHP_FUNCTION(pack)
313
313
zval * * val ;
314
314
315
315
switch ((int ) code ) {
316
- case 'a' :
317
- case 'A' :
316
+ case 'a' :
317
+ case 'A' :
318
318
memset (& output [outputpos ], (code == 'a' ) ? '\0' : ' ' , arg );
319
319
val = argv [currentarg ++ ];
320
320
if (Z_ISREF_PP (val )) {
@@ -326,7 +326,7 @@ PHP_FUNCTION(pack)
326
326
outputpos += arg ;
327
327
break ;
328
328
329
- case 'h' :
329
+ case 'h' :
330
330
case 'H' : {
331
331
int nibbleshift = (code == 'h' ) ? 0 : 4 ;
332
332
int first = 1 ;
@@ -372,17 +372,17 @@ PHP_FUNCTION(pack)
372
372
break ;
373
373
}
374
374
375
- case 'c' :
375
+ case 'c' :
376
376
case 'C' :
377
377
while (arg -- > 0 ) {
378
378
php_pack (argv [currentarg ++ ], 1 , byte_map , & output [outputpos ]);
379
379
outputpos ++ ;
380
380
}
381
381
break ;
382
382
383
- case 's' :
384
- case 'S' :
385
- case 'n' :
383
+ case 's' :
384
+ case 'S' :
385
+ case 'n' :
386
386
case 'v' : {
387
387
int * map = machine_endian_short_map ;
388
388
@@ -399,17 +399,17 @@ PHP_FUNCTION(pack)
399
399
break ;
400
400
}
401
401
402
- case 'i' :
403
- case 'I' :
402
+ case 'i' :
403
+ case 'I' :
404
404
while (arg -- > 0 ) {
405
405
php_pack (argv [currentarg ++ ], sizeof (int ), int_map , & output [outputpos ]);
406
406
outputpos += sizeof (int );
407
407
}
408
408
break ;
409
409
410
- case 'l' :
411
- case 'L' :
412
- case 'N' :
410
+ case 'l' :
411
+ case 'L' :
412
+ case 'N' :
413
413
case 'V' : {
414
414
int * map = machine_endian_long_map ;
415
415
@@ -503,7 +503,7 @@ static long php_unpack(char *data, int size, int issigned, int *map)
503
503
504
504
/* unpack() is based on Perl's unpack(), but is modified a bit from there.
505
505
* Rather than depending on error-prone ordered lists or syntactically
506
- * unpleasant pass-by-reference, we return an object with named parameters
506
+ * unpleasant pass-by-reference, we return an object with named parameters
507
507
* (like *_fetch_object()). Syntax is "f[repeat]name/...", where "f" is the
508
508
* formatter char (like pack()), "[repeat]" is the optional repeater argument,
509
509
* and "name" is the name of the variable to use.
@@ -576,51 +576,51 @@ PHP_FUNCTION(unpack)
576
576
577
577
switch ((int ) type ) {
578
578
/* Never use any input */
579
- case 'X' :
579
+ case 'X' :
580
580
size = -1 ;
581
581
break ;
582
582
583
583
case '@' :
584
584
size = 0 ;
585
585
break ;
586
586
587
- case 'a' :
587
+ case 'a' :
588
588
case 'A' :
589
589
size = arg ;
590
590
arg = 1 ;
591
591
break ;
592
592
593
- case 'h' :
594
- case 'H' :
593
+ case 'h' :
594
+ case 'H' :
595
595
size = (arg > 0 ) ? (arg + (arg % 2 )) / 2 : arg ;
596
596
arg = 1 ;
597
597
break ;
598
598
599
599
/* Use 1 byte of input */
600
- case 'c' :
600
+ case 'c' :
601
601
case 'C' :
602
602
case 'x' :
603
603
size = 1 ;
604
604
break ;
605
605
606
606
/* Use 2 bytes of input */
607
- case 's' :
608
- case 'S' :
609
- case 'n' :
607
+ case 's' :
608
+ case 'S' :
609
+ case 'n' :
610
610
case 'v' :
611
611
size = 2 ;
612
612
break ;
613
613
614
614
/* Use sizeof(int) bytes of input */
615
- case 'i' :
615
+ case 'i' :
616
616
case 'I' :
617
617
size = sizeof (int );
618
618
break ;
619
619
620
620
/* Use 4 bytes of input */
621
- case 'l' :
622
- case 'L' :
623
- case 'N' :
621
+ case 'l' :
622
+ case 'L' :
623
+ case 'N' :
624
624
case 'V' :
625
625
size = 4 ;
626
626
break ;
@@ -657,12 +657,13 @@ PHP_FUNCTION(unpack)
657
657
658
658
if (size != 0 && size != -1 && INT_MAX - size + 1 < inputpos ) {
659
659
php_error_docref (NULL TSRMLS_CC , E_WARNING , "Type %c: integer overflow" , type );
660
- inputpos = 0 ;
660
+ zval_dtor (return_value );
661
+ RETURN_FALSE ;
661
662
}
662
663
663
664
if ((inputpos + size ) <= inputlen ) {
664
665
switch ((int ) type ) {
665
- case 'a' :
666
+ case 'a' :
666
667
case 'A' : {
667
668
char pad = (type == 'a' ) ? '\0' : ' ' ;
668
669
int len = inputlen - inputpos ; /* Remaining string */
@@ -683,8 +684,8 @@ PHP_FUNCTION(unpack)
683
684
add_assoc_stringl (return_value , n , & input [inputpos ], len + 1 , 1 );
684
685
break ;
685
686
}
686
-
687
- case 'h' :
687
+
688
+ case 'h' :
688
689
case 'H' : {
689
690
int len = (inputlen - inputpos ) * 2 ; /* Remaining */
690
691
int nibbleshift = (type == 'h' ) ? 0 : 4 ;
@@ -695,9 +696,9 @@ PHP_FUNCTION(unpack)
695
696
/* If size was given take minimum of len and size */
696
697
if (size >= 0 && len > (size * 2 )) {
697
698
len = size * 2 ;
698
- }
699
+ }
699
700
700
- if (argb > 0 ) {
701
+ if (len > 0 && argb > 0 ) {
701
702
len -= argb % 2 ;
702
703
}
703
704
@@ -727,17 +728,17 @@ PHP_FUNCTION(unpack)
727
728
break ;
728
729
}
729
730
730
- case 'c' :
731
+ case 'c' :
731
732
case 'C' : {
732
733
int issigned = (type == 'c' ) ? (input [inputpos ] & 0x80 ) : 0 ;
733
734
long v = php_unpack (& input [inputpos ], 1 , issigned , byte_map );
734
735
add_assoc_long (return_value , n , v );
735
736
break ;
736
737
}
737
738
738
- case 's' :
739
- case 'S' :
740
- case 'n' :
739
+ case 's' :
740
+ case 'S' :
741
+ case 'n' :
741
742
case 'v' : {
742
743
long v ;
743
744
int issigned = 0 ;
@@ -756,7 +757,7 @@ PHP_FUNCTION(unpack)
756
757
break ;
757
758
}
758
759
759
- case 'i' :
760
+ case 'i' :
760
761
case 'I' : {
761
762
long v ;
762
763
int issigned = 0 ;
@@ -770,9 +771,9 @@ PHP_FUNCTION(unpack)
770
771
break ;
771
772
}
772
773
773
- case 'l' :
774
- case 'L' :
775
- case 'N' :
774
+ case 'l' :
775
+ case 'L' :
776
+ case 'N' :
776
777
case 'V' : {
777
778
int issigned = 0 ;
778
779
int * map = machine_endian_long_map ;
@@ -795,7 +796,7 @@ PHP_FUNCTION(unpack)
795
796
v |= php_unpack (& input [inputpos ], 4 , issigned , map );
796
797
if (sizeof (long ) > 4 ) {
797
798
if (type == 'l' ) {
798
- v = (signed int ) v ;
799
+ v = (signed int ) v ;
799
800
} else {
800
801
v = (unsigned int ) v ;
801
802
}
0 commit comments