comparison src/core/ngx_inet.c @ 454:a8424ffa495c NGINX_0_7_39

nginx 0.7.39 *) Bugfix: large response with SSI might hang, if gzipping was enabled; the bug had appeared in 0.7.28. Thanks to Artem Bokhan. *) Bugfix: a segmentation fault might occur in worker process, if short static variants are used in a "try_files" directive.
author Igor Sysoev <http://sysoev.ru>
date Mon, 02 Mar 2009 00:00:00 +0300
parents 20962db0117c
children 829f9a66a659
comparison
equal deleted inserted replaced
453:9ef0e36f3cd5 454:a8424ffa495c
224 224
225 225
226 /* AF_INET only */ 226 /* AF_INET only */
227 227
228 ngx_int_t 228 ngx_int_t
229 ngx_ptocidr(ngx_str_t *text, void *cidr) 229 ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr)
230 { 230 {
231 u_char *addr, *mask, *last; 231 u_char *addr, *mask, *last;
232 ngx_int_t shift; 232 ngx_int_t shift;
233 ngx_inet_cidr_t *in_cidr; 233
234
235 in_cidr = cidr;
236 addr = text->data; 234 addr = text->data;
237 last = addr + text->len; 235 last = addr + text->len;
238 236
239 mask = ngx_strlchr(addr, last, '/'); 237 mask = ngx_strlchr(addr, last, '/');
240 238
241 in_cidr->addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); 239 cidr->u.in.addr = ngx_inet_addr(addr, (mask ? mask : last) - addr);
242 240
243 if (in_cidr->addr == INADDR_NONE) { 241 if (cidr->u.in.addr == INADDR_NONE) {
244 return NGX_ERROR; 242 return NGX_ERROR;
245 } 243 }
246 244
247 if (mask == NULL) { 245 if (mask == NULL) {
248 in_cidr->mask = 0xffffffff; 246 cidr->family = AF_INET;
247 cidr->u.in.mask = 0xffffffff;
249 return NGX_OK; 248 return NGX_OK;
250 } 249 }
251 250
252 mask++; 251 mask++;
253 252
254 shift = ngx_atoi(mask, last - mask); 253 shift = ngx_atoi(mask, last - mask);
255 if (shift == NGX_ERROR) { 254 if (shift == NGX_ERROR) {
256 return NGX_ERROR; 255 return NGX_ERROR;
257 } 256 }
258 257
258 cidr->family = AF_INET;
259
259 if (shift == 0) { 260 if (shift == 0) {
260 261
261 /* the x86 compilers use the shl instruction that shifts by modulo 32 */ 262 /* the x86 compilers use the shl instruction that shifts by modulo 32 */
262 263
263 in_cidr->mask = 0; 264 cidr->u.in.mask = 0;
264 265
265 if (in_cidr->addr == 0) { 266 if (cidr->u.in.addr == 0) {
266 return NGX_OK; 267 return NGX_OK;
267 } 268 }
268 269
269 return NGX_DONE; 270 return NGX_DONE;
270 } 271 }
271 272
272 in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); 273 cidr->u.in.mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift))));
273 274
274 if (in_cidr->addr == (in_cidr->addr & in_cidr->mask)) { 275 if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) {
275 return NGX_OK; 276 return NGX_OK;
276 } 277 }
277 278
278 in_cidr->addr &= in_cidr->mask; 279 cidr->u.in.addr &= cidr->u.in.mask;
279 280
280 return NGX_DONE; 281 return NGX_DONE;
281 } 282 }
282 283
283 284