]> granicus.if.org Git - neomutt/commitdiff
tags: always pass correct buffer length
authorMehdi Abaakouk <sileht@sileht.net>
Fri, 15 Sep 2017 20:18:43 +0000 (22:18 +0200)
committerRichard Russon <rich@flatcap.org>
Tue, 3 Oct 2017 12:47:30 +0000 (13:47 +0100)
In notmuch editor we was passing sizeof(buf) with buf a char* with an
unknown allocated size.

In imap, we have assumed/hardcoded LONGSTRING. That's true, but we
should not do that.

edit_msg_tags() now takes the buflen as parameter so the root caller
can pass the size of the buffer.

curs_main.c
imap/imap.c
mutt_notmuch.c
mutt_tags.c
mutt_tags.h
mx.h

index d603c540057c64dcfddede751e4e253cae0ba9c3..7fdc873be5041dca8b011d50d80f1b5bc5b4beb5 100644 (file)
@@ -1867,7 +1867,7 @@ int mutt_index_menu(void)
         CHECK_VISIBLE;
         CHECK_READONLY;
 
-        rc = hdr_tags_editor(Context, tag ? NULL : hdr_tags_get_with_hidden(CURHDR), buf);
+        rc = hdr_tags_editor(Context, tag ? NULL : hdr_tags_get_with_hidden(CURHDR), buf, sizeof(buf));
         if (rc < 0)
           break;
         else if (rc == 0)
index c667dd5e0e98c69e96a1dc1fa396ccf665e67e91..8b719bbc82c4560722b569be42ababc2433057cb 100644 (file)
@@ -1264,7 +1264,7 @@ static int sync_helper(struct ImapData *idata, int right, int flag, const char *
  * @retval 0: no valid user input
  * @retval 1: buf set
  */
-static int imap_edit_message_tags(struct Context *ctx, const char *tags, char *buf)
+static int imap_edit_message_tags(struct Context *ctx, const char *tags, char *buf, size_t buflen)
 {
   char *new = NULL;
   char *checker = NULL;
@@ -1279,9 +1279,9 @@ static int imap_edit_message_tags(struct Context *ctx, const char *tags, char *b
 
   *buf = '\0';
   if (tags)
-    strncpy(buf, tags, LONG_STRING);
+    strncpy(buf, tags, buflen);
 
-  if (mutt_get_field("Keywords: ", buf, LONG_STRING, 0) != 0)
+  if (mutt_get_field("Keywords: ", buf, buflen, 0) != 0)
     return -1;
 
   /* each keyword must be atom defined by rfc822 as:
index d172836100cab2aa113897533e0a700c0c5f1b9a..83171924c343c8a4510d41aa514ec0740e3ba380 100644 (file)
@@ -1849,10 +1849,10 @@ void nm_query_window_backward(void)
   mutt_debug(2, "nm_query_window_backward (%d)\n", NmQueryWindowCurrentPosition);
 }
 
-static int nm_edit_message_tags(struct Context *ctx, const char *tags, char *buf)
+static int nm_edit_message_tags(struct Context *ctx, const char *tags, char *buf, size_t buflen)
 {
   *buf = '\0';
-  return (mutt_get_field("Add/remove labels: ", buf, sizeof(buf), MUTT_NM_TAG) || !*buf);
+  return (mutt_get_field("Add/remove labels: ", buf, buflen, MUTT_NM_TAG) || !*buf);
 }
 
 static int nm_commit_message_tags(struct Context *ctx, struct Header *hdr, char *buf)
index ea90bf9e3bd5771080ed026bae6f0e3c89c90529..ef14ff67e9cee75c97a3d97e4081f721437595f1 100644 (file)
@@ -224,10 +224,10 @@ int hdr_tags_replace(struct Header *h, char *tags)
   return 1;
 }
 
-int hdr_tags_editor(struct Context *ctx, const char *tags, char *buf)
+int hdr_tags_editor(struct Context *ctx, const char *tags, char *buf, size_t buflen)
 {
   if (ctx->mx_ops->edit_msg_tags)
-    return ctx->mx_ops->edit_msg_tags(ctx, tags, buf);
+    return ctx->mx_ops->edit_msg_tags(ctx, tags, buf, buflen);
 
   mutt_message(_("Folder doesn't support tagging, aborting."));
   return -1;
index b3b1e16d0b42875a8f889f94b75f4ce818b5ab86..45ca72773db406b3f6bcc478cdf5a3e6e55009a2 100644 (file)
@@ -66,7 +66,7 @@ const char *hdr_tags_get_transformed_for(char *name, struct Header *h);
 void hdr_tags_init(struct Header *h);
 void hdr_tags_add(struct Header *h, char *new_tag);
 int hdr_tags_replace(struct Header *h, char *tags);
-int hdr_tags_editor(struct Context *ctx, const char *tags, char *buf);
+int hdr_tags_editor(struct Context *ctx, const char *tags, char *buf, size_t buflen);
 int hdr_tags_commit(struct Context *ctx, struct Header *h, char *tags);
 
 #endif /* _MUTT_TAG_H */
diff --git a/mx.h b/mx.h
index 6e91e17f23ce30f242f10b07e30a32e919594a48..a4fb157f8943cf69aa69b2107f900fe771a36ada 100644 (file)
--- a/mx.h
+++ b/mx.h
@@ -63,7 +63,7 @@ struct MxOps
   int (*close_msg)(struct Context *ctx, struct Message *msg);
   int (*commit_msg)(struct Context *ctx, struct Message *msg);
   int (*open_new_msg)(struct Message *msg, struct Context *ctx, struct Header *hdr);
-  int (*edit_msg_tags)(struct Context *ctx, const char *tags, char *buf);
+  int (*edit_msg_tags)(struct Context *ctx, const char *tags, char *buf, size_t buflen);
   int (*commit_msg_tags)(struct Context *msg, struct Header *hdr, char *buf);
 };