File 0015-fix-potential-memory-leak.patch of Package sblim-sfcb

From c803538579ac7d8d852c42085b43d75da6b2215d Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Klaus=20K=C3=A4mpf?= <kkaempf@suse.de>
Date: Wed, 22 Oct 2008 13:40:02 +0200
Subject: [PATCH] fix potential memory leak

forkProvider is passed a 'msg' pointer address which is set by strdup
but never used.
Make this parameter optional (in providerDrv.c) and pass NULL for each
call (in providerMgr.c)
---
 providerDrv.c |    8 +++++---
 providerMgr.c |   39 +++++++++++----------------------------
 2 files changed, 16 insertions(+), 31 deletions(-)

diff --git a/providerDrv.c b/providerDrv.c
index 62aca9d..d06a91f 100644
--- a/providerDrv.c
+++ b/providerDrv.c
@@ -676,10 +676,12 @@ int forkProvider(ProviderInfo * info, OperationHdr * req, char **msg)
 
       resp = invokeProvider(&binCtx);
       resp->rc--;
-      if (resp->rc) {
-         *msg = strdup((char *) resp->object[0].data);
+      if (msg) {
+	if (resp->rc) {
+          *msg = strdup((char *) resp->object[0].data);
+        }
+        else *msg = NULL;
       }
-      else *msg = NULL;
 
       rc=resp->rc;
       _SFCB_TRACE(1, ("--- rc: %d", resp->rc));
diff --git a/providerMgr.c b/providerMgr.c
index 99e0292..b300937 100644
--- a/providerMgr.c
+++ b/providerMgr.c
@@ -371,7 +371,6 @@ static void lookupProviderList(long type, int *requestor, OperationHdr * req)
    unsigned long count,n;
    ProviderInfo *info;
    int dmy = 0, rc,indFound=0;
-   char *msg = NULL;
    CMPIStatus st = {CMPI_RC_OK, NULL};
 
    providers = lookupProviders(type,className,nameSpace,&st);
@@ -383,7 +382,7 @@ static void lookupProviderList(long type, int *requestor, OperationHdr * req)
       for (info = providers->ft->getFirst(providers); info;
            info = providers->ft->getNext(providers), n--) {
          if (info->type!=FORCE_PROVIDER_NOTFOUND &&
-             (rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
+             (rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
             _SFCB_TRACE(1,("--- responding with  %s %p %d",info->providerName,info,count));
             spSendCtlResult(requestor, &info->providerSockets.send,
                 MSG_X_PROVIDER, count--, getProvIds(info).ids, req->options);
@@ -395,7 +394,6 @@ static void lookupProviderList(long type, int *requestor, OperationHdr * req)
             };
             spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
                NULL, req->options);
-            if (msg) free(msg);
 	    break;
          }
       }
@@ -414,7 +412,6 @@ static void findProvider(long type, int *requestor, OperationHdr * req)
    char *className = (char *) req->className.data;
    char *nameSpace = (char *) req->nameSpace.data;
    ProviderInfo *info;
-   char *msg=NULL;
    int rc;
    CMPIStatus st;
 
@@ -422,14 +419,13 @@ static void findProvider(long type, int *requestor, OperationHdr * req)
    
    if ((info = lookupProvider(type,className,nameSpace,&st)) != NULL) {
       if (info->type!=FORCE_PROVIDER_NOTFOUND &&
-          (rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
+          (rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
          spSendCtlResult(requestor, &info->providerSockets.send, MSG_X_PROVIDER,
             0, getProvIds(info).ids, req->options);
       }                   
       else {
          spSendCtlResult(requestor, &sfcbSockets.send, MSG_X_PROVIDER_NOT_FOUND, 0, 
             NULL, req->options);
-         if (msg) free(msg);
       }
    }
    else {
@@ -599,7 +595,6 @@ static void assocProviderList(int *requestor, OperationHdr * req)
    long count = 0;
    ProviderInfo *info;
    int dmy = 0, rc;
-   char *msg=NULL;
 
    if (className==NULL || *className == 0)
       className = "$ASSOCCLASSES$";
@@ -611,7 +606,7 @@ static void assocProviderList(int *requestor, OperationHdr * req)
          for (info = providers->ft->getFirst(providers); info;
               info = providers->ft->getNext(providers)) {
             if (info->type!=FORCE_PROVIDER_NOTFOUND &&
-                (rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
+                (rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
                _SFCB_TRACE(1,("--- responding with  %s %p %d",info->providerName,info,count));
                spSendCtlResult(requestor, &info->providerSockets.send,
                   MSG_X_PROVIDER, count--, getProvIds(info).ids, req->options);
@@ -619,10 +614,8 @@ static void assocProviderList(int *requestor, OperationHdr * req)
             else {
                spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND,
                   0, NULL, req->options);
-               if (msg) free(msg);
 	       break;
             }
-
          }
       }
       else {
@@ -634,7 +627,7 @@ static void assocProviderList(int *requestor, OperationHdr * req)
       /* When there is no provider for an assocClass we do not want to produce
        * an error message. So we return the default provider and expect it
        * to produce a nice and empty result */
-      if((rc = forkProvider(defaultProvInfoPtr, req, &msg)) == CMPI_RC_OK) {
+      if((rc = forkProvider(defaultProvInfoPtr, req, NULL)) == CMPI_RC_OK) {
          _SFCB_TRACE(1,("--- responding with  %s %p %d",
                         defaultProvInfoPtr->providerName,
                         defaultProvInfoPtr,count));
@@ -705,10 +698,8 @@ static ProviderInfo *getMethodProvider(char *className, char *nameSpace)
 
 static void classProvider(int *requestor, OperationHdr * req)
 {
-   char *msg;
-
    _SFCB_ENTER(TRACE_PROVIDERMGR, "classProvider");
-   forkProvider(classProvInfoPtr, req, &msg);
+   forkProvider(classProvInfoPtr, req, NULL);
    _SFCB_TRACE(1,("--- result %d-%lu to with %d-%lu",
       *requestor,getInode(*requestor),
       classProvInfoPtr->providerSockets.send,
@@ -716,16 +707,13 @@ static void classProvider(int *requestor, OperationHdr * req)
    
    spSendCtlResult(requestor, &classProvInfoPtr->providerSockets.send, MSG_X_PROVIDER,
       0, getProvIds(classProvInfoPtr).ids, req->options);
-                                   
    _SFCB_EXIT();
 }
 
 static void qualiProvider(int *requestor, OperationHdr * req)
 {
-   char *msg;
-   
    _SFCB_ENTER(TRACE_PROVIDERMGR, "qualiProvider");
-   forkProvider(qualiProvInfoPtr, req, &msg);
+   forkProvider(qualiProvInfoPtr, req, NULL);
    _SFCB_TRACE(1,("--- result %d-%lu to with %d-%lu",   
       *requestor,getInode(*requestor),
       qualiProvInfoPtr->providerSockets.send,
@@ -738,7 +726,6 @@ static void qualiProvider(int *requestor, OperationHdr * req)
 
 static void methProvider(int *requestor, OperationHdr * req)
 {
-   char *msg=NULL;
    int rc;
    char *className = (char *) req->className.data;
    char *nameSpace = (char *) req->nameSpace.data;
@@ -749,7 +736,7 @@ static void methProvider(int *requestor, OperationHdr * req)
       classProvider(requestor, req);
    else if ((info = getMethodProvider(className,nameSpace)) != NULL) {
       if (info->type!=FORCE_PROVIDER_NOTFOUND &&
-          (rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
+          (rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
          _SFCB_TRACE(1,("--- responding with  %s %p",info->providerName,info));
          spSendCtlResult(requestor, &info->providerSockets.send, MSG_X_PROVIDER,
             0, getProvIds(info).ids, req->options);
@@ -757,7 +744,6 @@ static void methProvider(int *requestor, OperationHdr * req)
       else {
          spSendCtlResult(requestor, &sfcbSockets.send, MSG_X_PROVIDER_NOT_FOUND,
             0, NULL, req->options);
-         if (msg) free(msg);
       }
    }
    else
@@ -773,32 +759,30 @@ static int _methProvider(BinRequestContext * ctx, OperationHdr * req)
    char *nameSpace = (char *) req->nameSpace.data;
    ProviderInfo *info;
    int rc;
-   char *msg;
 
    ctx->chunkedMode=ctx->xmlAs=0;
    if (strcmp(className, "$ClassProvider$") == 0) {
-      forkProvider(classProvInfoPtr, req, &msg);
+      forkProvider(classProvInfoPtr, req, NULL);
       ctx->provA.ids = getProvIds(classProvInfoPtr);
       ctx->provA.socket = classProvInfoPtr->providerSockets.send;
       ctx->pAs=NULL;
       _SFCB_RETURN(MSG_X_PROVIDER); 
    }
    else if (strcmp(className, "$InterOpProvider$") == 0) {
-      forkProvider(interOpProvInfoPtr, req, &msg);
+      forkProvider(interOpProvInfoPtr, req, NULL);
       ctx->provA.ids = getProvIds(interOpProvInfoPtr);
       ctx->provA.socket = interOpProvInfoPtr->providerSockets.send;
       ctx->pAs=NULL;
       _SFCB_RETURN(MSG_X_PROVIDER);
    }
    else if ((info = getMethodProvider(className,nameSpace)) != NULL) {
-      if ((rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
+      if ((rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
          ctx->provA.ids = getProvIds(info);
          ctx->provA.socket = info->providerSockets.send;
          ctx->pAs=NULL; 
          _SFCB_RETURN(MSG_X_PROVIDER);
       }
       else {
-         free(msg);
          _SFCB_RETURN(MSG_X_PROVIDER_NOT_FOUND);
       }
    }
@@ -1324,7 +1308,6 @@ static CMPIConstClass *_getConstClass(const char *ns, const char *cn, CMPIStatus
    BinRequestContext binCtx;
    OperationHdr req = { OPS_GetClass, 2 };
    int irc;
-   char *msg;
    
    path = NewCMPIObjectPath(ns, cn, st);
    sreq.objectPath = setObjectPathMsgSegment(path);
@@ -1333,7 +1316,7 @@ static CMPIConstClass *_getConstClass(const char *ns, const char *cn, CMPIStatus
    req.nameSpace = setCharsMsgSegment((char *) ns);
    req.className = setCharsMsgSegment((char *) cn);
 
-   forkProvider(classProvInfoPtr, &req, &msg);
+   forkProvider(classProvInfoPtr, &req, NULL);
    
    memset(&binCtx,0,sizeof(BinRequestContext));
    binCtx.oHdr = &req;
-- 
1.6.0.2

openSUSE Build Service is sponsored by