|
@@ -324,12 +324,11 @@ encode_link_specifiers(const smartlist_t *specs)
|
|
|
|
|
|
link_specifier_list_set_n_spec(lslist, smartlist_len(specs));
|
|
|
|
|
|
- SMARTLIST_FOREACH_BEGIN(specs, const hs_desc_link_specifier_t *,
|
|
|
+ SMARTLIST_FOREACH_BEGIN(specs, const link_specifier_t *,
|
|
|
spec) {
|
|
|
- link_specifier_t *ls = hs_desc_lspec_to_trunnel(spec);
|
|
|
- if (ls) {
|
|
|
- link_specifier_list_add_spec(lslist, ls);
|
|
|
- }
|
|
|
+ link_specifier_t *ls = link_specifier_dup(spec);
|
|
|
+ tor_assert(ls);
|
|
|
+ link_specifier_list_add_spec(lslist, ls);
|
|
|
} SMARTLIST_FOREACH_END(spec);
|
|
|
|
|
|
{
|
|
@@ -1190,52 +1189,22 @@ decode_link_specifiers(const char *encoded)
|
|
|
results = smartlist_new();
|
|
|
|
|
|
for (i = 0; i < link_specifier_list_getlen_spec(specs); i++) {
|
|
|
- hs_desc_link_specifier_t *hs_spec;
|
|
|
link_specifier_t *ls = link_specifier_list_get_spec(specs, i);
|
|
|
- tor_assert(ls);
|
|
|
-
|
|
|
- hs_spec = tor_malloc_zero(sizeof(*hs_spec));
|
|
|
- hs_spec->type = link_specifier_get_ls_type(ls);
|
|
|
- switch (hs_spec->type) {
|
|
|
- case LS_IPV4:
|
|
|
- tor_addr_from_ipv4h(&hs_spec->u.ap.addr,
|
|
|
- link_specifier_get_un_ipv4_addr(ls));
|
|
|
- hs_spec->u.ap.port = link_specifier_get_un_ipv4_port(ls);
|
|
|
- break;
|
|
|
- case LS_IPV6:
|
|
|
- tor_addr_from_ipv6_bytes(&hs_spec->u.ap.addr, (const char *)
|
|
|
- link_specifier_getarray_un_ipv6_addr(ls));
|
|
|
- hs_spec->u.ap.port = link_specifier_get_un_ipv6_port(ls);
|
|
|
- break;
|
|
|
- case LS_LEGACY_ID:
|
|
|
-
|
|
|
- * else we can copy memory out of bound. */
|
|
|
- tor_assert(link_specifier_getlen_un_legacy_id(ls) ==
|
|
|
- sizeof(hs_spec->u.legacy_id));
|
|
|
- memcpy(hs_spec->u.legacy_id, link_specifier_getarray_un_legacy_id(ls),
|
|
|
- sizeof(hs_spec->u.legacy_id));
|
|
|
- break;
|
|
|
- case LS_ED25519_ID:
|
|
|
-
|
|
|
- * else we can copy memory out of bound. */
|
|
|
- tor_assert(link_specifier_getlen_un_ed25519_id(ls) ==
|
|
|
- sizeof(hs_spec->u.ed25519_id));
|
|
|
- memcpy(hs_spec->u.ed25519_id,
|
|
|
- link_specifier_getconstarray_un_ed25519_id(ls),
|
|
|
- sizeof(hs_spec->u.ed25519_id));
|
|
|
- break;
|
|
|
- default:
|
|
|
- tor_free(hs_spec);
|
|
|
+ if (BUG(!ls)) {
|
|
|
goto err;
|
|
|
}
|
|
|
-
|
|
|
- smartlist_add(results, hs_spec);
|
|
|
+ link_specifier_t *ls_dup = link_specifier_dup(ls);
|
|
|
+ if (BUG(!ls_dup)) {
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+ smartlist_add(results, ls_dup);
|
|
|
}
|
|
|
|
|
|
goto done;
|
|
|
err:
|
|
|
if (results) {
|
|
|
- SMARTLIST_FOREACH(results, hs_desc_link_specifier_t *, s, tor_free(s));
|
|
|
+ SMARTLIST_FOREACH(results, link_specifier_t *, s,
|
|
|
+ link_specifier_free(s));
|
|
|
smartlist_free(results);
|
|
|
results = NULL;
|
|
|
}
|
|
@@ -2878,8 +2847,8 @@ hs_desc_intro_point_free_(hs_desc_intro_point_t *ip)
|
|
|
return;
|
|
|
}
|
|
|
if (ip->link_specifiers) {
|
|
|
- SMARTLIST_FOREACH(ip->link_specifiers, hs_desc_link_specifier_t *,
|
|
|
- ls, hs_desc_link_specifier_free(ls));
|
|
|
+ SMARTLIST_FOREACH(ip->link_specifiers, link_specifier_t *,
|
|
|
+ ls, link_specifier_free(ls));
|
|
|
smartlist_free(ip->link_specifiers);
|
|
|
}
|
|
|
tor_cert_free(ip->auth_key_cert);
|
|
@@ -2972,69 +2941,6 @@ hs_desc_authorized_client_free_(hs_desc_authorized_client_t *client)
|
|
|
tor_free(client);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-void
|
|
|
-hs_desc_link_specifier_free_(hs_desc_link_specifier_t *ls)
|
|
|
-{
|
|
|
- if (ls == NULL) {
|
|
|
- return;
|
|
|
- }
|
|
|
- tor_free(ls);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
- * info and requested type. Return NULL on error. */
|
|
|
-hs_desc_link_specifier_t *
|
|
|
-hs_desc_link_specifier_new(const extend_info_t *info, uint8_t type)
|
|
|
-{
|
|
|
- hs_desc_link_specifier_t *ls = NULL;
|
|
|
-
|
|
|
- tor_assert(info);
|
|
|
-
|
|
|
- ls = tor_malloc_zero(sizeof(*ls));
|
|
|
- ls->type = type;
|
|
|
- switch (ls->type) {
|
|
|
- case LS_IPV4:
|
|
|
- if (info->addr.family != AF_INET) {
|
|
|
- goto err;
|
|
|
- }
|
|
|
- tor_addr_copy(&ls->u.ap.addr, &info->addr);
|
|
|
- ls->u.ap.port = info->port;
|
|
|
- break;
|
|
|
- case LS_IPV6:
|
|
|
- if (info->addr.family != AF_INET6) {
|
|
|
- goto err;
|
|
|
- }
|
|
|
- tor_addr_copy(&ls->u.ap.addr, &info->addr);
|
|
|
- ls->u.ap.port = info->port;
|
|
|
- break;
|
|
|
- case LS_LEGACY_ID:
|
|
|
-
|
|
|
- if (BUG(tor_mem_is_zero(info->identity_digest,
|
|
|
- sizeof(info->identity_digest)))) {
|
|
|
- goto err;
|
|
|
- }
|
|
|
- memcpy(ls->u.legacy_id, info->identity_digest, sizeof(ls->u.legacy_id));
|
|
|
- break;
|
|
|
- case LS_ED25519_ID:
|
|
|
-
|
|
|
- if (ed25519_public_key_is_zero(&info->ed_identity)) {
|
|
|
- goto err;
|
|
|
- }
|
|
|
- memcpy(ls->u.ed25519_id, info->ed_identity.pubkey,
|
|
|
- sizeof(ls->u.ed25519_id));
|
|
|
- break;
|
|
|
- default:
|
|
|
-
|
|
|
- tor_assert(0);
|
|
|
- }
|
|
|
-
|
|
|
- return ls;
|
|
|
- err:
|
|
|
- tor_free(ls);
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
void
|
|
|
hs_descriptor_clear_intro_points(hs_descriptor_t *desc)
|
|
@@ -3050,59 +2956,3 @@ hs_descriptor_clear_intro_points(hs_descriptor_t *desc)
|
|
|
smartlist_clear(ips);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- * link specifier object that is the encoded representation of spec. Return
|
|
|
- * NULL on error. */
|
|
|
-link_specifier_t *
|
|
|
-hs_desc_lspec_to_trunnel(const hs_desc_link_specifier_t *spec)
|
|
|
-{
|
|
|
- tor_assert(spec);
|
|
|
-
|
|
|
- link_specifier_t *ls = link_specifier_new();
|
|
|
- link_specifier_set_ls_type(ls, spec->type);
|
|
|
-
|
|
|
- switch (spec->type) {
|
|
|
- case LS_IPV4:
|
|
|
- link_specifier_set_un_ipv4_addr(ls,
|
|
|
- tor_addr_to_ipv4h(&spec->u.ap.addr));
|
|
|
- link_specifier_set_un_ipv4_port(ls, spec->u.ap.port);
|
|
|
-
|
|
|
- link_specifier_set_ls_len(ls, sizeof(spec->u.ap.addr.addr.in_addr) +
|
|
|
- sizeof(spec->u.ap.port));
|
|
|
- break;
|
|
|
- case LS_IPV6:
|
|
|
- {
|
|
|
- size_t addr_len = link_specifier_getlen_un_ipv6_addr(ls);
|
|
|
- const uint8_t *in6_addr = tor_addr_to_in6_addr8(&spec->u.ap.addr);
|
|
|
- uint8_t *ipv6_array = link_specifier_getarray_un_ipv6_addr(ls);
|
|
|
- memcpy(ipv6_array, in6_addr, addr_len);
|
|
|
- link_specifier_set_un_ipv6_port(ls, spec->u.ap.port);
|
|
|
-
|
|
|
- link_specifier_set_ls_len(ls, addr_len + sizeof(spec->u.ap.port));
|
|
|
- break;
|
|
|
- }
|
|
|
- case LS_LEGACY_ID:
|
|
|
- {
|
|
|
- size_t legacy_id_len = link_specifier_getlen_un_legacy_id(ls);
|
|
|
- uint8_t *legacy_id_array = link_specifier_getarray_un_legacy_id(ls);
|
|
|
- memcpy(legacy_id_array, spec->u.legacy_id, legacy_id_len);
|
|
|
- link_specifier_set_ls_len(ls, legacy_id_len);
|
|
|
- break;
|
|
|
- }
|
|
|
- case LS_ED25519_ID:
|
|
|
- {
|
|
|
- size_t ed25519_id_len = link_specifier_getlen_un_ed25519_id(ls);
|
|
|
- uint8_t *ed25519_id_array = link_specifier_getarray_un_ed25519_id(ls);
|
|
|
- memcpy(ed25519_id_array, spec->u.ed25519_id, ed25519_id_len);
|
|
|
- link_specifier_set_ls_len(ls, ed25519_id_len);
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- tor_assert_nonfatal_unreached();
|
|
|
- link_specifier_free(ls);
|
|
|
- ls = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- return ls;
|
|
|
-}
|