[Pkg-citadel-commit] r163 - in citadel/trunk/debian: . patches

dothebart-guest at alioth.debian.org dothebart-guest at alioth.debian.org
Sun Sep 21 14:40:52 UTC 2008


Author: dothebart-guest
Date: 2008-09-21 14:40:50 +0000 (Sun, 21 Sep 2008)
New Revision: 163

Added:
   citadel/trunk/debian/patches/r6609_fix_CtdlSetSeen.diff
Modified:
   citadel/trunk/debian/changelog
   citadel/trunk/debian/patches/series
Log:
* [r6609] added prepatch: 
Fixed a bug in CtdlSetSeen() where if the target room
was not the currently selected room, the list of seen/unseen
or answered/unanswered messages could become corrupted.



Modified: citadel/trunk/debian/changelog
===================================================================
--- citadel/trunk/debian/changelog	2008-09-11 10:02:19 UTC (rev 162)
+++ citadel/trunk/debian/changelog	2008-09-21 14:40:50 UTC (rev 163)
@@ -1,3 +1,12 @@
+citadel (7.37-5) unstable; urgency=high
+
+  [ Wilfried Goesgens ]
+  * [r6609] add upsttream prepatch; CtdlSetSeen() where if the target room
+    was not the currently selected room, the list of seen/unseen
+    or answered/unanswered messages could become corrupted.
+
+ -- Michael Meskes <meskes at debian.org>  Sun, 21 Sep 2008 13:10:03 +0200
+
 citadel (7.37-4) unstable; urgency=low
 
   [ Wilfried Goesgens ]

Added: citadel/trunk/debian/patches/r6609_fix_CtdlSetSeen.diff
===================================================================
--- citadel/trunk/debian/patches/r6609_fix_CtdlSetSeen.diff	                        (rev 0)
+++ citadel/trunk/debian/patches/r6609_fix_CtdlSetSeen.diff	2008-09-21 14:40:50 UTC (rev 163)
@@ -0,0 +1,189 @@
+Index: msgbase.c
+===================================================================
+--- citadel-7.37.orig/msgbase.c	(revision 6608)
++++ citadel-7.37/msgbase.c	(revision 6609)
+@@ -340,8 +340,6 @@
+ 	int was_seen = 0;
+ 	long lo = (-1L);
+ 	long hi = (-1L);
+-	long t = (-1L);
+-	int trimming = 0;
+ 	struct visit vbuf;
+ 	long *msglist;
+ 	int num_msgs = 0;
+@@ -349,8 +347,8 @@
+ 	char *is_set;	/* actually an array of booleans */
+ 	int num_sets;
+ 	int s;
++	int w = 0;
+ 	char setstr[SIZ], lostr[SIZ], histr[SIZ];
+-	size_t tmp;
+ 
+ 	/* Don't bother doing *anything* if we were passed a list of zero messages */
+ 	if (num_target_msgnums < 1) {
+@@ -367,7 +365,7 @@
+ 		which_user = &CC->user;
+ 	}
+ 
+-	CtdlLogPrintf(CTDL_DEBUG, "CtdlSetSeen(%d msgs starting with %ld, %s, %d) in <%s>\n",
++	CtdlLogPrintf(CTDL_DEBUG, "CtdlSetSeen(%d msgs starting with %ld, %s, %d) in <%s>\n",
+ 		num_target_msgnums, target_msgnums[0],
+ 		(target_setting ? "SET" : "CLEAR"),
+ 		which_set,
+@@ -377,7 +375,7 @@
+ 	CtdlGetRelationship(&vbuf, which_user, which_room);
+ 
+ 	/* Load the message list */
+-	cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
++	cdbfr = cdb_fetch(CDB_MSGLISTS, &which_room->QRnumber, sizeof(long));
+ 	if (cdbfr != NULL) {
+ 		msglist = (long *) cdbfr->ptr;
+ 		cdbfr->ptr = NULL;	/* CtdlSetSeen() now owns this memory */
+@@ -400,8 +398,20 @@
+ 			break;
+ 	}
+ 
+-	CtdlLogPrintf(CTDL_DEBUG, "before optimize: %s\n", vset);
+ 
++#if 0	/* This is a special diagnostic section.  Do not allow it to run during normal operation. */
++	CtdlLogPrintf(CTDL_DEBUG, "There are %d messages in the room.\n", num_msgs);
++	for (i=0; i<num_msgs; ++i) {
++		if (i > 0) if (msglist[i] <= msglist[i-1]) abort();
++	}
++	CtdlLogPrintf(CTDL_DEBUG, "We are twiddling %d of them.\n", num_target_msgnums);
++	for (k=0; k<num_target_msgnums; ++k) {
++		if (k > 0) if (target_msgnums[k] <= target_msgnums[k-1]) abort();
++	}
++#endif
++
++	CtdlLogPrintf(CTDL_DEBUG, "before update: %s\n", vset);
++
+ 	/* Translate the existing sequence set into an array of booleans */
+ 	num_sets = num_tokens(vset, ',');
+ 	for (s=0; s<num_sets; ++s) {
+@@ -429,73 +439,73 @@
+ 		}
+ 	}
+ 
+-	CtdlLogPrintf(CTDL_DEBUG, " after optimize: %s\n", vset);
+ 
+ 	/* Now translate the array of booleans back into a sequence set */
+ 	strcpy(vset, "");
+-	lo = (-1L);
+-	hi = (-1L);
+-	was_seen = ((which_set == ctdlsetseen_seen) ? 1 : 0);
++	was_seen = 0;
++	lo = (-1);
++	hi = (-1);
+ 
+ 	for (i=0; i<num_msgs; ++i) {
++		is_seen = is_set[i];
+ 
+-		is_seen = is_set[i];	/* Default to existing setting */
+-
++		/* Apply changes */
+ 		for (k=0; k<num_target_msgnums; ++k) {
+ 			if (msglist[i] == target_msgnums[k]) {
+ 				is_seen = target_setting;
+ 			}
+ 		}
+ 
+-		if (is_seen) {
+-			if (lo < 0L) lo = msglist[i];
+-			hi = msglist[i];
++		w = 0;	/* set to 1 if we write something to the string */
++
++		if ((was_seen == 0) && (is_seen == 1)) {
++			lo = msglist[i];
+ 		}
++		else if ((was_seen == 1) && (is_seen == 0)) {
++			hi = msglist[i-1];
++			w = 1;
+ 
+-		if (  ((is_seen == 0) && (was_seen == 1))
+-		   || ((is_seen == 1) && (i == num_msgs-1)) ) {
+-
+-			/* begin trim-o-matic code */
+-			j=9;
+-			trimming = 0;
+-			while ( (strlen(vset) + 20) > sizeof vset) {
+-				remove_token(vset, 0, ',');
+-				trimming = 1;
+-				if (j--) break; /* loop no more than 9 times */
++			if (!IsEmptyStr(vset)) {
++				strcat(vset, ",");
+ 			}
+-			if ( (trimming) && (which_set == ctdlsetseen_seen) ) {
+-				t = atol(vset);
+-				if (t<2) t=2;
+-				--t;
+-				snprintf(lostr, sizeof lostr,
+-					"1:%ld,%s", t, vset);
+-				safestrncpy(vset, lostr, sizeof vset);
++			if (lo == hi) {
++				sprintf(&vset[strlen(vset)], "%ld", hi);
+ 			}
+-			if (trimming) {
+-				CtdlLogPrintf(CTDL_DEBUG, "32m ** TRIMMING ** \n");
++			else {
++				sprintf(&vset[strlen(vset)], "%ld:%ld", lo, hi);
+ 			}
+-			/* end trim-o-matic code */
+-
+-			tmp = strlen(vset);
+-			if (tmp > 0) {
++		}
++		else if ((is_seen) && (i == num_msgs - 1)) {
++			w = 1;
++			if (!IsEmptyStr(vset)) {
+ 				strcat(vset, ",");
+-				++tmp;
+ 			}
+-			if ((lo == -1) && (hi == -1)) {
+-				/* bogus pair, do nothing */
++			if ((i==0) || (was_seen == 0)) {
++				sprintf(&vset[strlen(vset)], "%ld", msglist[i]);
+ 			}
+-			else if (lo == hi) {
+-				snprintf(&vset[tmp], (sizeof vset) - tmp, "%ld", lo);
+-			}
+ 			else {
+-				snprintf(&vset[tmp], (sizeof vset) - tmp, "%ld:%ld", lo, hi);
++				sprintf(&vset[strlen(vset)], "%ld:%ld", lo, msglist[i]);
+ 			}
+-			lo = (-1L);
+-			hi = (-1L);
+ 		}
++
++		/* If the string is getting too long, truncate it at the beginning; repeat up to 9 times */
++		if (w) for (j=0; j<9; ++j) {
++			if ((strlen(vset) + 20) > sizeof vset) {
++				remove_token(vset, 0, ',');
++				if (which_set == ctdlsetseen_seen) {
++					char temp[SIZ];
++					sprintf(temp, "1:%ld,", atol(vset)-1L);
++					strcat(temp, vset);
++					strcpy(vset, temp);
++				}
++			}
++		}
++
+ 		was_seen = is_seen;
+ 	}
+ 
++	CtdlLogPrintf(CTDL_DEBUG, " after update: %s\n", vset);
++
+ 	/* Decide which message set we're manipulating */
+ 	switch (which_set) {
+ 		case ctdlsetseen_seen:
+@@ -505,9 +515,8 @@
+ 			safestrncpy(vbuf.v_answered, vset, sizeof vbuf.v_answered);
+ 			break;
+ 	}
++
+ 	free(is_set);
+-
+-	CtdlLogPrintf(CTDL_DEBUG, "   after update: %s\n", vset);
+ 	free(msglist);
+ 	CtdlSetRelationship(&vbuf, which_user, which_room);
+ }

Modified: citadel/trunk/debian/patches/series
===================================================================
--- citadel/trunk/debian/patches/series	2008-09-11 10:02:19 UTC (rev 162)
+++ citadel/trunk/debian/patches/series	2008-09-21 14:40:50 UTC (rev 163)
@@ -8,3 +8,4 @@
 r6535_autopurger_dont_touch_systemfiles.diff
 r6544_fix_qp_encoder_offbyone.diff
 r6570_uppercase_smtp_commands.diff
+r6609_fix_CtdlSetSeen.diff




More information about the Pkg-citadel-commit mailing list