+2157. [func] dns_db_transfernode() created. [RT #16685]
+
+2156. [bug] Fix node reference leaks in lookup.c:lookup_find(),
+ resolver.c:validated() and resolver.c:cache_name().
+ Fix a memory leak in rbtdb.c:free_noqname().
+ Make lookup.c:lookup_find() robust against
+ event leaks. [RT #16685]
+
2155. [contrib] SQLite sdb module from jaboydjr@netwalk.com.
[RT #16694]
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: tests.sh,v 1.15 2004/03/05 05:01:20 marka Exp $
+# $Id: tests.sh,v 1.16 2007/03/06 00:38:57 marka Exp $
SYSTEMTESTTOP=..
. $SYSTEMTESTTOP/conf.sh
$PERL $SYSTEMTESTTOP/stop.pl . lwresd1
-$PERL $SYSTEMTESTTOP/start.pl . lwresd1 -- "-c lwresd.conf -d 99 -g"
+$PERL $SYSTEMTESTTOP/start.pl . lwresd1 -- "-m record,size,mctx -c lwresd.conf -d 99 -g"
echo "I:using lwresd.conf"
ret=0
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: db.c,v 1.80 2005/10/13 01:58:31 marka Exp $ */
+/* $Id: db.c,v 1.81 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
ENSURE(*nodep == NULL);
}
+void
+dns_db_transfernode(dns_db_t *db, dns_dbnode_t **sourcep,
+ dns_dbnode_t **targetp)
+{
+ REQUIRE(DNS_DB_VALID(db));
+ REQUIRE(targetp != NULL && *targetp == NULL);
+ /*
+ * This doesn't check the implementation magic. If we find that
+ * we need such checks in future then this will be done in the
+ * method.
+ */
+ REQUIRE(sourcep != NULL && *sourcep != NULL);
+
+ UNUSED(db);
+
+ if (db->methods->transfernode == NULL) {
+ *targetp = *sourcep;
+ *sourcep = NULL;
+ } else
+ (db->methods->transfernode)(db, sourcep, targetp);
+
+ ENSURE(*sourcep == NULL);
+}
+
isc_result_t
dns_db_expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) {
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: db.h,v 1.86 2006/12/22 01:59:43 marka Exp $ */
+/* $Id: db.h,v 1.87 2007/03/06 00:38:57 marka Exp $ */
#ifndef DNS_DB_H
#define DNS_DB_H 1
void (*overmem)(dns_db_t *db, isc_boolean_t overmem);
void (*settask)(dns_db_t *db, isc_task_t *);
isc_result_t (*getoriginnode)(dns_db_t *db, dns_dbnode_t **nodep);
+ void (*transfernode)(dns_db_t *db, dns_dbnode_t **sourcep,
+ dns_dbnode_t **targetp);
} dns_dbmethods_t;
typedef isc_result_t
*
* \li 'source' is a valid node.
*
- * \li 'targetp' points to a NULL dns_node_t *.
+ * \li 'targetp' points to a NULL dns_dbnode_t *.
*
* Ensures:
*
* \li *nodep is NULL.
*/
+void
+dns_db_transfernode(dns_db_t *db, dns_dbnode_t **sourcep,
+ dns_dbnode_t **targetp);
+/*%<
+ * Transfer a node between pointer.
+ *
+ * This is equivalent to calling dns_db_attachnode() then dns_db_detachnode().
+ *
+ * Requires:
+ *
+ * \li 'db' is a valid database.
+ *
+ * \li '*sourcep' is a valid node.
+ *
+ * \li 'targetp' points to a NULL dns_dbnode_t *.
+ *
+ * Ensures:
+ *
+ * \li '*sourcep' is NULL.
+ */
+
isc_result_t
dns_db_expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now);
/*%<
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lookup.c,v 1.18 2005/11/30 03:33:49 marka Exp $ */
+/* $Id: lookup.c,v 1.19 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
lookup_find(dns_lookup_t *lookup, dns_fetchevent_t *event) {
isc_result_t result;
isc_boolean_t want_restart;
- isc_boolean_t send_event = ISC_FALSE;
+ isc_boolean_t send_event;
dns_name_t *name, *fname, *prefix;
dns_fixedname_t foundname, fixed;
dns_rdata_t rdata = DNS_RDATA_INIT;
do {
lookup->restarts++;
want_restart = ISC_FALSE;
+ send_event = ISC_TRUE;
if (event == NULL && !lookup->canceled) {
dns_fixedname_init(&foundname);
INSIST(!dns_rdataset_isassociated(&lookup->rdataset));
INSIST(!dns_rdataset_isassociated
(&lookup->sigrdataset));
+ /*
+ * If we have restarted then clear the old node. */
+ if (lookup->event->node != NULL) {
+ INSIST(lookup->event->db != NULL);
+ dns_db_detachnode(lookup->event->db,
+ &lookup->event->node);
+ }
+ if (lookup->event->db != NULL)
+ dns_db_detach(&lookup->event->db);
result = view_find(lookup, fname);
if (result == ISC_R_NOTFOUND) {
/*
if (lookup->event->db != NULL)
dns_db_detach(&lookup->event->db);
result = start_fetch(lookup);
- if (result != ISC_R_SUCCESS)
- send_event = ISC_TRUE;
+ if (result == ISC_R_SUCCESS)
+ send_event = ISC_FALSE;
goto done;
}
} else if (event != NULL) {
switch (result) {
case ISC_R_SUCCESS:
result = build_event(lookup);
- send_event = ISC_TRUE;
if (event == NULL)
break;
if (event->db != NULL)
break;
result = dns_name_copy(&cname.cname, name, NULL);
dns_rdata_freestruct(&cname);
- if (result == ISC_R_SUCCESS)
+ if (result == ISC_R_SUCCESS) {
want_restart = ISC_TRUE;
+ send_event = ISC_FALSE;
+ }
break;
case DNS_R_DNAME:
namereln = dns_name_fullcompare(name, fname, &order,
result = dns_name_concatenate(prefix, &dname.dname,
name, NULL);
dns_rdata_freestruct(&dname);
- if (result == ISC_R_SUCCESS)
+ if (result == ISC_R_SUCCESS) {
want_restart = ISC_TRUE;
+ send_event = ISC_FALSE;
+ }
break;
default:
send_event = ISC_TRUE;
isc_mem_put(mctx, event, event->ev_size);
}
-
isc_result_t
dns_lookup_create(isc_mem_t *mctx, dns_name_t *name, dns_rdatatype_t type,
dns_view_t *view, unsigned int options, isc_task_t *task,
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rbtdb.c,v 1.241 2007/02/26 23:46:54 tbox Exp $ */
+/* $Id: rbtdb.c,v 1.242 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
if ((*noqname)->nsec != NULL)
isc_mem_put(mctx, (*noqname)->nsec,
dns_rdataslab_size((*noqname)->nsec, 0));
- if ((*noqname)->nsec != NULL)
+ if ((*noqname)->nsecsig != NULL)
isc_mem_put(mctx, (*noqname)->nsecsig,
dns_rdataslab_size((*noqname)->nsecsig, 0));
isc_mem_put(mctx, *noqname, sizeof(**noqname));
ispersistent,
overmem,
settask,
- getoriginnode
+ getoriginnode,
+ NULL,
};
static dns_dbmethods_t cache_methods = {
ispersistent,
overmem,
settask,
- getoriginnode
+ getoriginnode,
+ NULL
};
isc_result_t
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resolver.c,v 1.344 2007/02/26 01:07:49 marka Exp $ */
+/* $Id: resolver.c,v 1.345 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
* If we only deferred the destroy because we wanted to cache
* the data, destroy now.
*/
+ dns_db_detachnode(fctx->cache, &node);
UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
if (SHUTTINGDOWN(fctx))
maybe_destroy(fctx); /* Locks bucket. */
* more rdatasets that still need to
* be validated.
*/
+ dns_db_detachnode(fctx->cache, &node);
UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
dns_validator_send(ISC_LIST_HEAD(fctx->validators));
goto cleanup_event;
dns_fixedname_name(&hevent->foundname), NULL)
== ISC_R_SUCCESS);
dns_db_attach(fctx->cache, &hevent->db);
- hevent->node = node;
- node = NULL;
+ dns_db_transfernode(fctx->cache, &node, &hevent->node);
clone_results(fctx);
}
fctx_done(fctx, result); /* Locks bucket. */
cleanup_event:
+ INSIST(node == NULL);
isc_event_free(&event);
}
fail ? "failure" : "warning",
namebuf, typebuf, classbuf);
if (fail) {
- if (ANSWER(rdataset))
+ if (ANSWER(rdataset)) {
+ dns_db_detachnode(fctx->cache, &node);
return (DNS_R_BADNAME);
+ }
continue;
}
}
if (event != NULL) {
event->result = eresult;
dns_db_attach(fctx->cache, adbp);
- *anodep = node;
- node = NULL;
+ dns_db_transfernode(fctx->cache, &node, anodep);
clone_results(fctx);
}
}
if (event != NULL) {
event->result = eresult;
dns_db_attach(fctx->cache, adbp);
- *anodep = node;
- node = NULL;
+ dns_db_transfernode(fctx->cache, &node, anodep);
clone_results(fctx);
}
}
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdb.c,v 1.55 2006/12/07 23:57:59 marka Exp $ */
+/* $Id: sdb.c,v 1.56 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
ispersistent,
overmem,
settask,
+ NULL,
NULL
};
* USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sdlz.c,v 1.11 2007/02/14 23:45:44 marka Exp $ */
+/* $Id: sdlz.c,v 1.12 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
overmem,
settask,
NULL,
+ NULL
};
/*
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: view.c,v 1.138 2006/12/21 06:02:30 marka Exp $ */
+/* $Id: view.c,v 1.139 2007/03/06 00:38:57 marka Exp $ */
/*! \file */
REQUIRE(view->frozen);
REQUIRE(type != dns_rdatatype_rrsig);
REQUIRE(rdataset != NULL); /* XXXBEW - remove this */
+ REQUIRE(nodep == NULL || *nodep == NULL);
/*
* Initialize.
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.c,v 1.133 2007/02/27 03:31:04 marka Exp $ */
+/* $Id: mem.c,v 1.134 2007/03/06 00:38:58 marka Exp $ */
/*! \file */
}
fflush(file);
#endif
- /* INSIST(0); XXXMPA temorarially comment out. */
+ INSIST(0);
}
UNLOCK(&lock);
}