1 Pulled from CVS, Ident strings removed to let the patch apply pretty cleanly.
3 ===================================================================
4 RCS file: /afs/andrew.cmu.edu/system/cvs/src/sasl/plugins/digestmd5.c,v
5 retrieving revision 1.183
6 retrieving revision 1.184
7 diff -u -r1.183 -r1.184
8 --- src/sasl/plugins/digestmd5.c 2006/11/27 20:41:55 1.183
9 +++ src/sasl/plugins/digestmd5.c 2007/02/14 17:16:14 1.184
14 +static int is_lws_char (char c)
16 + return (c == ' ' || c == HT || c == CR || c == LF);
19 static char *skip_lws (char *s)
23 /* skipping spaces: */
24 - while (s[0] == ' ' || s[0] == HT || s[0] == CR || s[0] == LF) {
25 + while (is_lws_char(s[0])) {
26 if (s[0] == '\0') break;
30 static void get_pair(char **in, char **name, char **value)
38 if (curp == NULL) return;
39 - if (curp[0] == '\0') return;
41 - /* skipping spaces: */
42 - curp = skip_lws(curp);
45 + while (curp[0] != '\0') {
46 + /* skipping spaces: */
47 + curp = skip_lws(curp);
49 + /* 'LWS "," LWS "," ...' is allowed by the DIGEST-MD5 ABNF */
50 + if (curp[0] == ',') {
57 + if (curp[0] == '\0') {
58 + /* End of the string is not an error */
65 curp = skip_token(curp,1);
67 endpair = unquote (curp);
68 if (endpair == NULL) { /* Unbalanced quotes */
73 - if (endpair[0] != ',') {
74 - if (endpair[0]!='\0') {
78 + /* An optional LWS is allowed after the value. Skip it. */
79 + if (is_lws_char (endpair[0])) {
80 + /* Remove the trailing LWS from the value */
82 + endpair = skip_lws(endpair);
85 - endpair = skip_lws(endpair);
88 /* syntax check: MUST be '\0' or ',' */
89 if (endpair[0] == ',') {
91 endpair++; /* skipping <,> */
92 } else if (endpair[0] != '\0') {
98 @@ -2090,9 +2110,17 @@
99 char *name = NULL, *value = NULL;
100 get_pair(&in, &name, &value);
104 + if (name == NULL) {
105 + SETERROR(sparams->utils,
107 + result = SASL_BADAUTH;
111 + if (*name == '\0') {
115 /* Extracting parameters */
118 @@ -3222,10 +3250,14 @@
121 params->utils->seterror(params->utils->conn, 0, "Parse error");
122 - result = SASL_FAIL;
123 + result = SASL_BADAUTH;
124 goto FreeAllocatedMem;
127 + if (*name == '\0') {
131 if (strcasecmp(name, "realm") == 0) {
134 @@ -3887,9 +3919,14 @@
136 params->utils->seterror(params->utils->conn, 0,
137 "DIGEST-MD5 Received Garbage");
138 + result = SASL_BADAUTH;
142 + if (*name == '\0') {
146 if (strcasecmp(name, "rspauth") == 0) {
148 if (strcmp(text->response_value, value) != 0) {