fix error handling of invalid SyncState *
when we find that the store is incompatible with in-store sync state, we want to fail the whole channel. however, we must not claim that the store died, otherwise it won't be disposed of properly.
This commit is contained in:
parent
1bc9c6d9cf
commit
28cccf4b35
|
@ -451,9 +451,10 @@ extern const char *str_ms[2], *str_hl[2];
|
||||||
|
|
||||||
#define SYNC_OK 0 /* assumed to be 0 */
|
#define SYNC_OK 0 /* assumed to be 0 */
|
||||||
#define SYNC_FAIL 1
|
#define SYNC_FAIL 1
|
||||||
#define SYNC_BAD(ms) (2<<(ms))
|
#define SYNC_FAIL_ALL 2
|
||||||
#define SYNC_NOGOOD 8 /* internal */
|
#define SYNC_BAD(ms) (4<<(ms))
|
||||||
#define SYNC_CANCELED 16 /* internal */
|
#define SYNC_NOGOOD 16 /* internal */
|
||||||
|
#define SYNC_CANCELED 32 /* internal */
|
||||||
|
|
||||||
/* All passed pointers must stay alive until cb is called. */
|
/* All passed pointers must stay alive until cb is called. */
|
||||||
void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan,
|
void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan,
|
||||||
|
|
|
@ -746,11 +746,13 @@ done_sync( int sts, void *aux )
|
||||||
if (sts) {
|
if (sts) {
|
||||||
mvars->ret = 1;
|
mvars->ret = 1;
|
||||||
if (sts & (SYNC_BAD(M) | SYNC_BAD(S))) {
|
if (sts & (SYNC_BAD(M) | SYNC_BAD(S))) {
|
||||||
mvars->skip = 1;
|
|
||||||
if (sts & SYNC_BAD(M))
|
if (sts & SYNC_BAD(M))
|
||||||
mvars->state[M] = ST_CLOSED;
|
mvars->state[M] = ST_CLOSED;
|
||||||
if (sts & SYNC_BAD(S))
|
if (sts & SYNC_BAD(S))
|
||||||
mvars->state[S] = ST_CLOSED;
|
mvars->state[S] = ST_CLOSED;
|
||||||
|
mvars->skip = 1;
|
||||||
|
} else if (sts & SYNC_FAIL_ALL) {
|
||||||
|
mvars->skip = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sync_chans( mvars, E_SYNC );
|
sync_chans( mvars, E_SYNC );
|
||||||
|
|
|
@ -647,7 +647,7 @@ box_selected( int sts, void *aux )
|
||||||
if (!ctx[S]->path) {
|
if (!ctx[S]->path) {
|
||||||
error( "Error: store '%s' does not support in-box sync state\n", chan->stores[S]->name );
|
error( "Error: store '%s' does not support in-box sync state\n", chan->stores[S]->name );
|
||||||
sbail:
|
sbail:
|
||||||
svars->ret = SYNC_BAD(S);
|
svars->ret = SYNC_FAIL;
|
||||||
sync_bail2( svars );
|
sync_bail2( svars );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user