]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm dump: Don't truncate dovecot.index.cache values at NULs
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 21 Apr 2018 12:41:44 +0000 (15:41 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 23 Apr 2018 10:32:34 +0000 (13:32 +0300)
src/doveadm/doveadm-dump-index.c

index 58a1b3e372876bbe03f5f2774182a9e741662796..9abc535c794c1ad4ac7995005467b709e2ef923f 100644 (file)
@@ -509,13 +509,23 @@ dump_cache_mime_parts(string_t *str, const void *data, unsigned int size)
        dump_message_part(str, part);
 }
 
+static void
+dump_cache_append_string(string_t *str, const unsigned char *data,
+                        unsigned int size)
+{
+       /* cached strings end with NUL */
+       if (size > 0 && data[size-1] == '\0')
+               size--;
+       str_append_data(str, data, size);
+}
+
 static void
 dump_cache_snippet(string_t *str, const unsigned char *data, unsigned int size)
 {
        if (size == 0)
                return;
        str_printfa(str, " (version=%u: ", data[0]);
-       str_append_n(str, data+1, size-1);
+       dump_cache_append_string(str, data+1, size-1);
        str_append_c(str, ')');
 }
 
@@ -567,8 +577,7 @@ static void dump_cache(struct mail_cache_view *cache_view, unsigned int seq)
                                dump_cache_snippet(str, data, size);
                        break;
                case MAIL_CACHE_FIELD_STRING:
-                       if (size > 0)
-                               str_printfa(str, "%.*s", (int)size, (const char *)data);
+                       dump_cache_append_string(str, data, size);
                        break;
                case MAIL_CACHE_FIELD_HEADER: {
                        const uint32_t *lines = data;
@@ -608,7 +617,8 @@ static void dump_cache(struct mail_cache_view *cache_view, unsigned int seq)
                        break;
                }
 
-               printf("%s\n", str_c(str));
+               fwrite(str_data(str), 1, str_len(str), stdout);
+               putchar('\n');
        }
        if (ret < 0)
                printf(" - broken cache\n");