diff options
Diffstat (limited to 'usr/src/lib/libadutils/common/addisc.c')
-rw-r--r-- | usr/src/lib/libadutils/common/addisc.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/usr/src/lib/libadutils/common/addisc.c b/usr/src/lib/libadutils/common/addisc.c index 7a9805bc68..b32f9d7694 100644 --- a/usr/src/lib/libadutils/common/addisc.c +++ b/usr/src/lib/libadutils/common/addisc.c @@ -672,7 +672,7 @@ srv_query(res_state state, const char *svc_name, const char *dname, char **rrname, uint32_t *ttl) { idmap_ad_disc_ds_t *srv; - idmap_ad_disc_ds_t *srv_res; + idmap_ad_disc_ds_t *srv_res = NULL; union { HEADER hdr; uchar_t buf[NS_MAXMSG]; @@ -748,6 +748,11 @@ srv_query(res_state state, const char *svc_name, const char *dname, /* 3. walk through the answer section */ srv_res = calloc(ancount + 1, sizeof (idmap_ad_disc_ds_t)); + if (srv_res == NULL) { + logger(LOG_ERR, "Out of memory"); + return (NULL); + } + *ttl = (uint32_t)-1; for (srv = srv_res, cnt = ancount; @@ -757,10 +762,15 @@ srv_query(res_state state, const char *svc_name, const char *dname, sizeof (namebuf)); if (len < 0) { logger(LOG_ERR, "DNS query invalid message format"); - return (NULL); + goto err; } - if (rrname != NULL && *rrname == NULL) + if (rrname != NULL && *rrname == NULL) { *rrname = strdup(namebuf); + if (*rrname == NULL) { + logger(LOG_ERR, "Out of memory"); + goto err; + } + } ptr += len; NS_GET16(type, ptr); NS_GET16(class, ptr); @@ -768,7 +778,7 @@ srv_query(res_state state, const char *svc_name, const char *dname, NS_GET16(size, ptr); if ((end = ptr + size) > eom) { logger(LOG_ERR, "DNS query invalid message format"); - return (NULL); + goto err; } if (type != T_SRV) { @@ -783,7 +793,7 @@ srv_query(res_state state, const char *svc_name, const char *dname, sizeof (srv->host)); if (len < 0) { logger(LOG_ERR, "DNS query invalid SRV record"); - return (NULL); + goto err; } if (rttl < *ttl) @@ -803,6 +813,14 @@ srv_query(res_state state, const char *svc_name, const char *dname, (int (*)(const void *, const void *))srvcmp); return (srv_res); + +err: + free(srv_res); + if (rrname != NULL) { + free(*rrname); + *rrname = NULL; + } + return (NULL); } @@ -1045,6 +1063,7 @@ ldap_lookup_domains_in_forest(LDAP **ld, idmap_ad_disc_ds_t *globalCatalogs) adutils_sid_t sid; char *sid_str; char *name; + char *dn; sid_ber = ldap_get_values_len(*ld, entry, "objectSid"); @@ -1062,7 +1081,9 @@ ldap_lookup_domains_in_forest(LDAP **ld, idmap_ad_disc_ds_t *globalCatalogs) strcpy(domains[ndomains].sid, sid_str); free(sid_str); - name = DN_to_DNS(ldap_get_dn(*ld, entry)); + dn = ldap_get_dn(*ld, entry); + name = DN_to_DNS(dn); + free(dn); if (name == NULL) goto err; |