From e0fbfa6abfb120d7fcc181d548a7d5503529a0d5 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 22 Mar 2012 16:14:30 -0700 Subject: [PATCH] Fix memory leaks in attach error paths. --- PDP11/pdp11_xq.c | 8 +++++++- PDP11/pdp11_xu.c | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/PDP11/pdp11_xq.c b/PDP11/pdp11_xq.c index ba1ff031..9233550c 100644 --- a/PDP11/pdp11_xq.c +++ b/PDP11/pdp11_xq.c @@ -2611,6 +2611,7 @@ t_stat xq_attach(UNIT* uptr, char* cptr) printf("%s: MAC Address Conflict on LAN for address %s, change the MAC address to a unique value\n", xq->dev->name, buf); if (sim_log) fprintf (sim_log, "%s: MAC Address Conflict on LAN for address %s, change the MAC address to a unique value\n", xq->dev->name, buf); eth_close(xq->var->etherface); + free(tptr); free(xq->var->etherface); xq->var->etherface = NULL; return SCPE_NOATT; @@ -2623,8 +2624,13 @@ t_stat xq_attach(UNIT* uptr, char* cptr) /* init read queue (first time only) */ status = ethq_init(&xq->var->ReadQ, XQ_QUE_MAX); - if (status != SCPE_OK) + if (status != SCPE_OK) { + eth_close(xq->var->etherface); + free(tptr); + free(xq->var->etherface); + xq->var->etherface = NULL; return status; + } if (xq->var->mode == XQ_T_DELQA_PLUS) eth_filter_hash (xq->var->etherface, 1, &xq->var->init.phys, 0, xq->var->init.mode & XQ_IN_MO_PRO, &xq->var->init.hash_filter); diff --git a/PDP11/pdp11_xu.c b/PDP11/pdp11_xu.c index f9cda450..83920b7d 100644 --- a/PDP11/pdp11_xu.c +++ b/PDP11/pdp11_xu.c @@ -1587,6 +1587,8 @@ t_stat xu_attach(UNIT* uptr, char* cptr) printf("%s: MAC Address Conflict on LAN for address %s\n", xu->dev->name, buf); if (sim_log) fprintf (sim_log, "%s: MAC Address Conflict on LAN for address %s\n", xu->dev->name, buf); eth_close(xu->var->etherface); + free(tptr); + xu->var->etherface = 0; return SCPE_NOATT; } uptr->filename = tptr;