On Thu, Feb 12, 2026 at 11:56:19PM +0100, Alejandro Colomar via Mutt-dev wrote:
This avoids an explicit size multiplication, which can overflow the
calculation.

My concern is the conversation in the other thread about wc support, and portability, and --without-wc-funcs. Otherwise this looks fine.

diff --git a/enter.c b/enter.c
index 54e81178b3c5..ba8b9963659c 100644
--- a/enter.c
+++ b/enter.c
@@ -29,6 +29,7 @@
#include "buffy.h"

#include <string.h>
+#include <wchar.h>

In mutt, this is already covered by #include "mutt.h".

/* redraw flags for mutt_enter_string() */
enum
@@ -175,7 +176,7 @@ static void replace_part (ENTER_STATE *state, size_t from, 
char *buf)
  if (savelen)
  {
    savebuf = safe_calloc (savelen, sizeof (wchar_t));
-    memcpy (savebuf, state->wbuf + state->curpos, savelen * sizeof (wchar_t));
+    wmemcpy (savebuf, state->wbuf + state->curpos, savelen);
  }

  /* Convert to wide characters */
@@ -191,7 +192,7 @@ static void replace_part (ENTER_STATE *state, size_t from, 
char *buf)
    }

    /* Restore suffix */
-    memcpy (state->wbuf + state->curpos, savebuf, savelen * sizeof (wchar_t));
+    wmemcpy (state->wbuf + state->curpos, savebuf, savelen);
    FREE (&savebuf);
  }

@@ -392,7 +393,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
              --i;
            if (i)
              --i;
-            memmove (state->wbuf + i, state->wbuf + state->curpos, 
(state->lastchar - state->curpos) * sizeof (wchar_t));
+            wmemmove (state->wbuf + i, state->wbuf + state->curpos, 
state->lastchar - state->curpos);
            state->lastchar -= state->curpos - i;
            state->curpos = i;
          }
@@ -499,7 +500,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
              ++i;
            while (i < state->lastchar && COMB_CHAR (state->wbuf[i]))
              ++i;
-            memmove (state->wbuf + state->curpos, state->wbuf + i, 
(state->lastchar - i) * sizeof (wchar_t));
+            wmemmove (state->wbuf + state->curpos, state->wbuf + i, 
state->lastchar - i);
            state->lastchar -= i - state->curpos;
          }
          break;
@@ -521,8 +522,8 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
              else
                --i;
            }
-            memmove (state->wbuf + i, state->wbuf + state->curpos,
-                     (state->lastchar - state->curpos) * sizeof (wchar_t));
+            wmemmove (state->wbuf + i, state->wbuf + state->curpos,
+                      state->lastchar - state->curpos);
            state->lastchar += i - state->curpos;
            state->curpos = i;
          }
@@ -553,8 +554,8 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
            }
          }

-          memmove (state->wbuf + state->curpos, state->wbuf + i,
-                   (state->lastchar - i) * sizeof (wchar_t));
+          wmemmove (state->wbuf + state->curpos, state->wbuf + i,
+                    state->lastchar - i);
          state->lastchar += state->curpos - i;
          break;

@@ -580,7 +581,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
              ;
            my_wcstombs (buf, buflen, state->wbuf + i, state->curpos - i);
            if (tempbuf && templen == state->lastchar - i &&
-                !memcmp (tempbuf, state->wbuf + i, (state->lastchar - i) * 
sizeof (wchar_t)))
+                !wmemcmp (tempbuf, state->wbuf + i, state->lastchar - i))
            {
              mutt_select_file (buf, buflen, 0);
              if (*buf)
@@ -593,7 +594,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
              templen = state->lastchar - i;
              safe_realloc (&tempbuf, templen * sizeof (wchar_t));
              if (tempbuf)
-                memcpy (tempbuf, state->wbuf + i, templen * sizeof (wchar_t));
+                wmemcpy (tempbuf, state->wbuf + i, templen);
            }
            else
              BEEP ();
@@ -722,7 +723,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
            /* see if the path has changed from the last time */
            if ((!tempbuf && !state->lastchar) ||
                (tempbuf && templen == state->lastchar &&
-                 !memcmp (tempbuf, state->wbuf, state->lastchar * sizeof 
(wchar_t))))
+                 !wmemcmp (tempbuf, state->wbuf, state->lastchar)))
            {
              _mutt_select_file (buf, buflen,
                                 ((flags & MUTT_MAILBOX) ? MUTT_SEL_MAILBOX : 
0) | (multiple ? MUTT_SEL_MULTI : 0),
@@ -751,7 +752,7 @@ int _mutt_enter_string (char *buf, size_t buflen, int col,
              templen = state->lastchar;
              safe_realloc (&tempbuf, templen * sizeof (wchar_t));
              if (tempbuf)
-                memcpy (tempbuf, state->wbuf, templen * sizeof (wchar_t));
+                wmemcpy (tempbuf, state->wbuf, templen);
            }
            else
              BEEP (); /* let the user know that nothing matched */
@@ -875,7 +876,7 @@ self_insert:
          state->wbuflen = state->lastchar + 20;
          safe_realloc (&state->wbuf, state->wbuflen * sizeof (wchar_t));
        }
-        memmove (state->wbuf + state->curpos + 1, state->wbuf + state->curpos, 
(state->lastchar - state->curpos) * sizeof (wchar_t));
+        wmemmove (state->wbuf + state->curpos + 1, state->wbuf + state->curpos, 
state->lastchar - state->curpos);
        state->wbuf[state->curpos++] = wc;
        state->lastchar++;
      }
--
2.51.0


--
Kevin J. McCarthy
GPG Fingerprint: 8975 A9B3 3AA3 7910 385C  5308 ADEF 7684 8031 6BDA

Attachment: signature.asc
Description: PGP signature

Reply via email to