Patch by Demi <m...@tfiu.de> to fix Debian bug #621690.

>From https://bugs.debian.org/621690:

> wmbiff change path of my mailboxes next nearest.
>
> For example wmbiff change 'gleb' to 'glil' for second and fourth mailboxes.
> However the 1st, 3rd and 5th mailboxes have correct path.

Well, the indices don't really enter.  I'm actually surprised this
isn't more trouble.

The underlying reason is that in wmbiff.c:parse_mbox_path, the
program calls

  mboxCreate((&mbox[item]), mbox[item].path);

which for maildirs calls

  int maildirCreate(Pop3 pc, const char *str)

in maildirClient.c.  str in this way is an alias for pc->path.

In maildirCreate, after some char acrobatics, the program eventually
does

  strncpy(pc->path, str + 8 + i, BUF_BIG - 1);

to cut off the leading stuff from the maildir.  The result of this
operation is not defined, as pc->path and str point to the same
memory and thus the arguments overlap, which strncpy outlaws.

A simple fix is to copy manually, like this:

                DM(pc, DEBUG_ERROR, "maildir '%s' is too long.\n", str + 8 + i);
                memset(pc->path, 0, BUF_BIG);
        } else {
+               const char *sp = str + 8 + i;
+               char *dp = pc->path;
+
+               while (*sp && sp-str<BUF_BIG-1) {
+                       *dp++ = *sp++;
+               }
+               *dp = 0;
-               strncpy(pc->path, , BUF_BIG - 1);       /* cut off ``maildir:'' 
*/
        }

-- it's what I'm doing now.  But I give you that's a bit pedestrian.
---
 wmbiff/wmbiff/maildirClient.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/wmbiff/wmbiff/maildirClient.c b/wmbiff/wmbiff/maildirClient.c
index 5858e46..5df3349 100644
--- a/wmbiff/wmbiff/maildirClient.c
+++ b/wmbiff/wmbiff/maildirClient.c
@@ -168,7 +168,13 @@ int maildirCreate(Pop3 pc, const char *str)
                DM(pc, DEBUG_ERROR, "maildir '%s' is too long.\n", str + 8 + i);
                memset(pc->path, 0, BUF_BIG);
        } else {
-               strncpy(pc->path, str + 8 + i, BUF_BIG - 1);    /* cut off 
``maildir:'' */
+               const char *sp = str + 8 + i;
+               char *dp = pc->path;
+
+               while (*sp && sp-str<BUF_BIG-1) {
+                       *dp++ = *sp++;
+               }
+               *dp = 0;
        }
 
        DM(pc, DEBUG_INFO, "maildir: str = '%s'\n", str);
-- 
2.11.0


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to