|
|
|
@ -1378,7 +1378,7 @@ static int
|
|
|
|
|
parse_list_rsp_p2( imap_store_t *ctx, list_t *list, char *cmd ATTR_UNUSED ) |
|
|
|
|
{ |
|
|
|
|
string_list_t *narg; |
|
|
|
|
char *arg; |
|
|
|
|
char *arg, c; |
|
|
|
|
int argl; |
|
|
|
|
uint l; |
|
|
|
|
|
|
|
|
@ -1422,6 +1422,34 @@ parse_list_rsp_p2( imap_store_t *ctx, list_t *list, char *cmd ATTR_UNUSED )
|
|
|
|
|
warn( "IMAP warning: ignoring mailbox %s (reserved character '/' in name)\n", arg ); |
|
|
|
|
return LIST_OK; |
|
|
|
|
} |
|
|
|
|
// Validate the normalized name. Technically speaking, we could tolerate
|
|
|
|
|
// '//' and '/./', and '/../' being forbidden is a limitation of the Maildir
|
|
|
|
|
// driver, but there isn't really a legitimate reason for these being present.
|
|
|
|
|
for (const char *p = narg->string, *sp = p;;) { |
|
|
|
|
if (!(c = *p) || c == '/') { |
|
|
|
|
uint pcl = (uint)(p - sp); |
|
|
|
|
if (!pcl) { |
|
|
|
|
error( "IMAP warning: ignoring mailbox '%s' due to empty name component\n", narg->string ); |
|
|
|
|
free( narg ); |
|
|
|
|
return LIST_OK; |
|
|
|
|
} |
|
|
|
|
if (pcl == 1 && sp[0] == '.') { |
|
|
|
|
error( "IMAP warning: ignoring mailbox '%s' due to '.' component\n", narg->string ); |
|
|
|
|
free( narg ); |
|
|
|
|
return LIST_OK; |
|
|
|
|
} |
|
|
|
|
if (pcl == 2 && sp[0] == '.' && sp[1] == '.') { |
|
|
|
|
error( "IMAP error: LIST'd mailbox name '%s' contains '..' component - THIS MIGHT BE AN ATTEMPT TO HACK YOU!\n", narg->string ); |
|
|
|
|
free( narg ); |
|
|
|
|
return LIST_BAD; |
|
|
|
|
} |
|
|
|
|
if (!c) |
|
|
|
|
break; |
|
|
|
|
sp = ++p; |
|
|
|
|
} else { |
|
|
|
|
++p; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
narg->next = ctx->boxes; |
|
|
|
|
ctx->boxes = narg; |
|
|
|
|
return LIST_OK; |
|
|
|
|