|
@@ -174,14 +174,24 @@ remove_bad_file(const struct mg_connection *conn, const char *path)
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
-search_boundary(const char *buf, const char *boundary, size_t bl)
|
|
|
+search_boundary(const char *buf,
|
|
|
+ size_t buf_len,
|
|
|
+ const char *boundary,
|
|
|
+ size_t boundary_len)
|
|
|
{
|
|
|
- const char *next = strstr(buf, "\r\n--");
|
|
|
- while (next && (strncmp(next + 4, boundary, bl))) {
|
|
|
- /* found "--" not followed by boundary: look for next "--" */
|
|
|
- next = strstr(next + 1, "\r\n--");
|
|
|
+ /* We must do a binary search here, not a string search, since the buffer
|
|
|
+ * may contain '\x00' bytes, if binary data is transfered. */
|
|
|
+ int clen = (int)buf_len - (int)boundary_len - 4;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i <= clen; i++) {
|
|
|
+ if (!memcmp(buf + i, "\r\n--", 4)) {
|
|
|
+ if (!memcmp(buf + i + 4, boundary, boundary_len)) {
|
|
|
+ return buf + i;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- return next;
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -630,7 +640,7 @@ mg_handle_form_data(struct mg_connection *conn,
|
|
|
|
|
|
/* If the boundary is already in the buffer, get the address,
|
|
|
* otherwise next will be NULL. */
|
|
|
- next = search_boundary(hbuf, boundary, bl);
|
|
|
+ next = search_boundary(hbuf, buf - hbuf + buf_fill, boundary, bl);
|
|
|
|
|
|
if (disposition == FORM_DISPOSITION_GET) {
|
|
|
if (!next) {
|
|
@@ -705,7 +715,7 @@ mg_handle_form_data(struct mg_connection *conn,
|
|
|
}
|
|
|
|
|
|
/* Find boundary */
|
|
|
- next = search_boundary(buf, boundary, bl);
|
|
|
+ next = search_boundary(buf, buf_fill, boundary, bl);
|
|
|
}
|
|
|
|
|
|
if (fstore) {
|