PERFORCE change 127251 for review
Fredrik Lindberg
fli at FreeBSD.org
Sat Oct 6 10:07:14 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127251
Change 127251 by fli at fli_nexus on 2007/10/06 17:06:47
- Probing/annonucing was broken for ipv6.
- A few error conditions didn't release the read-lock properly.
Affected files ...
.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.c#9 edit
Differences ...
==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/dbrec.c#9 (text+ko) ====
@@ -462,11 +462,13 @@
tmp = realloc(ident, sizeof(char *) * ++i);
if (tmp == NULL)
- goto dbr_ident_list_fail;
+ goto dbr_ident_list_fail2;
ident[i - 1] = NULL;
return (ident);
dbr_ident_list_fail:
+ RW_UNLOCK(dbr, dbr_lock);
+dbr_ident_list_fail2:
for (j = 0; j < i; j++)
free(ident[j]);
if (ident != NULL)
@@ -1782,6 +1784,7 @@
RW_RLOCK(dbr, dbr_lock);
if (!(dr->dr_flags & DR_OK)) {
dprintf(DEBUG_DBR, "Record is not ok, not defending");
+ RW_UNLOCK(dbr, dbr_lock);
return;
}
@@ -2137,7 +2140,7 @@
struct dbr *dbr;
struct md_if *mif;
int count = 0;
- struct mdns_pkgchain pc;
+ struct mdns_pkgchain pc, pc6;
pac = arg.ptr;
MDNS_INIT_ASSERT(pac, pac_magic);
@@ -2181,6 +2184,10 @@
mdns_pkgchain_init(&mif->mif_stack, &pc, MDNS_PC_NONE);
mdns_pkg_sethdr(&pc, 0, MDNS_HEAD_QUERY | MDNS_HEAD_AA);
+#ifdef INET6
+ mdns_pkgchain_init(&mif->mif_stack, &pc6, MDNS_PC_NONE);
+ mdns_pkg_sethdr(&pc6, 0, MDNS_HEAD_QUERY | MDNS_HEAD_AA);
+#endif
/*
* Add all valid records to the packet chain
@@ -2188,6 +2195,9 @@
TAILQ_FOREACH_SAFE(dr, &pac->pac_head, dr_pac_next, dr2) {
MDNS_INIT_ASSERT(dr, dr_magic);
probe_add_rec(&pc, dr, pac->pac_step);
+#ifdef INET6
+ probe_add_rec(&pc6, dr, pac->pac_step);
+#endif
count++;
}
@@ -2195,10 +2205,13 @@
if (count) {
oq_enqueue(&mif->mif_oq, &pc, AF_INET, NULL, 0);
#ifdef INET6
- oq_enqueue(&mif->mif_oq, &pc, AF_INET6, NULL, 0);
+ oq_enqueue(&mif->mif_oq, &pc6, AF_INET6, NULL, 0);
#endif
}
mdns_pkgchain_free(&pc);
+#ifdef INET6
+ mdns_pkgchain_free(&pc6);
+#endif
if (pac->pac_step++ < 3) {
pac->pac_tmr =
@@ -2264,9 +2277,9 @@
struct md_if *mif;
struct record *r;
struct record_res *rr;
- struct mdns_rrset *rs;
+ struct mdns_rrset *rs, *rs2;
int delay_time, count = 0;
- struct mdns_pkgchain pc;
+ struct mdns_pkgchain pc, pc6;
pac = arg.ptr;
MDNS_INIT_ASSERT(pac, pac_magic);
@@ -2289,6 +2302,10 @@
mdns_pkgchain_init(&mif->mif_stack, &pc, MDNS_PC_NONE);
mdns_pkg_sethdr(&pc, 0, MDNS_HEAD_RESP | MDNS_HEAD_AA);
+#ifdef INET6
+ mdns_pkgchain_init(&mif->mif_stack, &pc6, MDNS_PC_NONE);
+ mdns_pkg_sethdr(&pc6, 0, MDNS_HEAD_RESP | MDNS_HEAD_AA);
+#endif
RW_RLOCK(dbr, dbr_lock);
@@ -2313,6 +2330,14 @@
rs->r_datalen = rr->rr_len;
rs->r_data = rr->rr_data;
mdns_pkg_addanswer(&pc, rs, 0);
+
+#ifdef INET6
+ rs2 = mdns_pkg_getrrset();
+ if (rs2 == NULL)
+ break;
+ memcpy(rs2, rs, sizeof(struct mdns_rrset));
+ mdns_pkg_addanswer(&pc6, rs2, 0);
+#endif
count++;
}
}
@@ -2323,10 +2348,13 @@
if (count) {
oq_enqueue(&mif->mif_oq, &pc, AF_INET, NULL, 0);
#ifdef INET6
- oq_enqueue(&mif->mif_oq, &pc, AF_INET6, NULL, 0);
+ oq_enqueue(&mif->mif_oq, &pc6, AF_INET6, NULL, 0);
#endif
}
mdns_pkgchain_free(&pc);
+#ifdef INET6
+ mdns_pkgchain_free(&pc6);
+#endif
if (pac->pac_step < 7) {
/* Double the delay time in each step */
More information about the p4-projects
mailing list