Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 7853:4ebe1251a8c3
Resolver: simplified ngx_resolver_copy().
Instead of checking on each label if we need to place a dot or not,
now it always adds a dot after a label, and reduces the resulting
length afterwards.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Tue, 25 May 2021 15:17:45 +0300 |
parents | 771743838cbd |
children | 4364b39de407 |
comparison
equal
deleted
inserted
replaced
7852:771743838cbd | 7853:4ebe1251a8c3 |
---|---|
3937 ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src, | 3937 ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src, |
3938 u_char *last) | 3938 u_char *last) |
3939 { | 3939 { |
3940 char *err; | 3940 char *err; |
3941 u_char *p, *dst; | 3941 u_char *p, *dst; |
3942 ssize_t len; | 3942 size_t len; |
3943 ngx_uint_t i, n; | 3943 ngx_uint_t i, n; |
3944 | 3944 |
3945 p = src; | 3945 p = src; |
3946 len = -1; | 3946 len = 0; |
3947 | 3947 |
3948 /* | 3948 /* |
3949 * compression pointers allow to create endless loop, so we set limit; | 3949 * compression pointers allow to create endless loop, so we set limit; |
3950 * 128 pointers should be enough to store 255-byte name | 3950 * 128 pointers should be enough to store 255-byte name |
3951 */ | 3951 */ |
3994 | 3994 |
3995 if (name == NULL) { | 3995 if (name == NULL) { |
3996 return NGX_OK; | 3996 return NGX_OK; |
3997 } | 3997 } |
3998 | 3998 |
3999 if (len == -1) { | 3999 if (len == 0) { |
4000 ngx_str_null(name); | 4000 ngx_str_null(name); |
4001 return NGX_OK; | 4001 return NGX_OK; |
4002 } | 4002 } |
4003 | 4003 |
4004 dst = ngx_resolver_alloc(r, len); | 4004 dst = ngx_resolver_alloc(r, len); |
4010 | 4010 |
4011 for ( ;; ) { | 4011 for ( ;; ) { |
4012 n = *src++; | 4012 n = *src++; |
4013 | 4013 |
4014 if (n == 0) { | 4014 if (n == 0) { |
4015 name->len = dst - name->data; | 4015 name->len = dst - name->data - 1; |
4016 return NGX_OK; | 4016 return NGX_OK; |
4017 } | 4017 } |
4018 | 4018 |
4019 if (n & 0xc0) { | 4019 if (n & 0xc0) { |
4020 n = ((n & 0x3f) << 8) + *src; | 4020 n = ((n & 0x3f) << 8) + *src; |
4021 src = &buf[n]; | 4021 src = &buf[n]; |
4022 | 4022 |
4023 } else { | 4023 } else { |
4024 if (dst != name->data) { | |
4025 *dst++ = '.'; | |
4026 } | |
4027 | |
4028 ngx_strlow(dst, src, n); | 4024 ngx_strlow(dst, src, n); |
4029 dst += n; | 4025 dst += n; |
4030 src += n; | 4026 src += n; |
4027 *dst++ = '.'; | |
4031 } | 4028 } |
4032 } | 4029 } |
4033 } | 4030 } |
4034 | 4031 |
4035 | 4032 |