string handling: strlen for gstring
authorJeremy Harris <jgh146exb@wizmail.org>
Sun, 12 Jan 2020 14:52:00 +0000 (14:52 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 12 Jan 2020 14:52:00 +0000 (14:52 +0000)
src/src/acl.c
src/src/arc.c
src/src/expand.c
src/src/functions.h

index 3166069baa46f7701addccad36a44e9f12cb5562..13cda1ab479865f1b1a78bc1e83e55307dd96fe2 100644 (file)
@@ -1022,8 +1022,8 @@ for (p = q; *p; p = q)
   if (!*hptr)
     {
     /* The header_line struct itself is not tainted, though it points to
   if (!*hptr)
     {
     /* The header_line struct itself is not tainted, though it points to
-    tainted data. */
-    header_line *h = store_get(sizeof(header_line), FALSE);
+    possibly tainted data. */
+    header_line * h = store_get(sizeof(header_line), FALSE);
     h->text = hdr;
     h->next = NULL;
     h->type = newtype;
     h->text = hdr;
     h->next = NULL;
     h->type = newtype;
index 94365498f1f35bc06f112146f6334095f118c299..b453e171cc74d483f3b602579798e3984f14c21a 100644 (file)
@@ -1192,7 +1192,7 @@ static gstring *
 arc_sign_append_aar(gstring * g, arc_ctx * ctx,
   const uschar * identity, int instance, blob * ar)
 {
 arc_sign_append_aar(gstring * g, arc_ctx * ctx,
   const uschar * identity, int instance, blob * ar)
 {
-int aar_off = g ? g->ptr : 0;
+int aar_off = gstring_length(g);
 arc_set * as =
   store_get(sizeof(arc_set) + sizeof(arc_line) + sizeof(header_line), FALSE);
 arc_line * al = (arc_line *)(as+1);
 arc_set * as =
   store_get(sizeof(arc_set) + sizeof(arc_line) + sizeof(header_line), FALSE);
 arc_line * al = (arc_line *)(as+1);
index 55aaf53cab2c49e5bb745a6fc1552f8ba053e068..7986bbd141c570915d58de06bc73b5f7c9484685 100644 (file)
@@ -1630,8 +1630,8 @@ for (header_line * h = header_list; h; h = h->next)
 
       /* Trim the header roughly if we're approaching limits */
       inc = t - s;
 
       /* Trim the header roughly if we're approaching limits */
       inc = t - s;
-      if ((g ? g->ptr : 0) + inc > header_insert_maxlen)
-       inc = header_insert_maxlen - (g ? g->ptr : 0);
+      if (gstring_length(g) + inc > header_insert_maxlen)
+       inc = header_insert_maxlen - gstring_length(g);
 
       /* For raw just copy the data; for a list, add the data as a colon-sep
       list-element; for comma-list add as an unchecked comma,newline sep
 
       /* For raw just copy the data; for a list, add the data as a colon-sep
       list-element; for comma-list add as an unchecked comma,newline sep
@@ -1643,17 +1643,12 @@ for (header_line * h = header_list; h; h = h->next)
       if (flags & FH_WANT_LIST)
         g = string_append_listele_n(g, ':', s, (unsigned)inc);
       else if (flags & FH_WANT_RAW)
       if (flags & FH_WANT_LIST)
         g = string_append_listele_n(g, ':', s, (unsigned)inc);
       else if (flags & FH_WANT_RAW)
-       {
        g = string_catn(g, s, (unsigned)inc);
        g = string_catn(g, s, (unsigned)inc);
-       (void) string_from_gstring(g);
-       }
       else if (inc > 0)
       else if (inc > 0)
-       if (comma)
-         g = string_append2_listele_n(g, US",\n", s, (unsigned)inc);
-       else
-         g = string_append2_listele_n(g, US"\n", s, (unsigned)inc);
+       g = string_append2_listele_n(g, comma ? US",\n" : US"\n",
+         s, (unsigned)inc);
 
 
-      if (g && g->ptr >= header_insert_maxlen) break;
+      if (gstring_length(g) >= header_insert_maxlen) break;
       }
 
 if (!found) return NULL;       /* No header found */
       }
 
 if (!found) return NULL;       /* No header found */
@@ -1663,7 +1658,7 @@ if (!g) return US"";
 
 *newsize = g->size;
 if (flags & FH_WANT_RAW)
 
 *newsize = g->size;
 if (flags & FH_WANT_RAW)
-  return g->s;
+  return string_from_gstring(g);
 
 /* Otherwise do RFC 2047 decoding, translating the charset if requested.
 The rfc2047_decode2() function can return an error with decoded data if the
 
 /* Otherwise do RFC 2047 decoding, translating the charset if requested.
 The rfc2047_decode2() function can return an error with decoded data if the
@@ -1671,16 +1666,12 @@ charset translation fails. If decoding fails, it returns NULL. */
 
 else
   {
 
 else
   {
-  uschar *decoded, *error;
-
-  decoded = rfc2047_decode2(g->s, check_rfc2047_length, charset, '?', NULL,
-    newsize, &error);
+  uschar * error, * decoded = rfc2047_decode2(string_from_gstring(g),
+    check_rfc2047_length, charset, '?', NULL, newsize, &error);
   if (error)
   if (error)
-    {
     DEBUG(D_any) debug_printf("*** error in RFC 2047 decoding: %s\n"
       "    input was: %s\n", error, g->s);
     DEBUG(D_any) debug_printf("*** error in RFC 2047 decoding: %s\n"
       "    input was: %s\n", error, g->s);
-    }
-  return decoded ? decoded : g->s;
+  return decoded ? decoded : string_from_gstring(g);
   }
 }
 
   }
 }
 
index fe15cc573251b6ca2fa3a21bce8b77a2608d3a5e..7677a3cd95e390e4ac32252477b40c94d6945aa3 100644 (file)
@@ -820,6 +820,12 @@ g->s[g->ptr] = '\0';
 return g->s;
 }
 
 return g->s;
 }
 
+static inline unsigned
+gstring_length(const gstring * g)
+{
+return g ? (unsigned)g->ptr : 0;
+}
+
 
 #define gstring_release_unused(g) \
        gstring_release_unused_trc(g, __FUNCTION__, __LINE__)
 
 #define gstring_release_unused(g) \
        gstring_release_unused_trc(g, __FUNCTION__, __LINE__)