if ((nulpos = (char*)memchr(header_start, '\0', header_end - header_start))) {
debugs(55, DBG_IMPORTANT, "WARNING: HTTP header contains NULL characters {" <<
getStringPrefix(header_start, nulpos) << "}\nNULL\n{" << getStringPrefix(nulpos+1, header_end));
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
/* common format headers are "<name>:[ws]<value>" lines delimited by <CRLF>.
const char *this_line = field_ptr;
field_ptr = (const char *)memchr(field_ptr, '\n', header_end - field_ptr);
- if (!field_ptr)
- goto reset; /* missing <LF> */
+ if (!field_ptr) {
+ // missing <LF>
+ PROF_stop(HttpHeaderParse);
+ return reset();
+ }
field_end = field_ptr;
debugs(55, DBG_IMPORTANT, "SECURITY WARNING: Rejecting HTTP request with a CR+ "
"header field to prevent request smuggling attacks: {" <<
getStringPrefix(header_start, header_end) << "}");
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
}
}
*p = ' ';
++p;
}
- } else
- goto reset;
+ } else {
+ PROF_stop(HttpHeaderParse);
+ return reset();
+ }
}
if (this_line + 1 == field_end && this_line > field_start) {
debugs(55, warnOnError, "WARNING: Blank continuation line in HTTP header {" <<
getStringPrefix(header_start, header_end) << "}");
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
} while (field_ptr < header_end && (*field_ptr == ' ' || *field_ptr == '\t'));
if (field_ptr < header_end) {
debugs(55, warnOnError, "WARNING: unparseable HTTP header field near {" <<
getStringPrefix(field_start, header_end) << "}");
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
break; /* terminating blank line */
if (Config.onoff.relaxed_header_parser)
continue;
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
if (e->id == HDR_CONTENT_LENGTH && (e2 = findEntry(e->id)) != NULL) {
if (!Config.onoff.relaxed_header_parser) {
delete e;
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
if (!httpHeaderParseOffset(e->value.termedBuf(), &l1)) {
if (Config.onoff.relaxed_header_parser)
continue;
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
}
if (!Config.onoff.relaxed_header_parser) {
delete e;
- goto reset;
+ PROF_stop(HttpHeaderParse);
+ return reset();
}
}
PROF_stop(HttpHeaderParse);
return 1; /* even if no fields where found, it is a valid header */
-reset:
- PROF_stop(HttpHeaderParse);
- return reset();
}
/* packs all the entries using supplied packer */