comparison src/core/ngx_hash.c @ 4689:d2ed9fee092b

Fixed handling of conflicting wildcard server names. With previous code wildcard names were added to hash even if conflict was detected. This resulted in identical names in hash and segfault later in ngx_hash_wildcard_init().
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 18 Jun 2012 14:06:00 +0000
parents d620f497c50f
children c348dea081fb
comparison
equal deleted inserted replaced
4688:5fedb27c3e36 4689:d2ed9fee092b
922 hwc = &ha->dns_wc_tail; 922 hwc = &ha->dns_wc_tail;
923 keys = &ha->dns_wc_tail_hash[k]; 923 keys = &ha->dns_wc_tail_hash[k];
924 } 924 }
925 925
926 926
927 /* check conflicts in wildcard hash */
928
929 name = keys->elts;
930
931 if (name) {
932 len = last - skip;
933
934 for (i = 0; i < keys->nelts; i++) {
935 if (len != name[i].len) {
936 continue;
937 }
938
939 if (ngx_strncmp(key->data + skip, name[i].data, len) == 0) {
940 return NGX_BUSY;
941 }
942 }
943
944 } else {
945 if (ngx_array_init(keys, ha->temp_pool, 4, sizeof(ngx_str_t)) != NGX_OK)
946 {
947 return NGX_ERROR;
948 }
949 }
950
951 name = ngx_array_push(keys);
952 if (name == NULL) {
953 return NGX_ERROR;
954 }
955
956 name->len = last - skip;
957 name->data = ngx_pnalloc(ha->temp_pool, name->len);
958 if (name->data == NULL) {
959 return NGX_ERROR;
960 }
961
962 ngx_memcpy(name->data, key->data + skip, name->len);
963
964
965 /* add to wildcard hash */
966
927 hk = ngx_array_push(hwc); 967 hk = ngx_array_push(hwc);
928 if (hk == NULL) { 968 if (hk == NULL) {
929 return NGX_ERROR; 969 return NGX_ERROR;
930 } 970 }
931 971
932 hk->key.len = last - 1; 972 hk->key.len = last - 1;
933 hk->key.data = p; 973 hk->key.data = p;
934 hk->key_hash = 0; 974 hk->key_hash = 0;
935 hk->value = value; 975 hk->value = value;
936 976
937
938 /* check conflicts in wildcard hash */
939
940 name = keys->elts;
941
942 if (name) {
943 len = last - skip;
944
945 for (i = 0; i < keys->nelts; i++) {
946 if (len != name[i].len) {
947 continue;
948 }
949
950 if (ngx_strncmp(key->data + skip, name[i].data, len) == 0) {
951 return NGX_BUSY;
952 }
953 }
954
955 } else {
956 if (ngx_array_init(keys, ha->temp_pool, 4, sizeof(ngx_str_t)) != NGX_OK)
957 {
958 return NGX_ERROR;
959 }
960 }
961
962 name = ngx_array_push(keys);
963 if (name == NULL) {
964 return NGX_ERROR;
965 }
966
967 name->len = last - skip;
968 name->data = ngx_pnalloc(ha->temp_pool, name->len);
969 if (name->data == NULL) {
970 return NGX_ERROR;
971 }
972
973 ngx_memcpy(name->data, key->data + skip, name->len);
974
975 return NGX_OK; 977 return NGX_OK;
976 } 978 }