options helpers: fix dereference to properly return params

pull/606/head
Brad House 1 year ago
parent a76c95a6d7
commit 6eff8f65c6
  1. 34
      src/lib/ares_dns_record.c

@ -850,25 +850,25 @@ const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr,
size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr, size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr,
ares_dns_rr_key_t key) ares_dns_rr_key_t key)
{ {
const ares__dns_options_t *opts; ares__dns_options_t * const *opts;
if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) { if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
return 0; return 0;
} }
opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
if (opts == NULL) { if (opts == NULL || *opts == NULL) {
return 0; return 0;
} }
return opts->cnt; return (*opts)->cnt;
} }
unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr,
ares_dns_rr_key_t key, size_t idx, ares_dns_rr_key_t key, size_t idx,
const unsigned char **val, size_t *val_len) const unsigned char **val, size_t *val_len)
{ {
const ares__dns_options_t *opts; ares__dns_options_t * const *opts;
if (val) { if (val) {
*val = NULL; *val = NULL;
@ -882,30 +882,30 @@ unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr,
} }
opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
if (opts == NULL) { if (opts == NULL || *opts == NULL) {
return 65535; return 65535;
} }
if (idx >= opts->cnt) { if (idx >= (*opts)->cnt) {
return 65535; return 65535;
} }
if (val) { if (val) {
*val = opts->optval[idx].val; *val = (*opts)->optval[idx].val;
} }
if (val_len) { if (val_len) {
*val_len = opts->optval[idx].val_len; *val_len = (*opts)->optval[idx].val_len;
} }
return opts->optval[idx].opt; return (*opts)->optval[idx].opt;
} }
ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr, ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr,
ares_dns_rr_key_t key, unsigned short opt, ares_dns_rr_key_t key, unsigned short opt,
const unsigned char **val, size_t *val_len) const unsigned char **val, size_t *val_len)
{ {
const ares__dns_options_t *opts; ares__dns_options_t * const *opts;
size_t i; size_t i;
if (val) { if (val) {
*val = NULL; *val = NULL;
@ -919,25 +919,25 @@ ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr,
} }
opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL); opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
if (opts == NULL) { if (opts == NULL || *opts == NULL) {
return ARES_FALSE; return ARES_FALSE;
} }
for (i = 0; i < opts->cnt; i++) { for (i = 0; i < (*opts)->cnt; i++) {
if (opts->optval[i].opt == opt) { if ((*opts)->optval[i].opt == opt) {
break; break;
} }
} }
if (i >= opts->cnt) { if (i >= (*opts)->cnt) {
return ARES_FALSE; return ARES_FALSE;
} }
if (val) { if (val) {
*val = opts->optval[i].val; *val = (*opts)->optval[i].val;
} }
if (val_len) { if (val_len) {
*val_len = opts->optval[i].val_len; *val_len = (*opts)->optval[i].val_len;
} }
return ARES_TRUE; return ARES_TRUE;
} }

Loading…
Cancel
Save