make map_name() interpret empty strings as "no separator"
empty strings were previously meaningless, and starting with 72c2d695a
,
failure to handle them lead to bogus results when the IMAP hierarchy
separator is legitimately empty (when the server genuinely supports none
and none is manually configured). non-null can be asserted more cleanly
than null-or-non-empty, so change the api like that.
incidentally, this also removes the need to work around gcc's bogus
warning in -Os mode.
problem found by "Casper Ti. Vector" <caspervector@gmail.com>
This commit is contained in:
parent
53e8e79488
commit
c29eceaeed
|
@ -355,6 +355,8 @@ load_config( const char *where, int pseudo )
|
|||
if (store) {
|
||||
if (!store->max_size)
|
||||
store->max_size = INT_MAX;
|
||||
if (!store->flat_delim)
|
||||
store->flat_delim = "";
|
||||
*storeapp = store;
|
||||
storeapp = &store->next;
|
||||
*storeapp = 0;
|
||||
|
|
|
@ -983,7 +983,7 @@ store_connected( int sts, void *aux )
|
|||
flags |= LIST_INBOX;
|
||||
} else if (c == '/') {
|
||||
/* Flattened sub-folders of INBOX actually end up in Path. */
|
||||
if (mvars->ctx[t]->conf->flat_delim)
|
||||
if (mvars->ctx[t]->conf->flat_delim[0])
|
||||
flags |= LIST_PATH;
|
||||
else
|
||||
flags |= LIST_INBOX;
|
||||
|
@ -1027,7 +1027,7 @@ store_listed( int sts, string_list_t *boxes, void *aux )
|
|||
return;
|
||||
case DRV_OK:
|
||||
for (box = boxes; box; box = box->next) {
|
||||
if (mvars->ctx[t]->conf->flat_delim) {
|
||||
if (mvars->ctx[t]->conf->flat_delim[0]) {
|
||||
string_list_t *nbox;
|
||||
if (map_name( box->string, (char **)&nbox, offsetof(string_list_t, string), mvars->ctx[t]->conf->flat_delim, "/" ) < 0) {
|
||||
error( "Error: flattened mailbox name '%s' contains canonical hierarchy delimiter\n", box->string );
|
||||
|
|
|
@ -1014,7 +1014,7 @@ sync_boxes( store_t *ctx[], const char *names[], int present[], channel_conf_t *
|
|||
svars->orig_name[t] =
|
||||
(!names[t] || (ctx[t]->conf->map_inbox && !strcmp( ctx[t]->conf->map_inbox, names[t] ))) ?
|
||||
"INBOX" : names[t];
|
||||
if (!ctx[t]->conf->flat_delim) {
|
||||
if (!ctx[t]->conf->flat_delim[0]) {
|
||||
svars->box_name[t] = nfstrdup( svars->orig_name[t] );
|
||||
} else if (map_name( svars->orig_name[t], &svars->box_name[t], 0, "/", ctx[t]->conf->flat_delim ) < 0) {
|
||||
error( "Error: canonical mailbox name '%s' contains flattened hierarchy delimiter\n", svars->orig_name[t] );
|
||||
|
|
27
src/util.c
27
src/util.c
|
@ -479,19 +479,20 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha
|
|||
char *p;
|
||||
int i, l, ll, num, inl, outl;
|
||||
|
||||
assert( arg );
|
||||
l = strlen( arg );
|
||||
if (!in) {
|
||||
assert( in );
|
||||
inl = strlen( in );
|
||||
if (!inl) {
|
||||
copy:
|
||||
*result = nfmalloc( reserve + l + 1 );
|
||||
memcpy( *result + reserve, arg, l + 1 );
|
||||
return 0;
|
||||
}
|
||||
inl = strlen( in );
|
||||
if (out) {
|
||||
outl = strlen( out );
|
||||
if (inl == outl && !memcmp( in, out, inl ))
|
||||
goto copy;
|
||||
}
|
||||
assert( out );
|
||||
outl = strlen( out );
|
||||
if (inl == outl && !memcmp( in, out, inl ))
|
||||
goto copy;
|
||||
for (num = 0, i = 0; i < l; ) {
|
||||
for (ll = 0; ll < inl; ll++)
|
||||
if (arg[i + ll] != in[ll])
|
||||
|
@ -500,7 +501,7 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha
|
|||
i += inl;
|
||||
continue;
|
||||
fout:
|
||||
if (out) {
|
||||
if (outl) {
|
||||
for (ll = 0; ll < outl; ll++)
|
||||
if (arg[i + ll] != out[ll])
|
||||
goto fnexti;
|
||||
|
@ -511,7 +512,7 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha
|
|||
}
|
||||
if (!num)
|
||||
goto copy;
|
||||
if (!out)
|
||||
if (!outl)
|
||||
return -2;
|
||||
*result = nfmalloc( reserve + l + num * (outl - inl) + 1 );
|
||||
p = *result + reserve;
|
||||
|
@ -519,15 +520,7 @@ map_name( const char *arg, char **result, int reserve, const char *in, const cha
|
|||
for (ll = 0; ll < inl; ll++)
|
||||
if (arg[i + ll] != in[ll])
|
||||
goto rnexti;
|
||||
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__clang__)
|
||||
# pragma GCC diagnostic push
|
||||
/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42145 */
|
||||
# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
|
||||
#endif
|
||||
memcpy( p, out, outl );
|
||||
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && !defined(__clang__)
|
||||
# pragma GCC diagnostic pop
|
||||
#endif
|
||||
p += outl;
|
||||
i += inl;
|
||||
continue;
|
||||
|
|
Loading…
Reference in New Issue
Block a user