summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2008-04-29 12:21:52 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2008-04-29 12:21:52 +0200
commit1cce2e35b06b54469dd627454c0f58818ff3523a (patch)
tree42b836cda5c3f895949ced7e7afa4702271c6197
parent94acfb1c5f349ede619639e8cb84f2e3d3c28efe (diff)
downloadrsyslog-1cce2e35b06b54469dd627454c0f58818ff3523a.tar.gz
rsyslog-1cce2e35b06b54469dd627454c0f58818ff3523a.tar.xz
rsyslog-1cce2e35b06b54469dd627454c0f58818ff3523a.zip
removed loadbale module leak
- moved netstrms, netstrm and nssel into a single loadble module because they belong together - fixed "loadbale module leak"
-rw-r--r--runtime/Makefile.am16
-rw-r--r--runtime/netstrm.c31
-rw-r--r--runtime/netstrms.c26
-rw-r--r--runtime/netstrms.h3
-rw-r--r--runtime/nssel.c46
-rw-r--r--runtime/nssel.h3
6 files changed, 50 insertions, 75 deletions
diff --git a/runtime/Makefile.am b/runtime/Makefile.am
index dcb475d8..571d36ac 100644
--- a/runtime/Makefile.am
+++ b/runtime/Makefile.am
@@ -81,7 +81,7 @@ lmregexp_la_LIBADD =
endif
if ENABLE_INET
-pkglib_LTLIBRARIES += lmnet.la lmnetstrms.la lmnetstrm.la lmnssel.la
+pkglib_LTLIBRARIES += lmnet.la lmnetstrms.la
#
# network support
#
@@ -91,23 +91,11 @@ lmnet_la_LDFLAGS = -module -avoid-version
lmnet_la_LIBADD =
# network stream master class and stream factory
-lmnetstrms_la_SOURCES = netstrms.c netstrms.h
+lmnetstrms_la_SOURCES = netstrms.c netstrms.h netstrm.c netstrm.h nssel.c nssel.h
lmnetstrms_la_CPPFLAGS = $(pthreads_cflags) $(rsrt_cflags)
lmnetstrms_la_LDFLAGS = -module -avoid-version
lmnetstrms_la_LIBADD =
-# individual network streams
-lmnetstrm_la_SOURCES = netstrm.c netstrm.h
-lmnetstrm_la_CPPFLAGS = $(pthreads_cflags) $(rsrt_cflags)
-lmnetstrm_la_LDFLAGS = -module -avoid-version
-lmnetstrm_la_LIBADD =
-
-# network stream select support (a helper class)
-lmnssel_la_SOURCES = nssel.c nssel.h
-lmnssel_la_CPPFLAGS = $(pthreads_cflags) $(rsrt_cflags)
-lmnssel_la_LDFLAGS = -module -avoid-version
-lmnssel_la_LIBADD =
-
# netstream drivers
# plain tcp driver - main driver
diff --git a/runtime/netstrm.c b/runtime/netstrm.c
index bbb6ee30..e270335c 100644
--- a/runtime/netstrm.c
+++ b/runtime/netstrm.c
@@ -46,12 +46,9 @@
#include "module-template.h"
#include "obj.h"
#include "errmsg.h"
-//#include "nsd.h"
#include "netstrms.h"
#include "netstrm.h"
-MODULE_TYPE_LIB
-
/* static data */
DEFobjStaticHelpers
DEFobjCurrIf(errmsg)
@@ -119,6 +116,7 @@ AcceptConnReq(netstrm_t *pThis, netstrm_t **ppNew)
/* accept the new connection */
CHKiRet(pThis->Drvr.AcceptConnReq(pThis->pDrvrData, &pNewNsd));
/* construct our object so that we can use it... */
+ CHKiRet(objUse(netstrms, DONT_LOAD_LIB)); /* load netstrms obj if not already done so */
CHKiRet(netstrms.CreateStrm(pThis->pNS, ppNew));
(*ppNew)->pDrvrData = pNewNsd;
@@ -276,7 +274,7 @@ BEGINObjClassExit(netstrm, OBJ_IS_LOADABLE_MODULE) /* CHANGE class also in END M
CODESTARTObjClassExit(netstrm)
/* release objects we no longer need */
objRelease(errmsg, CORE_COMPONENT);
- objRelease(netstrms, LM_NETSTRMS_FILENAME);
+ objRelease(netstrms, DONT_LOAD_LIB);
ENDObjClassExit(netstrm)
@@ -287,33 +285,8 @@ ENDObjClassExit(netstrm)
BEGINAbstractObjClassInit(netstrm, 1, OBJ_IS_CORE_MODULE) /* class, version */
/* request objects we use */
CHKiRet(objUse(errmsg, CORE_COMPONENT));
- CHKiRet(objUse(netstrms, LM_NETSTRMS_FILENAME));
/* set our own handlers */
ENDObjClassInit(netstrm)
-
-
-/* --------------- here now comes the plumbing that makes as a library module --------------- */
-
-
-BEGINmodExit
-CODESTARTmodExit
- netstrmClassExit();
-ENDmodExit
-
-
-BEGINqueryEtryPt
-CODESTARTqueryEtryPt
-CODEqueryEtryPt_STD_LIB_QUERIES
-ENDqueryEtryPt
-
-
-BEGINmodInit()
-CODESTARTmodInit
- *ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */
-
- /* Initialize all classes that are in our module - this includes ourselfs */
- CHKiRet(netstrmClassInit(pModInfo)); /* must be done after tcps_sess, as we use it */
-ENDmodInit
/* vi:set ai:
*/
diff --git a/runtime/netstrms.c b/runtime/netstrms.c
index dc9d0b69..241df9be 100644
--- a/runtime/netstrms.c
+++ b/runtime/netstrms.c
@@ -35,6 +35,7 @@
//#include "net.h"
#include "nsd.h"
#include "netstrm.h"
+#include "nssel.h"
#include "netstrms.h"
MODULE_TYPE_LIB
@@ -51,6 +52,8 @@ DEFobjCurrIf(netstrm)
* driver-specific functions (allmost all...) can be carried
* out. Note that the driver's .ifIsLoaded is correctly
* initialized by calloc() and we depend on that.
+ * WARNING: this code is mostly identical to similar code in
+ * nssel.c - TODO: abstract it and move it to some common place.
* rgerhards, 2008-04-18
*/
static rsRetVal
@@ -60,11 +63,12 @@ loadDrvr(netstrms_t *pThis)
uchar *pBaseDrvrName;
uchar szDrvrName[48]; /* 48 shall be large enough */
- pBaseDrvrName = pThis->pDrvrName;
+ pBaseDrvrName = pThis->pBaseDrvrName;
if(pBaseDrvrName == NULL) /* if no drvr name is set, use system default */
pBaseDrvrName = glbl.GetDfltNetstrmDrvr();
if(snprintf((char*)szDrvrName, sizeof(szDrvrName), "lmnsd_%s", pBaseDrvrName) == sizeof(szDrvrName))
ABORT_FINALIZE(RS_RET_DRVRNAME_TOO_LONG);
+ CHKmalloc(pThis->pDrvrName = (uchar*) strdup((char*)szDrvrName));
pThis->Drvr.ifVersion = nsdCURR_IF_VERSION;
/* The pDrvrName+2 below is a hack to obtain the object name. It
@@ -74,7 +78,13 @@ loadDrvr(netstrms_t *pThis)
* enough. -- rgerhards, 2008-04-18
*/
CHKiRet(obj.UseObj(__FILE__, szDrvrName+2, szDrvrName, (void*) &pThis->Drvr));
+
finalize_it:
+ if(iRet != RS_RET_OK) {
+ if(pThis->pDrvrName != NULL)
+ free(pThis->pDrvrName);
+ pThis->pDrvrName = NULL;
+ }
RETiRet;
}
@@ -87,8 +97,14 @@ ENDobjConstruct(netstrms)
/* destructor for the netstrms object */
BEGINobjDestruct(netstrms) /* be sure to specify the object type also in END and CODESTART macros! */
CODESTARTobjDestruct(netstrms)
- if(pThis->pDrvrName != NULL)
+ /* and now we must release our driver, if we got one. We use the presence of
+ * a driver name string as load indicator (because we also need that string
+ * to release the driver
+ */
+ if(pThis->pDrvrName != NULL) {
+ obj.ReleaseObj(__FILE__, pThis->pDrvrName+2, pThis->pDrvrName, (void*) &pThis->Drvr);
free(pThis->pDrvrName);
+ }
ENDobjDestruct(netstrms)
@@ -184,6 +200,8 @@ ENDObjClassInit(netstrms)
BEGINmodExit
CODESTARTmodExit
netstrmsClassExit();
+ netstrmClassExit();
+ nsselClassExit();
ENDmodExit
@@ -198,7 +216,9 @@ CODESTARTmodInit
*ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */
/* Initialize all classes that are in our module - this includes ourselfs */
- CHKiRet(netstrmsClassInit(pModInfo)); /* must be done after tcps_sess, as we use it */
+ CHKiRet(netstrmClassInit(pModInfo));
+ CHKiRet(nsselClassInit(pModInfo));
+ CHKiRet(netstrmsClassInit(pModInfo));
ENDmodInit
/* vi:set ai:
*/
diff --git a/runtime/netstrms.h b/runtime/netstrms.h
index 1e920304..7dfc0d1d 100644
--- a/runtime/netstrms.h
+++ b/runtime/netstrms.h
@@ -29,7 +29,8 @@
/* the netstrms object */
struct netstrms_s {
BEGINobjInstance; /* Data to implement generic object - MUST be the first data element! */
- uchar *pDrvrName; /**< nsd driver name to use, or NULL if system default */
+ uchar *pBaseDrvrName; /**< nsd base driver name to use, or NULL if system default */
+ uchar *pDrvrName; /**< full base driver name (set when driver is loaded) */
nsd_if_t Drvr; /**< our stream driver */
};
diff --git a/runtime/nssel.c b/runtime/nssel.c
index 793da9dc..50228208 100644
--- a/runtime/nssel.c
+++ b/runtime/nssel.c
@@ -44,8 +44,6 @@
#include "netstrm.h"
#include "nssel.h"
-MODULE_TYPE_LIB
-
/* static data */
DEFobjStaticHelpers
DEFobjCurrIf(glbl)
@@ -59,6 +57,8 @@ DEFobjCurrIf(glbl)
* a nssel driver. So we simply append "sel" to the nsd driver name: This,
* of course, means that the driver name must match these rules, but that
* shouldn't be a real problem.
+ * WARNING: this code is mostly identical to similar code in
+ * netstrms.c - TODO: abstract it and move it to some common place.
* rgerhards, 2008-04-28
*/
static rsRetVal
@@ -68,11 +68,12 @@ loadDrvr(nssel_t *pThis)
uchar *pBaseDrvrName;
uchar szDrvrName[48]; /* 48 shall be large enough */
- pBaseDrvrName = pThis->pDrvrName;
+ pBaseDrvrName = pThis->pBaseDrvrName;
if(pBaseDrvrName == NULL) /* if no drvr name is set, use system default */
pBaseDrvrName = glbl.GetDfltNetstrmDrvr();
if(snprintf((char*)szDrvrName, sizeof(szDrvrName), "lmnsdsel_%s", pBaseDrvrName) == sizeof(szDrvrName))
ABORT_FINALIZE(RS_RET_DRVRNAME_TOO_LONG);
+ CHKmalloc(pThis->pDrvrName = (uchar*) strdup((char*)szDrvrName));
pThis->Drvr.ifVersion = nsdCURR_IF_VERSION;
/* The pDrvrName+2 below is a hack to obtain the object name. It
@@ -82,7 +83,13 @@ loadDrvr(nssel_t *pThis)
* enough. -- rgerhards, 2008-04-18
*/
CHKiRet(obj.UseObj(__FILE__, szDrvrName+2, szDrvrName, (void*) &pThis->Drvr));
+
finalize_it:
+ if(iRet != RS_RET_OK) {
+ if(pThis->pDrvrName != NULL)
+ free(pThis->pDrvrName);
+ pThis->pDrvrName = NULL;
+ }
RETiRet;
}
@@ -97,6 +104,15 @@ BEGINobjDestruct(nssel) /* be sure to specify the object type also in END and CO
CODESTARTobjDestruct(nssel)
if(pThis->pDrvrData != NULL)
pThis->Drvr.Destruct(&pThis->pDrvrData);
+
+ /* and now we must release our driver, if we got one. We use the presence of
+ * a driver name string as load indicator (because we also need that string
+ * to release the driver
+ */
+ if(pThis->pDrvrName != NULL) {
+ obj.ReleaseObj(__FILE__, pThis->pDrvrName+2, pThis->pDrvrName, (void*) &pThis->Drvr);
+ free(pThis->pDrvrName);
+ }
ENDobjDestruct(nssel)
@@ -207,29 +223,5 @@ BEGINObjClassInit(nssel, 1, OBJ_IS_CORE_MODULE) /* class, version */
/* set our own handlers */
ENDObjClassInit(nssel)
-
-
-/* --------------- here now comes the plumbing that makes us a library module --------------- */
-
-
-BEGINmodExit
-CODESTARTmodExit
- nsselClassExit();
-ENDmodExit
-
-
-BEGINqueryEtryPt
-CODESTARTqueryEtryPt
-CODEqueryEtryPt_STD_LIB_QUERIES
-ENDqueryEtryPt
-
-
-BEGINmodInit()
-CODESTARTmodInit
- *ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */
-
- /* Initialize all classes that are in our module - this includes ourselfs */
- CHKiRet(nsselClassInit(pModInfo)); /* must be done after tcps_sess, as we use it */
-ENDmodInit
/* vi:set ai:
*/
diff --git a/runtime/nssel.h b/runtime/nssel.h
index 2f907caa..d54f408d 100644
--- a/runtime/nssel.h
+++ b/runtime/nssel.h
@@ -30,7 +30,8 @@
struct nssel_s {
BEGINobjInstance; /* Data to implement generic object - MUST be the first data element! */
nsd_t *pDrvrData; /**< the driver's data elements */
- uchar *pDrvrName; /**< nsd driver name to use, or NULL if system default */
+ uchar *pBaseDrvrName; /**< nsd base driver name to use, or NULL if system default */
+ uchar *pDrvrName; /**< full base driver name (set when driver is loaded) */
nsdsel_if_t Drvr; /**< our stream driver */
};