Mercurial > urweb
comparison src/c/fastcgi.c @ 862:66dbf3953758
Fix memory leak in fastcgi environment management
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sat, 27 Jun 2009 16:56:32 -0400 |
parents | bd153951c794 |
children | 305bc0a431de |
comparison
equal
deleted
inserted
replaced
861:bd153951c794 | 862:66dbf3953758 |
---|---|
170 char *name, *value; | 170 char *name, *value; |
171 unsigned name_len, value_len; | 171 unsigned name_len, value_len; |
172 } nvp; | 172 } nvp; |
173 | 173 |
174 static char *search_nvps(nvp *nvps, const char *h) { | 174 static char *search_nvps(nvp *nvps, const char *h) { |
175 for (; nvps->name; ++nvps) | 175 for (; nvps->name[0]; ++nvps) |
176 if (!strcmp(h, nvps->name)) | 176 if (!strcmp(h, nvps->name)) |
177 return nvps->value; | 177 return nvps->value; |
178 | 178 |
179 return NULL; | 179 return NULL; |
180 } | 180 } |
236 if ((valueLength = read_funny_len(&buf, &len)) < 0) | 236 if ((valueLength = read_funny_len(&buf, &len)) < 0) |
237 return -1; | 237 return -1; |
238 if (len < nameLength + valueLength) | 238 if (len < nameLength + valueLength) |
239 return -1; | 239 return -1; |
240 | 240 |
241 if (!nv->name || nameLength+1 > nv->name_len) { | 241 if (nameLength+1 > nv->name_len) { |
242 nv->name_len = nameLength+1; | 242 nv->name_len = nameLength+1; |
243 nv->name = nv->name ? realloc(nv->name, nv->name_len) : malloc(nv->name_len); | 243 nv->name = realloc(nv->name, nv->name_len); |
244 } | 244 } |
245 if (!nv->value || valueLength+1 > nv->value_len) { | 245 if (valueLength+1 > nv->value_len) { |
246 nv->value_len = valueLength+1; | 246 nv->value_len = valueLength+1; |
247 nv->value = nv->value ? realloc(nv->value, nv->value_len) : malloc(nv->value_len); | 247 nv->value = realloc(nv->value, nv->value_len); |
248 } | 248 } |
249 | 249 |
250 memcpy(nv->name, buf, nameLength); | 250 memcpy(nv->name, buf, nameLength); |
251 nv->name[nameLength] = 0; | 251 nv->name[nameLength] = 0; |
252 | 252 |
271 | 271 |
272 hs.uppercased = malloc(0); | 272 hs.uppercased = malloc(0); |
273 hs.uppercased_len = 0; | 273 hs.uppercased_len = 0; |
274 hs.nvps = malloc(sizeof(nvp)); | 274 hs.nvps = malloc(sizeof(nvp)); |
275 hs.n_nvps = 1; | 275 hs.n_nvps = 1; |
276 hs.nvps[0].name = malloc(1); | |
277 hs.nvps[0].name_len = 1; | |
278 hs.nvps[0].value = malloc(0); | |
279 hs.nvps[0].value_len = 0; | |
276 | 280 |
277 while (1) { | 281 while (1) { |
278 FCGI_Record *r; | 282 FCGI_Record *r; |
279 size_t used_nvps = 0; | 283 size_t used_nvps = 0; |
280 int body_len, body_read; | 284 int body_len, body_read; |
313 break; | 317 break; |
314 | 318 |
315 if (used_nvps == hs.n_nvps-1) { | 319 if (used_nvps == hs.n_nvps-1) { |
316 ++hs.n_nvps; | 320 ++hs.n_nvps; |
317 hs.nvps = realloc(hs.nvps, hs.n_nvps * sizeof(nvp)); | 321 hs.nvps = realloc(hs.nvps, hs.n_nvps * sizeof(nvp)); |
318 hs.nvps[used_nvps].name = malloc(0); | 322 hs.nvps[hs.n_nvps-1].name = malloc(1); |
319 hs.nvps[used_nvps].value = malloc(0); | 323 hs.nvps[hs.n_nvps-1].value = malloc(0); |
320 hs.nvps[used_nvps].name_len = 0; | 324 hs.nvps[hs.n_nvps-1].name_len = 1; |
321 hs.nvps[used_nvps].value_len = 0; | 325 hs.nvps[hs.n_nvps-1].value_len = 0; |
322 } | 326 } |
323 | 327 |
324 if (read_nvp(r->contentData, (r->contentLengthB1 << 8) | r->contentLengthB0, &hs.nvps[used_nvps]) < 0) { | 328 if (read_nvp(r->contentData, (r->contentLengthB1 << 8) | r->contentLengthB0, &hs.nvps[used_nvps]) < 0) { |
325 write_stderr(out, "Error reading FCGI_PARAMS name-value pair\n"); | 329 write_stderr(out, "Error reading FCGI_PARAMS name-value pair\n"); |
326 goto done; | 330 goto done; |
327 } | 331 } |
328 | 332 |
329 ++used_nvps; | 333 ++used_nvps; |
330 } | 334 } |
331 | 335 |
332 hs.nvps[used_nvps].name = NULL; | 336 hs.nvps[used_nvps].name[0] = 0; |
333 | 337 |
334 if (s = get_header(&hs, "Content-Length")) { | 338 if (s = get_header(&hs, "Content-Length")) { |
335 body_len = atoi(s); | 339 body_len = atoi(s); |
336 if (body_len < 0) { | 340 if (body_len < 0) { |
337 write_stderr(out, "Invalid Content-Length\n"); | 341 write_stderr(out, "Invalid Content-Length\n"); |