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