Alternate patch for bug 3093 -- backend.c doesn't compare offered mechanisms to conf file

Michael Bacon baconm at email.unc.edu
Sun Jul 5 23:52:08 EDT 2009


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) {



More information about the Cyrus-devel mailing list