From e47c1f4f28705307c5a2588a496dc3c046bc55d1 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia-Ripoll Date: Sat, 10 Oct 2020 18:20:16 +0200 Subject: [PATCH] mu_maildir_get_new_path() did not use the right flags separator when creating new file names. --- lib/mu-maildir.c | 56 +++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/lib/mu-maildir.c b/lib/mu-maildir.c index 07f27377..57f6464b 100644 --- a/lib/mu-maildir.c +++ b/lib/mu-maildir.c @@ -779,12 +779,24 @@ get_new_basename (void) g_get_host_name ()); } +static const char* +get_path_separator(const char *path) +{ + const char *cur; + for (cur = &path[strlen(path)-1]; cur > path; --cur) { + if ((*cur == ':' || *cur == '!' || *cur == ';') && + (cur[1] == '2' && cur[2] == ',')) { + return cur; + } + } + return NULL; +} char* mu_maildir_get_new_path (const char *oldpath, const char *new_mdir, MuFlags newflags, gboolean new_name) { - char *mfile, *mdir, *custom_flags, *newpath, flags_sep = ':'; + char *mfile, *mdir, *custom_flags, *newpath, flags_sep = ':'; g_return_val_if_fail (oldpath, NULL); @@ -795,26 +807,30 @@ mu_maildir_get_new_path (const char *oldpath, const char *new_mdir, if (!mdir) return NULL; - if (new_name) + /* determine the name of the location of the flag separator */ + + if (new_name) { + const char *cur; mfile = get_new_basename (); - else { - /* determine the name of the mailfile, stripped of its flags, as - * well as any custom (non-standard) flags */ - char *cur; - mfile = g_path_get_basename (oldpath); - for (cur = &mfile[strlen(mfile)-1]; cur > mfile; --cur) { - if ((*cur == ':' || *cur == '!' || *cur == ';') && - (cur[1] == '2' && cur[2] == ',')) { - /* get the custom flags (if any) */ - custom_flags = - mu_flags_custom_from_str (cur + 3); - /* preserve the existing flags separator - * in the new file name */ - flags_sep = *cur; - cur[0] = '\0'; /* strip the flags */ - break; - } - } + cur = get_path_separator (oldpath); + if (cur) { + /* preserve the existing flags separator + * in the new file name */ + flags_sep = *cur; + } + } else { + char *cur; + mfile = g_path_get_basename (oldpath); + cur = (char*) get_path_separator (mfile); + if (cur) { + /* get the custom flags (if any) */ + custom_flags = + mu_flags_custom_from_str (cur + 3); + /* preserve the existing flags separator + * in the new file name */ + flags_sep = *cur; + cur[0] = '\0'; /* strip the flags */ + } } newpath = get_new_path (new_mdir ? new_mdir : mdir,