[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug-mailutils] /usr/bin/mail segfaults when tab-completing after "c
From: |
Sergey Poznyakoff |
Subject: |
Re: [bug-mailutils] /usr/bin/mail segfaults when tab-completing after "cd x" |
Date: |
Sat, 22 Jul 2006 11:39:15 +0300 |
Daniel Kahn Gillmor <address@hidden> wrote:
> I'm using debian's mailutils version 0.6.94-1, and i found the
> following misbehavior.
Thanks for reporting. I have installed a fix in the CVS. Please find
enclosed the minimal patch.
> It's currently filed as debian bug 379156 [0],
> if you care to followup there.
No, I guess, I rather don't.
Thanks also for your mails regarding TLS/GSSAPI issues. Please, allow me
some time to answer these.
Regards,
Sergey
Index: mail/mailline.c
===================================================================
RCS file: /cvsroot/mailutils/mailutils/mail/mailline.c,v
retrieving revision 1.28
diff -p -u -r1.28 mailline.c
--- mail/mailline.c 23 Jan 2006 11:23:25 -0000 1.28
+++ mail/mailline.c 22 Jul 2006 08:05:02 -0000
@@ -335,9 +335,19 @@ command_compl (int argc, char **argv, in
return rl_completion_matches (argv[argc-1], ml_command_generator);
}
+/* Generate file list based on reference prefix TEXT, relative to PATH.
+ Remove PATHLEN leading characters from the returned names. Replace
+ them with REPL unless it is 0.
+
+ Select only those files that match given FLAGS (MU_FOLDER_ATTRIBUTE_*
+ constants).
+
+ STATE is 0 for the first call, 1 otherwise.
+ */
static char *
-file_generator (const char *text, int state, char *path, size_t pathlen,
- char repl,
+file_generator (const char *text, int state,
+ char *path, size_t pathlen,
+ char repl,
int flags)
{
static mu_list_t list;
@@ -352,7 +362,12 @@ file_generator (const char *text, int st
wcard = xmalloc (strlen (text) + 2);
strcat (strcpy (wcard, text), "*");
- mu_folder_create (&folder, path);
+ if (mu_folder_create (&folder, path))
+ {
+ free (wcard);
+ return NULL;
+ }
+
mu_folder_list (folder, path, wcard, 1, &list);
free (wcard);
mu_folder_destroy (&folder);
@@ -381,13 +396,17 @@ file_generator (const char *text, int st
if (resp->type & flags)
{
char *ret;
- if (repl)
+ if (pathlen)
{
- int len = strlen (resp->name + pathlen);
- ret = xmalloc (len + 2);
- ret[0] = repl;
- memcpy (ret + 1, resp->name + pathlen, len);
- ret[len+1] = 0;
+ size_t len = strlen (resp->name + pathlen);
+ char *ptr;
+
+ ret = xmalloc (len + (repl ? 1 : 0) + 1);
+ ptr = ret;
+ if (repl)
+ *ptr++ = repl;
+ memcpy (ptr, resp->name + pathlen, len);
+ ptr[len] = 0;
}
else
ret = xstrdup (resp->name);
@@ -483,10 +502,16 @@ dir_generator (const char *text, int sta
}
/* else FIXME! */
- default:
+ case '/':
path = strdup (text);
pathlen = 0;
repl = 0;
+ break;
+
+ default:
+ path = strdup ("./");
+ pathlen = 2;
+ repl = 0;
}
ret = file_generator (text, state, path, pathlen, repl,
Index: mailbox/mutil.c
===================================================================
RCS file: /cvsroot/mailutils/mailutils/mailbox/mutil.c,v
retrieving revision 1.77
diff -p -u -r1.77 mutil.c
--- mailbox/mutil.c 27 Jun 2006 13:07:56 -0000 1.77
+++ mailbox/mutil.c 22 Jul 2006 08:05:05 -0000
@@ -1228,7 +1228,9 @@ mu_scheme_autodetect_p (const char *sche
*path += MU_FILE_SCHEME_LEN;
return 1;
}
- if (strncmp (MU_PATH_SCHEME, scheme, MU_PATH_SCHEME_LEN) == 0)
+ if (access (scheme, F_OK) == 0
+ /* FIXME: this can return true even if the folder is unreadable */
+ || strncmp (MU_PATH_SCHEME, scheme, MU_PATH_SCHEME_LEN) == 0)
return 1;
return 0;
}
Index: mailbox/mutil.c
===================================================================
RCS file: /cvsroot/mailutils/mailutils/mailbox/mutil.c,v
retrieving revision 1.77
diff -p -u -r1.77 mutil.c
--- mailbox/mutil.c 27 Jun 2006 13:07:56 -0000 1.77
+++ mailbox/mutil.c 22 Jul 2006 08:05:05 -0000
@@ -1228,7 +1228,9 @@ mu_scheme_autodetect_p (const char *sche
*path += MU_FILE_SCHEME_LEN;
return 1;
}
- if (strncmp (MU_PATH_SCHEME, scheme, MU_PATH_SCHEME_LEN) == 0)
+ if (access (scheme, F_OK) == 0
+ /* FIXME: this can return true even if the folder is unreadable */
+ || strncmp (MU_PATH_SCHEME, scheme, MU_PATH_SCHEME_LEN) == 0)
return 1;
return 0;
}