From owner-p4-projects@FreeBSD.ORG Mon Aug 20 17:22:08 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C52D316A419; Mon, 20 Aug 2007 17:22:08 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 79A9216A417 for ; Mon, 20 Aug 2007 17:22:08 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 6857D13C45B for ; Mon, 20 Aug 2007 17:22:08 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l7KHM8GX052996 for ; Mon, 20 Aug 2007 17:22:08 GMT (envelope-from fli@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7KHM7NE052989 for perforce@freebsd.org; Mon, 20 Aug 2007 17:22:07 GMT (envelope-from fli@FreeBSD.org) Date: Mon, 20 Aug 2007 17:22:07 GMT Message-Id: <200708201722.l7KHM7NE052989@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to fli@FreeBSD.org using -f From: Fredrik Lindberg To: Perforce Change Reviews Cc: Subject: PERFORCE change 125434 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Aug 2007 17:22:09 -0000 http://perforce.freebsd.org/chv.cgi?CH=125434 Change 125434 by fli@fli_nexus on 2007/08/20 17:22:03 Change how resource lists are obtained, no record names are copied. Affected files ... .. //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.c#6 edit .. //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.h#4 edit Differences ... ==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.c#6 (text+ko) ==== @@ -588,32 +588,30 @@ MTX_LOCK(dbi, dbi_mtx); sz = dbi->dbi_numnam; + if (dbi->dbi_records > 0) { + sz += (dbi->dbi_records - 1); + } - for (i = 0; i < dbi->dbi_numnam; i++) - sz += dbi->dbi_records; - dn = malloc(sizeof(struct dbr_name) * sz); if (dn == NULL) goto out2; + j = 0; + TAILQ_FOREACH(dr, &dbi->dbi_rech, dr_next) { + dnp = &dn[j]; + dnp->dn_name = _wcsdup(dbi->dbi_names[dbi->dbi_curnam]); + dnp->dn_curnam = 1; + dnp->dn_ename = _wcsdup(dr->dr_name); + j++; + } + for (i = 0; i < dbi->dbi_numnam; i++) { - if (dbi->dbi_records == 0) { - if (dbi->dbi_curnam == i) - dn[i].dn_curnam = 1; - dn[i].dn_ename = NULL; - dn[i].dn_name = _wcsdup(dbi->dbi_names[i]); + if (i == dbi->dbi_curnam) continue; - } - - j = 0; - TAILQ_FOREACH(dr, &dbi->dbi_rech, dr_next) { - dnp = &dn[i + j]; - dnp->dn_name = _wcsdup(dbi->dbi_names[i]); - if (dbi->dbi_curnam == i) - dnp->dn_curnam = 1; - dnp->dn_ename = _wcsdup(dr->dr_name); - j++; - } + dnp = &dn[j]; + dnp->dn_name = _wcsdup(dbi->dbi_names[i]); + dnp->dn_curnam = 0; + dnp->dn_ename = NULL; } *namlen = sz; @@ -800,12 +798,11 @@ dbr_res_list(struct dbr *dbr, char *ident, size_t *reslen) { struct dbr_resource *dres; - struct dbr_rec *dr; struct dbr_ident *dbi, *dbip; struct dbr_ident_res *dir; struct dbr_res *dsh, *ds; struct record_res *rr; - size_t ilen, sz; + size_t ilen, sz, i, j; ilen = strlen(ident); RW_RLOCK(dbr, dbr_lock); @@ -817,51 +814,52 @@ sz = 0; dres = NULL; - + TAILQ_FOREACH(dir, &dbi->dbi_res, dir_next) { MDNS_INIT_ASSERT(dir, dir_magic); + + dres = realloc(dres, sizeof(struct dbr_resource) * (sz+1)); + dres[sz].dres_class = dir->dir_class; + dres[sz].dres_type = dir->dir_type; + dres[sz].dres_ttl = dir->dir_ttl; + if (dir->dir_flags & DIR_POINTER) { + dbip = dir->dir_data.dbi; + dres[sz].dres_resptr = strdup(dbip->dbi_ident); + dres[sz].dres_res = + _wcsdup(dbip->dbi_names[dbi->dbi_curnam]); + } + else { + dres[sz].dres_resptr = NULL; + dres[sz].dres_res = _wcsdup(dir->dir_data.wp); + } + dres[sz].dres_len = 0; + dres[sz].dres_data = NULL; + + j = i = sz; + sz++; TAILQ_FOREACH(dsh, &dir->dir_resh, ds_dir_next) { dres = realloc(dres, sizeof(struct dbr_resource) * - (sz + 1 + dsh->ds_clones)); - dr = dsh->ds_rec; - dres[sz].dres_name = _wcsdup(dr->dr_name); - dres[sz].dres_res = _wcsdup(dsh->ds_data); - dres[sz].dres_resptr = NULL; - if (dir->dir_flags & DIR_POINTER) - dres[sz].dres_resptr = - strdup(dir->dir_data.dbi->dbi_ident); - dres[sz].dres_class = dir->dir_class; - dres[sz].dres_type = dir->dir_type; - dres[sz].dres_ttl = dir->dir_ttl; + (sz + dsh->ds_clones)); + + memcpy(&dres[i], &dres[j], sizeof(struct dbr_resource)); rr = &dsh->ds_res; - dres[sz].dres_len = rr->rr_len; - dres[sz].dres_data = malloc(rr->rr_len); - memcpy(dres[sz].dres_data, (char *)rr->rr_data, + dres[i].dres_len = rr->rr_len; + dres[i].dres_data = malloc(rr->rr_len); + memcpy(dres[i].dres_data, (char *)rr->rr_data, rr->rr_len); - - sz++; + i++; + sz += dsh->ds_clones; TAILQ_FOREACH(ds, &dsh->ds_clone.head, ds_clone.next) { - dres[sz].dres_name = _wcsdup(dr->dr_name); - dres[sz].dres_res = _wcsdup(dsh->ds_data); - dres[sz].dres_resptr = NULL; - if (dir->dir_flags & DIR_POINTER) { - dbip = dir->dir_data.dbi; - MDNS_INIT_ASSERT(dbip, dbi_magic); - dres[sz].dres_resptr = - strdup(dbip->dbi_ident); - } - dres[sz].dres_class = dir->dir_class; - dres[sz].dres_type = dir->dir_type; - dres[sz].dres_ttl = dir->dir_ttl; - rr = &ds->ds_res; - dres[sz].dres_len = rr->rr_len; - dres[sz].dres_data = malloc(rr->rr_len); - memcpy(dres[sz].dres_data, (char *)rr->rr_data, - rr->rr_len); - sz++; + i++; + memcpy(&dres[i], &dres[j], + sizeof(struct dbr_resource)); + dres[i].dres_len = rr->rr_len; + dres[i].dres_data = malloc(rr->rr_len); + memcpy(dres[i].dres_data, (char *)rr->rr_data, + rr->rr_len); } - } + } } *reslen = sz; @@ -883,13 +881,22 @@ dbr_res_list_free(struct dbr_resource *dres, size_t reslen) { size_t i; + void *tmp_res, *tmp_resptr; + tmp_res = tmp_resptr = NULL; + /* Several pointers may point to the same allocated data */ for (i = 0; i < reslen; i++) { - free(dres[i].dres_name); - free(dres[i].dres_res); - free(dres[i].dres_data); - if (dres[i].dres_resptr != NULL) + if (dres[i].dres_res != tmp_res) { + tmp_res = dres[i].dres_res; + free(dres[i].dres_res); + } + if (dres[i].dres_resptr != NULL && + dres[i].dres_resptr != tmp_resptr) { + tmp_resptr = dres[i].dres_resptr; free(dres[i].dres_resptr); + } + if (dres[i].dres_data != NULL) + free(dres[i].dres_data); } free(dres); } ==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.h#4 (text+ko) ==== @@ -74,7 +74,7 @@ /* * Used to return information about current names assigned to - * an identifier. + * an identifier. */ struct dbr_name { wchar_t *dn_name; @@ -110,14 +110,13 @@ * an identifier. */ struct dbr_resource { - wchar_t *dres_name; /* Resource name */ - wchar_t *dres_res; /* Resource data source */ + wchar_t *dres_res; /* Unexpanded source */ char *dres_resptr; /* Pointer identifier */ uint16_t dres_class; uint16_t dres_type; uint32_t dres_ttl; - char *dres_data; - size_t dres_len; + size_t dres_len; /* Length of real resource */ + char *dres_data; /* Expanded/encoded resource */ }; /*