Mercurial > urweb
comparison src/c/http.c @ 2070:382911d72e63
Check realloc's return code to prevent segfault on out of memory condition (Part 3)
author | Sergey Mironov <grrwlf@gmail.com> |
---|---|
date | Tue, 02 Sep 2014 17:37:22 +0000 |
parents | 262dd74df39c |
children | 739172204214 |
comparison
equal
deleted
inserted
replaced
2069:262dd74df39c | 2070:382911d72e63 |
---|---|
95 int r; | 95 int r; |
96 char *method, *path, *query_string, *headers, *body, *after, *s, *s2; | 96 char *method, *path, *query_string, *headers, *body, *after, *s, *s2; |
97 | 97 |
98 if (back - buf == buf_size - 1) { | 98 if (back - buf == buf_size - 1) { |
99 char *new_buf; | 99 char *new_buf; |
100 buf_size *= 2; | 100 size_t new_buf_size = buf_size*2; |
101 new_buf = realloc(buf, buf_size); | 101 new_buf = realloc(buf, new_buf_size); |
102 if(!new_buf) { | |
103 qfprintf(stderr, "Realloc failed while receiving header\n"); | |
104 close(sock); | |
105 sock = 0; | |
106 break; | |
107 } | |
108 buf_size = new_buf_size; | |
102 back = new_buf + (back - buf); | 109 back = new_buf + (back - buf); |
103 buf = new_buf; | 110 buf = new_buf; |
104 } | 111 } |
105 | 112 |
106 *back = 0; | 113 *back = 0; |
144 } | 151 } |
145 | 152 |
146 while (back - body < clen) { | 153 while (back - body < clen) { |
147 if (back - buf == buf_size - 1) { | 154 if (back - buf == buf_size - 1) { |
148 char *new_buf; | 155 char *new_buf; |
149 buf_size *= 2; | 156 size_t new_buf_size = buf_size * 2; |
150 new_buf = realloc(buf, buf_size); | 157 new_buf = realloc(buf, new_buf_size); |
151 | 158 if(!new_buf) { |
159 qfprintf(stderr, "Realloc failed while receiving content\n"); | |
160 close(sock); | |
161 sock = 0; | |
162 goto done; | |
163 } | |
164 | |
165 buf_size = new_buf_size; | |
152 back = new_buf + (back - buf); | 166 back = new_buf + (back - buf); |
153 body = new_buf + (body - buf); | 167 body = new_buf + (body - buf); |
154 s = new_buf + (s - buf); | 168 s = new_buf + (s - buf); |
155 | 169 |
156 buf = new_buf; | 170 buf = new_buf; |