]> granicus.if.org Git - php/commitdiff
Avoding memory allocation if no translastion found
authorXinchen Hui <laruence@gmail.com>
Mon, 26 Feb 2018 06:52:45 +0000 (14:52 +0800)
committerXinchen Hui <laruence@gmail.com>
Mon, 26 Feb 2018 06:52:45 +0000 (14:52 +0800)
ext/gettext/gettext.c

index d6b0f0898656947dbc0001ea375999bdf69d2e28..98a1552067feb2fde505e78a7a8c8463b17fceb5 100644 (file)
@@ -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);