diff options
author | wpaul <wpaul@FreeBSD.org> | 1995-09-24 17:21:52 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 1995-09-24 17:21:52 +0000 |
commit | c68079d5afce92326969b2dad562622d50cb8b0b (patch) | |
tree | b62bd9ef221a2f527313fd53141292aa5513be8d /gnu/usr.sbin | |
parent | 8791f3d54e11c7c32f04258d520d63f9fd0cd3eb (diff) | |
download | FreeBSD-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.c | 44 |
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; |