From: Xinchen Hui Date: Mon, 26 Feb 2018 06:52:45 +0000 (+0800) Subject: Avoding memory allocation if no translastion found X-Git-Tag: php-7.3.0alpha1~301 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce3fa9202796fc0a6e0ec8274348fb4285982551;p=php Avoding memory allocation if no translastion found --- diff --git a/ext/gettext/gettext.c b/ext/gettext/gettext.c index d6b0f08986..98a1552067 100644 --- a/ext/gettext/gettext.c +++ b/ext/gettext/gettext.c @@ -138,7 +138,7 @@ ZEND_GET_MODULE(php_gettext) #define PHP_GETTEXT_MAX_DOMAIN_LENGTH 1024 #define PHP_GETTEXT_MAX_MSGID_LENGTH 4096 -#define PHP_GETTEXT_DOMAIN_LENGTH_CHECK \ +#define PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) \ if (UNEXPECTED(domain_len > PHP_GETTEXT_MAX_DOMAIN_LENGTH)) { \ php_error_docref(NULL, E_WARNING, "domain passed too long"); \ RETURN_FALSE; \ @@ -168,7 +168,7 @@ PHP_NAMED_FUNCTION(zif_textdomain) return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) if (domain != NULL && strcmp(domain, "") && strcmp(domain, "0")) { domain_name = domain; @@ -196,7 +196,11 @@ PHP_NAMED_FUNCTION(zif_gettext) PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid)) msgstr = gettext(ZSTR_VAL(msgid)); - RETURN_STRING(msgstr); + if (msgstr != ZSTR_VAL(msgid)) { + RETURN_STRING(msgstr); + } else { + RETURN_STR_COPY(msgid); + } } /* }}} */ @@ -204,19 +208,23 @@ PHP_NAMED_FUNCTION(zif_gettext) Return the translation of msgid for domain_name, or msgid unaltered if a translation does not exist */ PHP_NAMED_FUNCTION(zif_dgettext) { - char *domain, *msgid, *msgstr; - size_t domain_len, msgid_len; + char *msgstr; + zend_string *domain, *msgid; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &domain, &domain_len, &msgid, &msgid_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &domain, &msgid) == FAILURE) { return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK - PHP_GETTEXT_LENGTH_CHECK("msgid", msgid_len) + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(ZSTR_LEN(domain)) + PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid)) - msgstr = dgettext(domain, msgid); + msgstr = dgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid)); - RETURN_STRING(msgstr); + if (msgstr != ZSTR_VAL(msgid)) { + RETURN_STRING(msgstr); + } else { + RETURN_STR_COPY(msgid); + } } /* }}} */ @@ -224,20 +232,24 @@ PHP_NAMED_FUNCTION(zif_dgettext) Return the translation of msgid for domain_name and category, or msgid unaltered if a translation does not exist */ PHP_NAMED_FUNCTION(zif_dcgettext) { - char *domain, *msgid, *msgstr; - size_t domain_len, msgid_len; + char *msgstr; + zend_string *domain, *msgid; zend_long category; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssl", &domain, &domain_len, &msgid, &msgid_len, &category) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SSl", &domain, &msgid, &category) == FAILURE) { return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK - PHP_GETTEXT_LENGTH_CHECK("msgid", msgid_len) + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(ZSTR_LEN(domain)) + PHP_GETTEXT_LENGTH_CHECK("msgid", ZSTR_LEN(msgid)) - msgstr = dcgettext(domain, msgid, category); + msgstr = dcgettext(ZSTR_VAL(domain), ZSTR_VAL(msgid), category); - RETURN_STRING(msgstr); + if (msgstr != ZSTR_VAL(msgid)) { + RETURN_STRING(msgstr); + } else { + RETURN_STR_COPY(msgid); + } } /* }}} */ @@ -253,7 +265,7 @@ PHP_NAMED_FUNCTION(zif_bindtextdomain) return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) if (domain[0] == '\0') { php_error(E_WARNING, "The first parameter of bindtextdomain must not be empty"); @@ -291,9 +303,9 @@ PHP_NAMED_FUNCTION(zif_ngettext) PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len) msgstr = ngettext(msgid1, msgid2, count); - if (msgstr) { - RETVAL_STRING(msgstr); - } + + ZEND_ASSERT(msgstr); + RETURN_STRING(msgstr); } /* }}} */ #endif @@ -312,14 +324,14 @@ PHP_NAMED_FUNCTION(zif_dngettext) return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len) PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len) msgstr = dngettext(domain, msgid1, msgid2, count); - if (msgstr) { - RETVAL_STRING(msgstr); - } + + ZEND_ASSERT(msgstr); + RETURN_STRING(msgstr); } /* }}} */ #endif @@ -340,15 +352,14 @@ PHP_NAMED_FUNCTION(zif_dcngettext) return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) PHP_GETTEXT_LENGTH_CHECK("msgid1", msgid1_len) PHP_GETTEXT_LENGTH_CHECK("msgid2", msgid2_len) msgstr = dcngettext(domain, msgid1, msgid2, count, category); - if (msgstr) { - RETVAL_STRING(msgstr); - } + ZEND_ASSERT(msgstr); + RETURN_STRING(msgstr); } /* }}} */ #endif @@ -366,7 +377,7 @@ PHP_NAMED_FUNCTION(zif_bind_textdomain_codeset) return; } - PHP_GETTEXT_DOMAIN_LENGTH_CHECK + PHP_GETTEXT_DOMAIN_LENGTH_CHECK(domain_len) retval = bind_textdomain_codeset(domain, codeset);