So I spent several hours today working on this patch, before I realized that Wesley Craig had already developed a patch. I notice that his hasn't been accepted into the trunk on CVS yet. Let me just state that this was a blocker bug for our implementation, and that I support some kind of fix being applied. Since I've already written it, I went ahead and attached the patch as I wrote it below -- same basic idea as Wesley's, but different implementation. Someone else can decide which to use... :)

Another (new, I think) bug patch coming in just a sec....







index: backend.c
===================================================================
RCS file: /cvs/src/cyrus/imap/backend.c,v
retrieving revision 1.59
diff -u -r1.59 backend.c
--- backend.c   4 Feb 2009 16:42:02 -0000       1.59
+++ backend.c   6 Jul 2009 03:35:52 -0000
@@ -134,6 +134,38 @@
     return ret;
 }

+static void reconcile_mechs(char **list, const char *conflist)
+{
+    char *new;
+    char *cur;
+    char *end;
+
+    if (strlen(*list) == 0) {
+        return;
+    }
+
+    /* Lazy way of getting a big enough buffer */
+    /* The new string should be no longer than the old */
+    new = xstrndup(*list, strlen(*list) + 1);
+    *new = '\0';
+
+    for (cur = *list; cur != NULL; cur = end) {
+        if (end = strchr(cur, ' ')) {
+            *end = '\0';
+            end++;
+        }
+
+        if (strstr(cur, conflist)) {
+            if (strlen(new)) {
+                strcat(new, " ");
+            }
+            strcat(new, cur);
+        }
+    }
+    free(*list);
+    *list = new;
+}
+
 static int do_starttls(struct backend *s, struct tls_cmd_t *tls_cmd)
 {
 #ifndef HAVE_SSL
@@ -247,8 +279,7 @@
     do {
        /* If we have a mech_conf, use it */
        if (mech_conf) {
-           free(*mechlist);
-           *mechlist = xstrdup(mech_conf);
+           reconcile_mechs(mechlist, mech_conf);
        }

        if (*mechlist) {

Reply via email to