100
100
static const char *
101
find_boundary (const char *start, const char *boundary, int boundary_len)
101
find_boundary (const char *start, const char *end,
102
const char *boundary, int boundary_len)
106
while ((b = strstr (end, boundary))) {
107
end = b + boundary_len;
108
if (b[-1] == '-' && b[-2] == '-' &&
109
(b == start + 2 || (b[-3] == '\n' && b[-4] == '\r'))) {
110
if ((end[0] == '-' && end[1] == '-') ||
111
(end[0] == '\r' && end[1] == '\n'))
106
for (b = memchr (start, '-', end - start);
107
b && b + boundary_len + 4 < end;
108
b = memchr (b + 2, '-', end - (b + 2))) {
109
/* Check for "--boundary" */
111
memcmp (b + 2, boundary, boundary_len) != 0)
114
/* Check that it's at start of line */
115
if (!(b == start || (b[-1] == '\n' && b[-2] == '\r')))
118
/* Check for "--" or "\r\n" after boundary */
119
if ((b[boundary_len + 2] == '-' && b[boundary_len + 3] == '-') ||
120
(b[boundary_len + 2] == '\r' && b[boundary_len + 3] == '\n'))
136
144
GHashTable *params;
137
145
int boundary_len;
138
146
SoupBuffer *flattened;
139
const char *start, *split, *end;
147
const char *start, *split, *end, *body_end;
140
148
SoupMessageHeaders *part_headers;
141
149
SoupBuffer *part_body;
155
163
g_hash_table_destroy (params);
157
165
flattened = soup_message_body_flatten (body);
166
body_end = flattened->data + flattened->length;
158
167
boundary = multipart->boundary;
159
168
boundary_len = strlen (boundary);
161
170
/* skip preamble */
162
start = find_boundary (flattened->data, boundary, boundary_len);
171
start = find_boundary (flattened->data, body_end,
172
boundary, boundary_len);
164
174
soup_multipart_free (multipart);
165
175
soup_buffer_free (flattened);
169
179
while (start[2 + boundary_len] != '-') {
170
end = find_boundary (start + 2 + boundary_len, boundary, boundary_len);
180
end = find_boundary (start + 2 + boundary_len, body_end,
181
boundary, boundary_len);
172
183
soup_multipart_free (multipart);
173
184
soup_buffer_free (flattened);