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");