summaryrefslogtreecommitdiffstats
path: root/gnu/usr.sbin
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>1995-09-24 17:21:52 +0000
committerwpaul <wpaul@FreeBSD.org>1995-09-24 17:21:52 +0000
commitc68079d5afce92326969b2dad562622d50cb8b0b (patch)
treeb62bd9ef221a2f527313fd53141292aa5513be8d /gnu/usr.sbin
parent8791f3d54e11c7c32f04258d520d63f9fd0cd3eb (diff)
downloadFreeBSD-src-c68079d5afce92326969b2dad562622d50cb8b0b.zip
FreeBSD-src-c68079d5afce92326969b2dad562622d50cb8b0b.tar.gz
phkmalloc strikes!
#ifdef out a number of calls to free() left over from the original GNU ypserv implementation. As near as I can tell, the Berkeley DB package does its own garbage collection, hence the caller doesn't have to worry about free()ing the memory returned in the DBT structures during lookups (I'm still not 1005 sure about this: the DB code is very hard to follow. I must use dynamically allocated memory since you can retreive arbitrarily large records from a database, but I'm not sure where it ends up letting go of it). This was not true with GDBM; you had to do your own garbage collection. The general rule is that if you allocate memory inside an RPC service routine, you have to free() it the next time the routine is called since the underlying XDR routines won't do it for you. But if the DB package does this itself, then we don't need to do it in the main program. Note that with the original malloc(), there were never any errors flagged. phkmalloc complained quite loudly.
Diffstat (limited to 'gnu/usr.sbin')
-rw-r--r--gnu/usr.sbin/ypserv/server.c44
1 files changed, 34 insertions, 10 deletions
diff --git a/gnu/usr.sbin/ypserv/server.c b/gnu/usr.sbin/ypserv/server.c
index cfcd7f1..205a846 100644
--- a/gnu/usr.sbin/ypserv/server.c
+++ b/gnu/usr.sbin/ypserv/server.c
@@ -24,7 +24,7 @@
** Ported to FreeBSD and hacked all to pieces
** by Bill Paul <wpaul@ctr.columbia.edu>
**
-** $Id: server.c,v 1.7 1995/07/02 18:48:21 wpaul Exp $
+** $Id: server.c,v 1.11 1995/07/15 23:27:47 wpaul Exp $
**
*/
@@ -349,7 +349,9 @@ int read_database(DB *dbp,
}
if ((dbp->seq)(dbp,&ckey,&dummyval,R_NEXT))
ckey.data = NULL;
+#ifdef GNU_YPSERV_ARTIFACT
free(dummyval.data);
+#endif
}
else
ckey = *ikey;
@@ -364,10 +366,11 @@ int read_database(DB *dbp,
{
if ((dbp->get)(dbp,&ckey,dval,0))
{
+#ifdef GNU_YPSERV_ARTIFACT
/* Free key, unless it comes from the caller! */
if (ikey == NULL || ckey.data != ikey->data)
free(ckey.data);
-
+#endif
if (ikey && ikey->data != NULL)
{
return YP_NOKEY;
@@ -383,23 +386,26 @@ int read_database(DB *dbp,
{
if (okey)
*okey = ckey;
+#ifdef GNU_YPSERV_ARTIFACT
else if (ikey == NULL || ikey->data != ckey.data)
free(ckey.data);
-
+#endif
return YP_TRUE;
}
/* Free old value */
+#ifdef GNU_YPSERV_ARTIFACT
free(dval->data);
-
+#endif
if ((dbp->seq)(dbp,&nkey,&dummyval,R_NEXT))
nkey.data = NULL;
+#ifdef GNU_YPSERV_ARTIFACT
free(dummyval.data);
/* Free old key, unless it comes from the caller! */
if (ikey == NULL || ckey.data != ikey->data)
free(ckey.data);
-
+#endif
if (ckey.data == NULL || nkey.data == NULL)
return YP_NOMORE;
@@ -481,7 +487,17 @@ ypresp_val *ypproc_match_2_svc(ypreq_key *key,
result.val.valdat_len = 0;
if (result.val.valdat_val)
{
+#ifdef GNU_YPSERV_ARTIFACT
+ /*
+ * In general, if you malloc() data in an RPC service
+ * routine, you have to free() it the next time that
+ * routine is called since the XDR routines won't free
+ * it for you. However, in this case, we don't have to
+ * do that because the DB routines do garbage collection
+ * for us.
+ */
free(result.val.valdat_val);
+#endif
result.val.valdat_val = NULL;
}
@@ -629,14 +645,18 @@ ypresp_key_val *ypproc_first_2_svc(ypreq_nokey *key,
result.key.keydat_len = 0;
if (result.key.keydat_val)
{
+#ifdef GNU_YPSERV_ARTIFACT
free(result.key.keydat_val);
+#endif
result.key.keydat_val = NULL;
}
result.val.valdat_len = 0;
if (result.val.valdat_val)
{
+#ifdef GNU_YPSERV_ARTIFACT
free(result.val.valdat_val);
+#endif
result.val.valdat_val = NULL;
}
@@ -732,14 +752,18 @@ ypresp_key_val *ypproc_next_2_svc(ypreq_key *key,
result.key.keydat_len = 0;
if (result.key.keydat_val)
{
+#ifdef GNU_YPSERV_ARTIFACT
free(result.key.keydat_val);
+#endif
result.key.keydat_val = NULL;
}
result.val.valdat_len = 0;
if (result.val.valdat_val)
{
+#ifdef GNU_YPSERV_ARTIFACT
free(result.val.valdat_val);
+#endif
result.val.valdat_val = NULL;
}
@@ -1096,7 +1120,9 @@ ypresp_master *ypproc_master_2_svc(ypreq_nokey *nokey,
if (result.peer)
{
+#ifdef GNU_YPSERV_ARTIFACT
free(result.peer);
+#endif
result.peer = NULL;
}
@@ -1117,9 +1143,6 @@ ypresp_master *ypproc_master_2_svc(ypreq_nokey *nokey,
key.data = "YP_MASTER_NAME";
if ((dbp->get)(dbp,&key,&val,0))
- val.data = NULL;
-
- if (val.data == NULL)
{
/* No YP_MASTER_NAME record in map? Assume we are Master */
static char hostbuf[1025];
@@ -1208,8 +1231,7 @@ ypresp_order *ypproc_order_2_svc(ypreq_nokey *nokey,
key.size = sizeof("YP_LAST_MODIFIED")-1;
key.data = "YP_LAST_MODIFIED";
- (dbp->get)(dbp,&key,&val,0);
- if (val.data == NULL)
+ if ((dbp->get)(dbp,&key,&val,0))
{
/* No YP_LAST_MODIFIED record in map? Use DTM timestamp.. */
result.ordernum = get_dtm(nokey->domain, nokey->map);
@@ -1217,7 +1239,9 @@ ypresp_order *ypproc_order_2_svc(ypreq_nokey *nokey,
else
{
result.ordernum = atoi(val.data);
+#ifdef GNU_YPSERV_ARTIFACT
free(val.data);
+#endif
}
result.stat = YP_TRUE;
OpenPOWER on IntegriCloud