@@ -120,7 +120,7 @@ static zend_always_inline unsigned char *neon_base64_encode(const unsigned char
120
120
}
121
121
#endif /* defined(__aarch64__) || defined(_M_ARM64) */
122
122
123
- static zend_always_inline unsigned char * php_base64_encode_impl (const unsigned char * in , size_t inl , unsigned char * out ) /* {{{ */
123
+ static zend_always_inline unsigned char * php_base64_encode_impl (const unsigned char * in , size_t inl , unsigned char * out , zend_long flags ) /* {{{ */
124
124
{
125
125
#if defined(__aarch64__ ) || defined(_M_ARM64 )
126
126
if (inl >= 16 * 3 ) {
@@ -147,11 +147,15 @@ static zend_always_inline unsigned char *php_base64_encode_impl(const unsigned c
147
147
if (inl > 1 ) {
148
148
* out ++ = base64_table [((in [0 ] & 0x03 ) << 4 ) + (in [1 ] >> 4 )];
149
149
* out ++ = base64_table [(in [1 ] & 0x0f ) << 2 ];
150
- * out ++ = base64_pad ;
150
+ if ((flags & PHP_BASE64_NO_PADDING ) == 0 ) {
151
+ * out ++ = base64_pad ;
152
+ }
151
153
} else {
152
154
* out ++ = base64_table [(in [0 ] & 0x03 ) << 4 ];
153
- * out ++ = base64_pad ;
154
- * out ++ = base64_pad ;
155
+ if ((flags & PHP_BASE64_NO_PADDING ) == 0 ) {
156
+ * out ++ = base64_pad ;
157
+ * out ++ = base64_pad ;
158
+ }
155
159
}
156
160
}
157
161
@@ -381,32 +385,32 @@ static zend_always_inline int php_base64_decode_impl(const unsigned char *in, si
381
385
# include "Zend/zend_cpuinfo.h"
382
386
383
387
# if BASE64_INTRIN_AVX512_FUNC_PROTO || BASE64_INTRIN_AVX512_FUNC_PTR
384
- ZEND_INTRIN_AVX512_FUNC_DECL (zend_string * php_base64_encode_avx512 (const unsigned char * str , size_t length ));
388
+ ZEND_INTRIN_AVX512_FUNC_DECL (zend_string * php_base64_encode_avx512 (const unsigned char * str , size_t length , zend_long flags ));
385
389
ZEND_INTRIN_AVX512_FUNC_DECL (zend_string * php_base64_decode_ex_avx512 (const unsigned char * str , size_t length , bool strict ));
386
390
# endif
387
391
# if BASE64_INTRIN_AVX512_VBMI_FUNC_PROTO || BASE64_INTRIN_AVX512_VBMI_FUNC_PTR
388
- ZEND_INTRIN_AVX512_VBMI_FUNC_DECL (zend_string * php_base64_encode_avx512_vbmi (const unsigned char * str , size_t length ));
392
+ ZEND_INTRIN_AVX512_VBMI_FUNC_DECL (zend_string * php_base64_encode_avx512_vbmi (const unsigned char * str , size_t length , zend_long flags ));
389
393
ZEND_INTRIN_AVX512_VBMI_FUNC_DECL (zend_string * php_base64_decode_ex_avx512_vbmi (const unsigned char * str , size_t length , bool strict ));
390
394
# endif
391
395
392
396
# if ZEND_INTRIN_AVX2_RESOLVER
393
- ZEND_INTRIN_AVX2_FUNC_DECL (zend_string * php_base64_encode_avx2 (const unsigned char * str , size_t length ));
397
+ ZEND_INTRIN_AVX2_FUNC_DECL (zend_string * php_base64_encode_avx2 (const unsigned char * str , size_t length , zend_long flags ));
394
398
ZEND_INTRIN_AVX2_FUNC_DECL (zend_string * php_base64_decode_ex_avx2 (const unsigned char * str , size_t length , bool strict ));
395
399
# endif
396
400
397
401
# if ZEND_INTRIN_SSSE3_RESOLVER
398
- ZEND_INTRIN_SSSE3_FUNC_DECL (zend_string * php_base64_encode_ssse3 (const unsigned char * str , size_t length ));
402
+ ZEND_INTRIN_SSSE3_FUNC_DECL (zend_string * php_base64_encode_ssse3 (const unsigned char * str , size_t length , zend_long flags ));
399
403
ZEND_INTRIN_SSSE3_FUNC_DECL (zend_string * php_base64_decode_ex_ssse3 (const unsigned char * str , size_t length , bool strict ));
400
404
# endif
401
405
402
- zend_string * php_base64_encode_default (const unsigned char * str , size_t length );
406
+ zend_string * php_base64_encode_default (const unsigned char * str , size_t length , zend_long flags );
403
407
zend_string * php_base64_decode_ex_default (const unsigned char * str , size_t length , bool strict );
404
408
405
409
# if (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO || BASE64_INTRIN_AVX512_FUNC_PROTO || BASE64_INTRIN_AVX512_VBMI_FUNC_PROTO )
406
- PHPAPI zend_string * php_base64_encode (const unsigned char * str , size_t length ) __attribute__((ifunc ("resolve_base64_encode" )));
410
+ PHPAPI zend_string * php_base64_encode_ex (const unsigned char * str , size_t length , zend_long flags ) __attribute__((ifunc ("resolve_base64_encode" )));
407
411
PHPAPI zend_string * php_base64_decode_ex (const unsigned char * str , size_t length , bool strict ) __attribute__((ifunc ("resolve_base64_decode" )));
408
412
409
- typedef zend_string * (* base64_encode_func_t )(const unsigned char * , size_t );
413
+ typedef zend_string * (* base64_encode_func_t )(const unsigned char * , size_t , zend_long flags );
410
414
typedef zend_string * (* base64_decode_func_t )(const unsigned char * , size_t , bool );
411
415
412
416
ZEND_NO_SANITIZE_ADDRESS
@@ -462,11 +466,11 @@ static base64_decode_func_t resolve_base64_decode(void) {
462
466
}
463
467
# else /* (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO) */
464
468
465
- PHPAPI zend_string * (* php_base64_encode_ptr )(const unsigned char * str , size_t length ) = NULL ;
469
+ PHPAPI zend_string * (* php_base64_encode_ptr )(const unsigned char * str , size_t length , zend_long flags ) = NULL ;
466
470
PHPAPI zend_string * (* php_base64_decode_ex_ptr )(const unsigned char * str , size_t length , bool strict ) = NULL ;
467
471
468
- PHPAPI zend_string * php_base64_encode (const unsigned char * str , size_t length ) {
469
- return php_base64_encode_ptr (str , length );
472
+ PHPAPI zend_string * php_base64_encode_ex (const unsigned char * str , size_t length , zend_long flags ) {
473
+ return php_base64_encode_ptr (str , length , flags );
470
474
}
471
475
PHPAPI zend_string * php_base64_decode_ex (const unsigned char * str , size_t length , bool strict ) {
472
476
return php_base64_decode_ex_ptr (str , length , strict );
@@ -508,7 +512,7 @@ PHP_MINIT_FUNCTION(base64_intrin)
508
512
#endif /* ZEND_INTRIN_AVX2_NATIVE */
509
513
510
514
#if BASE64_INTRIN_AVX512_VBMI_FUNC_PROTO || BASE64_INTRIN_AVX512_VBMI_FUNC_PTR
511
- zend_string * php_base64_encode_avx512_vbmi (const unsigned char * str , size_t length )
515
+ zend_string * php_base64_encode_avx512_vbmi (const unsigned char * str , size_t length , zend_long flags )
512
516
{
513
517
const unsigned char * c = str ;
514
518
unsigned char * o ;
@@ -545,7 +549,7 @@ zend_string *php_base64_encode_avx512_vbmi(const unsigned char *str, size_t leng
545
549
length -= 48 ;
546
550
}
547
551
548
- o = php_base64_encode_impl (c , length , o );
552
+ o = php_base64_encode_impl (c , length , o , flags );
549
553
550
554
ZSTR_LEN (result ) = (o - (unsigned char * )ZSTR_VAL (result ));
551
555
@@ -618,7 +622,7 @@ zend_string *php_base64_decode_ex_avx512_vbmi(const unsigned char *str, size_t l
618
622
#endif
619
623
620
624
#if BASE64_INTRIN_AVX512_FUNC_PROTO || BASE64_INTRIN_AVX512_FUNC_PTR
621
- zend_string * php_base64_encode_avx512 (const unsigned char * str , size_t length )
625
+ zend_string * php_base64_encode_avx512 (const unsigned char * str , size_t length , zend_long flags )
622
626
{
623
627
const unsigned char * c = str ;
624
628
unsigned char * o ;
@@ -665,7 +669,7 @@ zend_string *php_base64_encode_avx512(const unsigned char *str, size_t length)
665
669
length -= 48 ;
666
670
}
667
671
668
- o = php_base64_encode_impl (c , length , o );
672
+ o = php_base64_encode_impl (c , length , o , flags );
669
673
670
674
ZSTR_LEN (result ) = (o - (unsigned char * )ZSTR_VAL (result ));
671
675
@@ -900,11 +904,11 @@ static __m128i php_base64_encode_ssse3_translate(__m128i in)
900
904
901
905
#if ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_AVX2_RESOLVER || ZEND_INTRIN_SSSE3_NATIVE || ZEND_INTRIN_SSSE3_RESOLVER
902
906
# if ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_SSSE3_NATIVE
903
- PHPAPI zend_string * php_base64_encode (const unsigned char * str , size_t length )
907
+ PHPAPI zend_string * php_base64_encode_ex (const unsigned char * str , size_t length , zend_long flags )
904
908
# elif ZEND_INTRIN_AVX2_RESOLVER
905
- zend_string * php_base64_encode_avx2 (const unsigned char * str , size_t length )
909
+ zend_string * php_base64_encode_avx2 (const unsigned char * str , size_t length , zend_long flags )
906
910
# else /* ZEND_INTRIN_SSSE3_RESOLVER */
907
- zend_string * php_base64_encode_ssse3 (const unsigned char * str , size_t length )
911
+ zend_string * php_base64_encode_ssse3 (const unsigned char * str , size_t length , zend_long flags )
908
912
# endif
909
913
{
910
914
const unsigned char * c = str ;
@@ -938,15 +942,15 @@ zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length)
938
942
PHP_BASE64_ENCODE_SSSE3_LOOP ;
939
943
# endif
940
944
941
- o = php_base64_encode_impl (c , length , o );
945
+ o = php_base64_encode_impl (c , length , o , flags );
942
946
943
947
ZSTR_LEN (result ) = (o - (unsigned char * )ZSTR_VAL (result ));
944
948
945
949
return result ;
946
950
}
947
951
948
952
# if ZEND_INTRIN_SSSE3_RESOLVER && ZEND_INTRIN_AVX2_RESOLVER
949
- zend_string * php_base64_encode_ssse3 (const unsigned char * str , size_t length )
953
+ zend_string * php_base64_encode_ssse3 (const unsigned char * str , size_t length , zend_long flags )
950
954
{
951
955
const unsigned char * c = str ;
952
956
unsigned char * o ;
@@ -957,7 +961,7 @@ zend_string *php_base64_encode_ssse3(const unsigned char *str, size_t length)
957
961
958
962
PHP_BASE64_ENCODE_SSSE3_LOOP ;
959
963
960
- o = php_base64_encode_impl (c , length , o );
964
+ o = php_base64_encode_impl (c , length , o , flags );
961
965
962
966
ZSTR_LEN (result ) = (o - (unsigned char * )ZSTR_VAL (result ));
963
967
@@ -1180,9 +1184,9 @@ zend_string *php_base64_decode_ex_ssse3(const unsigned char *str, size_t length,
1180
1184
1181
1185
#if !ZEND_INTRIN_AVX2_NATIVE && !ZEND_INTRIN_SSSE3_NATIVE
1182
1186
#if ZEND_INTRIN_AVX2_RESOLVER || ZEND_INTRIN_SSSE3_RESOLVER
1183
- zend_string * php_base64_encode_default (const unsigned char * str , size_t length )
1187
+ zend_string * php_base64_encode_default (const unsigned char * str , size_t length , zend_long flags )
1184
1188
#else
1185
- PHPAPI zend_string * php_base64_encode (const unsigned char * str , size_t length )
1189
+ PHPAPI zend_string * php_base64_encode_ex (const unsigned char * str , size_t length , zend_long flags )
1186
1190
#endif
1187
1191
{
1188
1192
unsigned char * p ;
@@ -1191,7 +1195,7 @@ PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length)
1191
1195
result = zend_string_safe_alloc (((length + 2 ) / 3 ), 4 * sizeof (char ), 0 , 0 );
1192
1196
p = (unsigned char * )ZSTR_VAL (result );
1193
1197
1194
- p = php_base64_encode_impl (str , length , p );
1198
+ p = php_base64_encode_impl (str , length , p , flags );
1195
1199
1196
1200
ZSTR_LEN (result ) = (p - (unsigned char * )ZSTR_VAL (result ));
1197
1201
@@ -1229,12 +1233,15 @@ PHP_FUNCTION(base64_encode)
1229
1233
char * str ;
1230
1234
size_t str_len ;
1231
1235
zend_string * result ;
1236
+ bool padding = true;
1232
1237
1233
- ZEND_PARSE_PARAMETERS_START (1 , 1 )
1238
+ ZEND_PARSE_PARAMETERS_START (1 , 2 )
1234
1239
Z_PARAM_STRING (str , str_len )
1240
+ Z_PARAM_OPTIONAL
1241
+ Z_PARAM_BOOL (padding )
1235
1242
ZEND_PARSE_PARAMETERS_END ();
1236
1243
1237
- result = php_base64_encode ((unsigned char * )str , str_len );
1244
+ result = php_base64_encode_ex ((unsigned char * )str , str_len , ( padding ? 0 : PHP_BASE64_NO_PADDING ) );
1238
1245
RETURN_STR (result );
1239
1246
}
1240
1247
/* }}} */
0 commit comments