File 10006-2952616-internalProvider-is-not-Threadsafe.patch of Package sblim-sfcb-sle11-sp1

From b5064812358cd269cbc8e161c87bd13aa39cfab5 Mon Sep 17 00:00:00 2001
From: kkaempf <kkaempf@linux-lkbf.(none)>
Date: Mon, 8 Mar 2010 21:35:47 +0100
Subject: [PATCH 6/7] 2952616 internalProvider is not Threadsafe

---
 internalProvider.c         |   40 ++++++++++++++++++++++++++--------------
 package/sblim-sfcb.changes |    6 ++++--
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/internalProvider.c b/internalProvider.c
index b0fdabb..1bfb5ad 100644
--- a/internalProvider.c
+++ b/internalProvider.c
@@ -90,7 +90,7 @@ static CMPIInstance *instifyBlob(void * blob) {
 	}	
 }
 
-static CMPIInstance* ipGetBlob(const char *ns, const char *cls, char *id, int *len) {
+static CMPIInstance* ipGetBlob(const char *ns, const char *cls, const char *id, int *len) {
 	void *blob=getBlob(ns, cls, id, len);
    	return instifyBlob(blob);
 }
@@ -362,7 +362,7 @@ CMPIInstance *internalProviderGetInstance(const CMPIObjectPath * cop, CMPIStatus
    int len;
    CMPIString *cn = CMGetClassName(cop, NULL);
    CMPIString *ns = CMGetNameSpace(cop, NULL);
-   char *key = normalizeObjectPathChars(cop);
+   char *key = normalizeObjectPathCharsDup(cop);
    CMPIInstance *ci=NULL;
    const char *nss=ns->ft->getCharPtr(ns,NULL);
    const char *cns=cn->ft->getCharPtr(cn,NULL);
@@ -374,6 +374,7 @@ CMPIInstance *internalProviderGetInstance(const CMPIObjectPath * cop, CMPIStatus
    
    if (testNameSpace(bnss,rc)==0) {
       _SFCB_TRACE(1,("--- Invalid namespace %s",nss));
+      free(key);
       _SFCB_RETURN(NULL);
    }
 
@@ -385,6 +386,7 @@ CMPIInstance *internalProviderGetInstance(const CMPIObjectPath * cop, CMPIStatus
    }   
 
    *rc=st;
+   free(key);
    _SFCB_RETURN(ci);
 }
 
@@ -427,7 +429,7 @@ CMPIStatus InternalProviderCreateInstance(CMPIInstanceMI * mi,
    void *blob;
    CMPIString *cn = CMGetClassName(cop, NULL);
    CMPIString *ns = CMGetNameSpace(cop, NULL);
-   char *key = normalizeObjectPathChars(cop);
+   char *key = normalizeObjectPathCharsDup(cop);
    const char *nss=ns->ft->getCharPtr(ns,NULL);
    const char *cns=cn->ft->getCharPtr(cn,NULL);
    const char *bnss=repositoryNs(nss);
@@ -435,19 +437,22 @@ CMPIStatus InternalProviderCreateInstance(CMPIInstanceMI * mi,
    _SFCB_ENTER(TRACE_INTERNALPROVIDER, "InternalProviderCreateInstance");
    
    if (testNameSpace(bnss,&st)==0) {
-      return st;
+	   free(key);
+	   _SFCB_RETURN(st);
    }
 
    CMPIConstClass *cc =getConstClass(nss, cns);
    /* per DSP0004 2.5.2 */
    if (cc!=NULL && cc->ft->isAbstract(cc) != 0) {
       CMPIStatus st = { CMPI_RC_ERR_NOT_SUPPORTED, NULL };
-      return st;
+      free(key);
+      _SFCB_RETURN(st);
    }
 
    if (existingBlob(bnss,cns,key)) {
       CMPIStatus st = { CMPI_RC_ERR_ALREADY_EXISTS, NULL };
-      return st;
+      free(key);
+      _SFCB_RETURN(st);
    }
 
    len=getInstanceSerializedSize(ci);
@@ -458,7 +463,8 @@ CMPIStatus InternalProviderCreateInstance(CMPIInstanceMI * mi,
       CMPIStatus st = { CMPI_RC_ERR_FAILED, NULL };
       st.msg=sfcb_native_new_CMPIString("Unable to write to repository",NULL,0);
       free(blob);
-      return st;
+      free(key);
+      _SFCB_RETURN(st);
    }
    free(blob);
    
@@ -477,7 +483,7 @@ CMPIStatus InternalProviderCreateInstance(CMPIInstanceMI * mi,
 #endif
      }
    }
-
+   free(key);
    _SFCB_RETURN(st);
 }
 
@@ -493,7 +499,7 @@ CMPIStatus InternalProviderModifyInstance(CMPIInstanceMI * mi,
    void *blob;
    CMPIString *cn = CMGetClassName(cop, NULL);
    CMPIString *ns = CMGetNameSpace(cop, NULL);
-   char *key = normalizeObjectPathChars(cop);
+   char *key = normalizeObjectPathCharsDup(cop);
    const char *nss=ns->ft->getCharPtr(ns,NULL);
    const char *cns=cn->ft->getCharPtr(cn,NULL);
    const char *bnss=repositoryNs(nss);
@@ -502,12 +508,14 @@ CMPIStatus InternalProviderModifyInstance(CMPIInstanceMI * mi,
    _SFCB_ENTER(TRACE_INTERNALPROVIDER, "InternalProviderSetInstance");
    
    if (testNameSpace(bnss,&st)==0) {
-      return st;
+	  free(key);
+      _SFCB_RETURN(st);
    }
 
    if (existingBlob(bnss,cns,key)==0) {
       CMPIStatus st = { CMPI_RC_ERR_NOT_FOUND, NULL };
-      return st;
+      free(key);
+      _SFCB_RETURN(st);
    }
    
    if(properties) {
@@ -537,6 +545,7 @@ CMPIStatus InternalProviderModifyInstance(CMPIInstanceMI * mi,
       }
    }
 
+   free(key);
    _SFCB_RETURN(st);
 }
 
@@ -548,7 +557,7 @@ CMPIStatus InternalProviderDeleteInstance(CMPIInstanceMI * mi,
    CMPIStatus st = { CMPI_RC_OK, NULL };
    CMPIString *cn = CMGetClassName(cop, NULL);
    CMPIString *ns = CMGetNameSpace(cop, NULL);
-   char *key = normalizeObjectPathChars(cop);
+   char *key = normalizeObjectPathCharsDup(cop);
    const char *nss=ns->ft->getCharPtr(ns,NULL);
    const char *cns=cn->ft->getCharPtr(cn,NULL);
    const char *bnss=repositoryNs(nss);
@@ -556,12 +565,14 @@ CMPIStatus InternalProviderDeleteInstance(CMPIInstanceMI * mi,
    _SFCB_ENTER(TRACE_INTERNALPROVIDER, "InternalProviderDeleteInstance");
    
    if (testNameSpace(bnss,&st)==0) {
-      return st;
+	   free(key);
+	   _SFCB_RETURN(st);
    }
 
    if (existingBlob(bnss,cns,key)==0) {
       CMPIStatus st = { CMPI_RC_ERR_NOT_FOUND, NULL };
-      return st;
+      free(key);
+      _SFCB_RETURN(st);
    }
 
    deleteBlob(bnss,cns,key);
@@ -572,6 +583,7 @@ CMPIStatus InternalProviderDeleteInstance(CMPIInstanceMI * mi,
    }
 #endif
 
+   free(key);
    _SFCB_RETURN(st);
 }
 
-- 
1.6.4.2

openSUSE Build Service is sponsored by