[PATCH v1 1/2] enter.c: Use wmem*() functions with wide-character strings

Alejandro Colomar via Mutt-dev <[email protected]>
Newsgroups gmane.mail.mutt.devel
Message-ID <465585daa48b19cedd5318707a51bb110fe40ed9.1770936654.git.alx@kernel.org>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.