Author: baggins                      Date: Fri Oct 26 01:21:49 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- fix DIGEST-MD5 AUTH parsing

---- Files affected:
SOURCES:
   cyrus-sasl-digest-commas.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/cyrus-sasl-digest-commas.patch
diff -u /dev/null SOURCES/cyrus-sasl-digest-commas.patch:1.1
--- /dev/null   Fri Oct 26 03:21:49 2007
+++ SOURCES/cyrus-sasl-digest-commas.patch      Fri Oct 26 03:21:44 2007
@@ -0,0 +1,148 @@
+Pulled from CVS,  Ident strings removed to let the patch apply pretty cleanly.
+
+===================================================================
+RCS file: /afs/andrew.cmu.edu/system/cvs/src/sasl/plugins/digestmd5.c,v
+retrieving revision 1.183
+retrieving revision 1.184
+diff -u -r1.183 -r1.184
+--- src/sasl/plugins/digestmd5.c       2006/11/27 20:41:55     1.183
++++ src/sasl/plugins/digestmd5.c       2007/02/14 17:16:14     1.184
+@@ -556,12 +556,17 @@
+     return SASL_OK;
+ }
+ 
++static int is_lws_char (char c)
++{
++    return (c == ' ' || c == HT || c == CR || c == LF);
++}
++
+ static char *skip_lws (char *s)
+ {
+     if (!s) return NULL;
+     
+     /* skipping spaces: */
+-    while (s[0] == ' ' || s[0] == HT || s[0] == CR || s[0] == LF) {
++    while (is_lws_char(s[0])) {
+       if (s[0] == '\0') break;
+       s++;
+     }  
+@@ -750,17 +755,30 @@
+ static void get_pair(char **in, char **name, char **value)
+ {
+     char  *endpair;
+-    /* int    inQuotes; */
+     char  *curp = *in;
+     *name = NULL;
+     *value = NULL;
+     
+     if (curp == NULL) return;
+-    if (curp[0] == '\0') return;
+-    
+-    /* skipping spaces: */
+-    curp = skip_lws(curp);
+-    
++
++    while (curp[0] != '\0') {
++      /* skipping spaces: */
++      curp = skip_lws(curp);
++        
++      /* 'LWS "," LWS "," ...' is allowed by the DIGEST-MD5 ABNF */
++      if (curp[0] == ',') {
++          curp++;
++      } else {
++          break;
++      }
++    }
++
++    if (curp[0] == '\0') {
++      /* End of the string is not an error */
++      *name = "";
++      return;
++    }
++
+     *name = curp;
+     
+     curp = skip_token(curp,1);
+@@ -787,22 +805,24 @@
+     endpair = unquote (curp);
+     if (endpair == NULL) { /* Unbalanced quotes */ 
+       *name = NULL;
++      *value = NULL;
+       return;
+     }
+-    if (endpair[0] != ',') {
+-      if (endpair[0]!='\0') {
+-          *endpair++ = '\0'; 
+-      }
++
++    /* An optional LWS is allowed after the value. Skip it. */
++    if (is_lws_char (endpair[0])) {
++      /* Remove the trailing LWS from the value */
++      *endpair++ = '\0'; 
++      endpair = skip_lws(endpair);
+     }
+-    
+-    endpair = skip_lws(endpair);
+-    
++
+     /* syntax check: MUST be '\0' or ',' */  
+     if (endpair[0] == ',') {
+       endpair[0] = '\0';
+       endpair++; /* skipping <,> */
+     } else if (endpair[0] != '\0') { 
+       *name = NULL;
++      *value = NULL;
+       return;
+     }
+     
+@@ -2090,9 +2110,17 @@
+       char           *name = NULL, *value = NULL;
+       get_pair(&in, &name, &value);
+       
+-      if (name == NULL)
+-          break;
++      if (name == NULL) {
++          SETERROR(sparams->utils,
++                   "Parse error");
++          result = SASL_BADAUTH;
++          goto FreeAllMem;
++      }
+       
++      if (*name == '\0') {
++          break;
++      }
++
+       /* Extracting parameters */
+       
+       /*
+@@ -3222,10 +3250,14 @@
+       /* if parse error */
+       if (name == NULL) {
+           params->utils->seterror(params->utils->conn, 0, "Parse error");
+-          result = SASL_FAIL;
++          result = SASL_BADAUTH;
+           goto FreeAllocatedMem;
+       }
+       
++      if (*name == '\0') {
++          break;
++      }
++
+       if (strcasecmp(name, "realm") == 0) {
+           nrealm++;
+           
+@@ -3887,9 +3919,14 @@
+       if (name == NULL) {
+           params->utils->seterror(params->utils->conn, 0,
+                                   "DIGEST-MD5 Received Garbage");
++          result = SASL_BADAUTH;
+           break;
+       }
+       
++      if (*name == '\0') {
++          break;
++      }
++
+       if (strcasecmp(name, "rspauth") == 0) {
+           
+           if (strcmp(text->response_value, value) != 0) {
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to