comparison src/core/ngx_resolver.c @ 7862:60a1d97bedfe stable-1.20

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 0b884e47bb79
children 4364b39de407
comparison
equal deleted inserted replaced
7861:0b884e47bb79 7862:60a1d97bedfe
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