Brad House provided a fix for ares_save_options(): Apparently I overlooked

something with the ares_save_options() where it would try to do a malloc(0)
when no options of that type needed to be saved.  On most platforms, this was
fine because malloc(0) doesn't actually return NULL, but on AIX it does, so
ares_save_options would return ARES_ENOMEM.
This commit is contained in:
Daniel Stenberg 2007-09-22 20:45:50 +00:00
parent 6c511abf43
commit 05b26e7566
2 changed files with 42 additions and 25 deletions

View File

@ -1,10 +1,18 @@
Changelog for the c-ares project Changelog for the c-ares project
* September 22 2007 (Daniel Stenberg)
- Brad House provided a fix for ares_save_options():
Apparently I overlooked something with the ares_save_options() where it
would try to do a malloc(0) when no options of that type needed to be saved.
On most platforms, this was fine because malloc(0) doesn't actually return
NULL, but on AIX it does, so ares_save_options would return ARES_ENOMEM.
* July 14 2007 (Daniel Stenberg) * July 14 2007 (Daniel Stenberg)
- Vlad Dinulescu fixed two outstanding valgrind reports: - Vlad Dinulescu fixed two outstanding valgrind reports:
1. In ares_query.c , in find_query_by_id we compare q->qid (which is a short 1. In ares_query.c , in find_query_by_id we compare q->qid (which is a short
int variable) with qid, which is declared as an int variable. Moreover, int variable) with qid, which is declared as an int variable. Moreover,
DNS_HEADER_SET_QID is used to set the value of qid, but DNS_HEADER_SET_QID DNS_HEADER_SET_QID is used to set the value of qid, but DNS_HEADER_SET_QID

View File

@ -244,40 +244,49 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
options->sock_state_cb_data = channel->sock_state_cb_data; options->sock_state_cb_data = channel->sock_state_cb_data;
/* Copy servers */ /* Copy servers */
options->servers = if (channel->nservers) {
malloc(channel->nservers * sizeof(struct server_state)); options->servers =
if (!options->servers && channel->nservers != 0) malloc(channel->nservers * sizeof(struct server_state));
return ARES_ENOMEM; if (!options->servers && channel->nservers != 0)
for (i = 0; i < channel->nservers; i++) return ARES_ENOMEM;
options->servers[i] = channel->servers[i].addr; for (i = 0; i < channel->nservers; i++)
options->servers[i] = channel->servers[i].addr;
}
options->nservers = channel->nservers; options->nservers = channel->nservers;
/* copy domains */ /* copy domains */
options->domains = malloc(channel->ndomains * sizeof(char *)); if (channel->ndomains) {
if (!options->domains) options->domains = malloc(channel->ndomains * sizeof(char *));
return ARES_ENOMEM; if (!options->domains)
for (i = 0; i < channel->ndomains; i++)
{
options->ndomains = i;
options->domains[i] = strdup(channel->domains[i]);
if (!options->domains[i])
return ARES_ENOMEM; return ARES_ENOMEM;
for (i = 0; i < channel->ndomains; i++)
{
options->ndomains = i;
options->domains[i] = strdup(channel->domains[i]);
if (!options->domains[i])
return ARES_ENOMEM;
}
} }
options->ndomains = channel->ndomains; options->ndomains = channel->ndomains;
/* copy lookups */ /* copy lookups */
options->lookups = strdup(channel->lookups); if (channel->lookups) {
if (!options->lookups) options->lookups = strdup(channel->lookups);
return ARES_ENOMEM; if (!options->lookups && channel->lookups)
return ARES_ENOMEM;
}
/* copy sortlist */ /* copy sortlist */
options->sortlist = malloc(channel->nsort * sizeof(struct apattern)); if (channel->nsort) {
if (!options->sortlist) options->sortlist = malloc(channel->nsort * sizeof(struct apattern));
return ARES_ENOMEM; if (!options->sortlist)
for (i = 0; i < channel->nsort; i++) return ARES_ENOMEM;
{ for (i = 0; i < channel->nsort; i++)
memcpy(&(options->sortlist[i]), &(channel->sortlist[i]), {
sizeof(struct apattern)); memcpy(&(options->sortlist[i]), &(channel->sortlist[i]),
sizeof(struct apattern));
}
} }
options->nsort = channel->nsort; options->nsort = channel->nsort;