Fix recursion on dns_again_means_nonexist. Bug 2911
[exim.git] / src / src / rfc2047.c
index f7085007a8df5ecf10b7fde81b4c8b86bc9124fd..c40518a5d340b91be1979d4a172597703c988c76 100644 (file)
@@ -2,8 +2,10 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
+/* Copyright (c) The Exim Maintainers 2020 - 2022 */
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
 
 /* This file contains a function for decoding message header lines that may
 contain encoded "words" according to the rules described in
 
 /* This file contains a function for decoding message header lines that may
 contain encoded "words" according to the rules described in
@@ -46,7 +48,7 @@ rfc2047_qpdecode(uschar *string, uschar **ptrptr)
 int len = 0;
 uschar *ptr;
 
 int len = 0;
 uschar *ptr;
 
-ptr = *ptrptr = store_get(Ustrlen(string) + 1, is_tainted(string));  /* No longer than this */
+ptr = *ptrptr = store_get(Ustrlen(string) + 1, string);  /* No longer than this */
 
 while (*string != 0)
   {
 
 while (*string != 0)
   {
@@ -185,8 +187,8 @@ Returns:         the decoded, converted string, or NULL on error; if there are
 */
 
 uschar *
 */
 
 uschar *
-rfc2047_decode2(uschar *string, BOOL lencheck, uschar *target, int zeroval,
-  int *lenptr, int *sizeptr, uschar **error)
+rfc2047_decode2(uschar *string, BOOL lencheck, const uschar *target,
+  int zeroval, int *lenptr, int *sizeptr, uschar **error)
 {
 int size = Ustrlen(string);
 size_t dlen;
 {
 int size = Ustrlen(string);
 size_t dlen;
@@ -208,7 +210,7 @@ building the result as we go. The result may be longer than the input if it is
 translated into a multibyte code such as UTF-8. That's why we use the dynamic
 string building code. */
 
 translated into a multibyte code such as UTF-8. That's why we use the dynamic
 string building code. */
 
-yield = store_get(sizeof(gstring) + ++size, is_tainted(string));
+yield = store_get(sizeof(gstring) + ++size, string);
 yield->size = size;
 yield->ptr = 0;
 yield->s = US(yield + 1);
 yield->size = size;
 yield->ptr = 0;
 yield->s = US(yield + 1);
@@ -233,17 +235,11 @@ while (mimeword)
 
   #if HAVE_ICONV
   *q1 = 0;
 
   #if HAVE_ICONV
   *q1 = 0;
-  if (target != NULL && strcmpic(target, mimeword+2) != 0)
-    {
-    icd = iconv_open(CS target, CS(mimeword+2));
-
-    if (icd == (iconv_t)(-1))
-      {
+  if (target && strcmpic(target, mimeword+2) != 0)
+    if ((icd = iconv_open(CS target, CS(mimeword+2))) == (iconv_t)-1)
       *error = string_sprintf("iconv_open(\"%s\", \"%s\") failed: %s%s",
         target, mimeword+2, strerror(errno),
         (errno == EINVAL)? " (maybe unsupported conversion)" : "");
       *error = string_sprintf("iconv_open(\"%s\", \"%s\") failed: %s%s",
         target, mimeword+2, strerror(errno),
         (errno == EINVAL)? " (maybe unsupported conversion)" : "");
-      }
-    }
   *q1 = '?';
   #endif
 
   *q1 = '?';
   #endif
 
@@ -341,7 +337,7 @@ return string_from_gstring(yield);
 argument. */
 
 uschar *
 argument. */
 
 uschar *
-rfc2047_decode(uschar *string, BOOL lencheck, uschar *target, int zeroval,
+rfc2047_decode(uschar *string, BOOL lencheck, const uschar *target, int zeroval,
   int *lenptr, uschar **error)
 {
 return rfc2047_decode2(string, lencheck, target, zeroval, lenptr, NULL, error);
   int *lenptr, uschar **error)
 {
 return rfc2047_decode2(string, lencheck, target, zeroval, lenptr, NULL, error);