[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, "[31mCtdlSetSeen(%d msgs starting with %ld, %s, %d) in <%s>[0m\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, "[31mbefore optimize: %s[0m\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, "[31m after optimize: %s[0m\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 ** [0m\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, "[31m after update: %s[0m\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