This avoids an explicit size multiplication, which can overflow the
calculation.

Signed-off-by: Alejandro Colomar <[email protected]>
Cherry-picked-from: neomutt.git 7df621a105e2 (2024-05-09, "Use wmem*() 
functions with wide-character strings")
[alx: Adapted diff and message to mutt(1)]
Signed-off-by: Alejandro Colomar <[email protected]>
---
 enter.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

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>
 
 /* 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

Reply via email to