]> granicus.if.org Git - php/commitdiff
Support uuencoding empty string
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 22 Sep 2020 10:39:39 +0000 (12:39 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 22 Sep 2020 10:39:39 +0000 (12:39 +0200)
Cross checking implementations from other languages, empty strings
are always allowed. PHP's output is peculiar due to it's insistence
to encode a trailing \0, but otherwise sensible and does round-trip
as expected.

ext/opcache/Optimizer/zend_func_info.c
ext/standard/basic_functions.stub.php
ext/standard/basic_functions_arginfo.h
ext/standard/tests/strings/uuencode.phpt
ext/standard/uuencode.c

index 0ae34307e5fec59e9deb89cbe89650e31313ec48..e3a258802875bd29b7913257e80f0923aaf8f3c1 100644 (file)
@@ -213,7 +213,7 @@ static const func_info_t func_infos[] = {
        F1("base64_encode",                MAY_BE_STRING),
        F1("password_hash",                MAY_BE_STRING),
        F1("password_get_info",            MAY_BE_NULL | MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_STRING | MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_ARRAY_OF_ARRAY),
-       F1("convert_uuencode",             MAY_BE_FALSE | MAY_BE_STRING),
+       F1("convert_uuencode",             MAY_BE_STRING),
        F1("convert_uudecode",             MAY_BE_FALSE | MAY_BE_STRING),
        F1("pow",                          MAY_BE_LONG | MAY_BE_DOUBLE | MAY_BE_OBJECT),
        F1("decbin",                       MAY_BE_STRING),
index 03615f3bdb5e608c41603d5b1c2184228f12a7ec..0bc7bd8aef7548b9d1459d60141cd28e0afc009d 100755 (executable)
@@ -1465,7 +1465,7 @@ function stream_filter_register(string $filtername, string $classname): bool {}
 
 /* uuencode.c */
 
-function convert_uuencode(string $data): string|false {}
+function convert_uuencode(string $data): string {}
 
 function convert_uudecode(string $data): string|false {}
 
index 01292812d295a2cb55407fddd777fd2b37ee4184..6aff74adcfd3a58e74722093624e530026761c8a 100644 (file)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 621176b0f79f4fcb833c6be568adb2070239cce1 */
+ * Stub hash: 3c02183529eed2eb21d801ed2ba615deaf749b1d */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
        ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -2158,7 +2158,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_register, 0, 2, _I
        ZEND_ARG_TYPE_INFO(0, classname, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
-#define arginfo_convert_uuencode arginfo_hex2bin
+#define arginfo_convert_uuencode arginfo_bin2hex
 
 #define arginfo_convert_uudecode arginfo_hex2bin
 
index b0a2a2321d02508dee6949140e2b51bfea0a6635..d03c2b1bf0f37ecf410d076ea6fb90c7d8cf8090 100644 (file)
@@ -3,20 +3,22 @@ uuencode family tests
 --FILE--
 <?php
 
-var_dump(convert_uuencode(""));
-var_dump(convert_uudecode(""));
+var_dump($enc = convert_uuencode(""));
+var_dump(convert_uudecode($enc));
 var_dump($enc = convert_uuencode("~!@#$%^&*()_}{POIUYTREWQQSDFGHJKL:<MNBVCXZ"));
 var_dump(convert_uudecode("!@#$%^YUGFDFGHJKLUYTFBNMLOYT"));
 var_dump(convert_uudecode($enc));
 var_dump($enc = convert_uuencode("not very sophisticated"));
 var_dump(convert_uudecode($enc));
+var_dump(convert_uudecode(""));
 var_dump(convert_uudecode(substr($enc, 0, -10)));
 
 echo "Done\n";
 ?>
 --EXPECTF--
-bool(false)
-bool(false)
+string(2) "`
+"
+string(0) ""
 string(60) "J?B%`(R0E7B8J*"E??7M03TE5651215=145-$1D=(2DM,.CQ-3D)60UA:
 `
 "
@@ -27,6 +29,9 @@ string(36) "6;F]T('9E<GD@<V]P:&ES=&EC871E9```
 "
 string(22) "not very sophisticated"
 
+Warning: convert_uudecode(): Argument #1 ($data) is not a valid uuencoded string in %s on line %d
+bool(false)
+
 Warning: convert_uudecode(): Argument #1 ($data) is not a valid uuencoded string in %s on line %d
 bool(false)
 Done
index c11668b3a778bf40a4b5446289fd682394a5f888..7543521839116fc339cac7ee54bda2b60fbc5323 100644 (file)
@@ -133,6 +133,10 @@ PHPAPI zend_string *php_uudecode(const char *src, size_t src_len) /* {{{ */
        const char *s, *e, *ee;
        zend_string *dest;
 
+       if (src_len == 0) {
+               return NULL;
+       }
+
        dest = zend_string_alloc((size_t) ceil(src_len * 0.75), 0);
        p = ZSTR_VAL(dest);
        s = src;
@@ -204,7 +208,6 @@ PHP_FUNCTION(convert_uuencode)
        ZEND_PARSE_PARAMETERS_START(1, 1)
                Z_PARAM_STR(src)
        ZEND_PARSE_PARAMETERS_END();
-       if (ZSTR_LEN(src) < 1) { RETURN_FALSE; }
 
        RETURN_STR(php_uuencode(ZSTR_VAL(src), ZSTR_LEN(src)));
 }
@@ -219,7 +222,6 @@ PHP_FUNCTION(convert_uudecode)
        ZEND_PARSE_PARAMETERS_START(1, 1)
                Z_PARAM_STR(src)
        ZEND_PARSE_PARAMETERS_END();
-       if (ZSTR_LEN(src) < 1) { RETURN_FALSE; }
 
        if ((dest = php_uudecode(ZSTR_VAL(src), ZSTR_LEN(src))) == NULL) {
                php_error_docref(NULL, E_WARNING, "Argument #1 ($data) is not a valid uuencoded string");