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