commit 96b5ae8360054cf7f1c48bc2d3a85124fc5a5908
Author: Oswald Buddenhagen <o...@users.sf.net>
Date:   Fri Mar 24 15:29:06 2017 +0100

    don't mess with the driver's mailbox list from outside
    
    the api specifies that the list remains owned by the driver, so poking
    around in it is ugly and risky.

 src/main.c | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/src/main.c b/src/main.c
index 35ea814..a9dca02 100644
--- a/src/main.c
+++ b/src/main.c
@@ -381,6 +381,7 @@ typedef struct {
        store_t *ctx[2];
        chan_ent_t *chanptr;
        box_ent_t *boxptr;
+       string_list_t *boxes[2];
        char *names[2];
        int ret, all, list, state[2];
        char done, skip, cben;
@@ -835,8 +836,8 @@ sync_chans( main_vars_t *mvars, int ent )
 
                if (!mvars->chanptr->boxlist && mvars->chan->patterns) {
                        mvars->chanptr->boxlist = 2;
-                       boxes[M] = filter_boxes( mvars->ctx[M]->boxes, 
mvars->chan->boxes[M], mvars->chan->patterns );
-                       boxes[S] = filter_boxes( mvars->ctx[S]->boxes, 
mvars->chan->boxes[S], mvars->chan->patterns );
+                       boxes[M] = filter_boxes( mvars->boxes[M], 
mvars->chan->boxes[M], mvars->chan->patterns );
+                       boxes[S] = filter_boxes( mvars->boxes[S], 
mvars->chan->boxes[S], mvars->chan->patterns );
                        mboxapp = &mvars->chanptr->boxes;
                        for (mb = sb = 0; ; ) {
                                char *mname = boxes[M] ? boxes[M][mb] : 0;
@@ -901,7 +902,9 @@ sync_chans( main_vars_t *mvars, int ent )
 
          next:
                mvars->cben = 0;
-               for (t = 0; t < 2; t++)
+               for (t = 0; t < 2; t++) {
+                       free_string_list( mvars->boxes[t] );
+                       mvars->boxes[t] = 0;
                        if (mvars->state[t] == ST_FRESH) {
                                /* An unconnected store may be only cancelled. 
*/
                                mvars->state[t] = ST_CLOSED;
@@ -910,6 +913,7 @@ sync_chans( main_vars_t *mvars, int ent )
                                mvars->state[t] = ST_CANCELING;
                                mvars->drv[t]->cancel_cmds( mvars->ctx[t], 
cancel_prep_done, AUX );
                        }
+               }
                mvars->cben = 1;
                if (mvars->state[M] != ST_CLOSED || mvars->state[S] != 
ST_CLOSED) {
                        mvars->skip = 1;
@@ -998,7 +1002,8 @@ static void
 store_listed( int sts, void *aux )
 {
        MVARS(aux)
-       string_list_t **box, *bx;
+       string_list_t *boxes = mvars->ctx[t]->boxes;
+       string_list_t *box;
 
        switch (sts) {
        case DRV_CANCELED:
@@ -1006,25 +1011,26 @@ store_listed( int sts, void *aux )
        case DRV_OK:
                if (DFlags & DEBUG_MAIN) {
                        debug( "got mailbox list from %s:\n", str_ms[t] );
-                       for (bx = mvars->ctx[t]->boxes; bx; bx = bx->next)
-                               debug( "  %s\n", bx->string );
+                       for (box = boxes; box; box = box->next)
+                               debug( "  %s\n", box->string );
                }
-               if (mvars->ctx[t]->conf->flat_delim) {
-                       for (box = &mvars->ctx[t]->boxes; *box; box = 
&(*box)->next) {
+               for (box = boxes; box; box = box->next) {
+                       if (mvars->ctx[t]->conf->flat_delim) {
                                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 );
+                               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 );
                                        mvars->ret = mvars->skip = 1;
                                } else {
-                                       nbox->next = (*box)->next;
-                                       free( *box );
-                                       *box = nbox;
+                                       nbox->next = mvars->boxes[t];
+                                       mvars->boxes[t] = nbox;
                                }
+                       } else {
+                               add_string_list( &mvars->boxes[t], box->string 
);
                        }
                }
                if (mvars->ctx[t]->conf->map_inbox) {
                        debug( "adding mapped inbox to %s: %s\n", str_ms[t], 
mvars->ctx[t]->conf->map_inbox );
-                       add_string_list( &mvars->ctx[t]->boxes, 
mvars->ctx[t]->conf->map_inbox );
+                       add_string_list( &mvars->boxes[t], 
mvars->ctx[t]->conf->map_inbox );
                }
                break;
        default:

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
isync-devel mailing list
isync-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/isync-devel

Reply via email to