nlist_t* nets_make_list(vscf_data_t* nets_cfg, dclists_t* dclists, const char* map_name) { nlist_t* nl = nlist_new(map_name, false); if(nets_cfg) { dmn_assert(vscf_is_hash(nets_cfg)); if(nets_parse(nets_cfg, dclists, map_name, nl)) { nlist_destroy(nl); nl = NULL; } } if(nl) { // This masks out the 5x v4-like spaces that we *never* // lookup directly. These "NN_UNDEF" dclists will // never be seen by runtime lookups. The only // reason these exist is so that supernets and // adjacent networks get proper masks. Otherwise // lookups in these nearby spaces might return // oversized edns-client-subnet masks and cause // the cache to affect lookup of these spaces... nlist_append(nl, start_v4mapped, 96, NN_UNDEF); nlist_append(nl, start_siit, 96, NN_UNDEF); nlist_append(nl, start_wkp, 96, NN_UNDEF); nlist_append(nl, start_6to4, 16, NN_UNDEF); nlist_append(nl, start_teredo, 32, NN_UNDEF); nlist_finish(nl); } return nl; }
F_NONNULL F_NOINLINE static void isolate_jmp(geoip2_t* db, nlist_t** nl) { dmn_assert(db); dmn_assert(nl); *nl = nlist_new(db->map_name, true); if(!sigsetjmp(db->jbuf, 0)) { geoip2_list_xlate(db, *nl); nlist_finish(*nl); } else { nlist_destroy(*nl); *nl = NULL; } }