소스 검색

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.
Oswald Buddenhagen 13 년 전
부모
커밋
28cccf4b35
3개의 변경된 파일8개의 추가작업 그리고 5개의 파일을 삭제
  1. 4 3
      src/isync.h
  2. 3 1
      src/main.c
  3. 1 1
      src/sync.c

+ 4 - 3
src/isync.h

@@ -451,9 +451,10 @@ extern const char *str_ms[2], *str_hl[2];
 
 #define SYNC_OK       0 /* assumed to be 0 */
 #define SYNC_FAIL     1
-#define SYNC_BAD(ms)  (2<<(ms))
-#define SYNC_NOGOOD   8 /* internal */
-#define SYNC_CANCELED 16 /* internal */
+#define SYNC_FAIL_ALL 2
+#define SYNC_BAD(ms)  (4<<(ms))
+#define SYNC_NOGOOD   16 /* internal */
+#define SYNC_CANCELED 32 /* internal */
 
 /* All passed pointers must stay alive until cb is called. */
 void sync_boxes( store_t *ctx[], const char *names[], channel_conf_t *chan,

+ 3 - 1
src/main.c

@@ -746,11 +746,13 @@ done_sync( int sts, void *aux )
 	if (sts) {
 		mvars->ret = 1;
 		if (sts & (SYNC_BAD(M) | SYNC_BAD(S))) {
-			mvars->skip = 1;
 			if (sts & SYNC_BAD(M))
 				mvars->state[M] = ST_CLOSED;
 			if (sts & SYNC_BAD(S))
 				mvars->state[S] = ST_CLOSED;
+			mvars->skip = 1;
+		} else if (sts & SYNC_FAIL_ALL) {
+			mvars->skip = 1;
 		}
 	}
 	sync_chans( mvars, E_SYNC );

+ 1 - 1
src/sync.c

@@ -647,7 +647,7 @@ box_selected( int sts, void *aux )
 		if (!ctx[S]->path) {
 			error( "Error: store '%s' does not support in-box sync state\n", chan->stores[S]->name );
 		  sbail:
-			svars->ret = SYNC_BAD(S);
+			svars->ret = SYNC_FAIL;
 			sync_bail2( svars );
 			return;
 		}