From: Narasimha S. <nsh...@us...> - 2011-11-30 18:54:28
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "SFCB - Small Footprint CIM Broker". The branch, master has been updated via 908a8bf2bc81264c3d3950d00dbf2499db09bc7e (commit) from d78ab371e7715e1520e226e28ad08891eb1ed414 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 908a8bf2bc81264c3d3950d00dbf2499db09bc7e Author: Narasimha Sharoff <nsh...@us...> Date: Wed Nov 30 10:52:33 2011 -0800 [3446179] Add a feature to validate CMPI types ----------------------------------------------------------------------- Summary of changes: diff --git a/cimRequest.c b/cimRequest.c index a1b7c7a..fddc810 100644 --- a/cimRequest.c +++ b/cimRequest.c @@ -348,6 +348,26 @@ DESCRIPTION=\"User Account Expired\">\n\ #endif /* ALLOW_UPDATE_EXPIRED_PW */ +/* feature-75543 : report type validation errors for str2CMPIValue */ +static RespSegments valErrResponse(RequestHdr * hdr, + BinRequestContext * ctx, int meth) +{ + char msg[256]; + CMPIrc err; + switch (ctx->rc) { + case CMPI_RC_ERR_INVALID_PARAMETER: + hdr->errMsg = strdup("Invalid parameter provided"); + err = CMPI_RC_ERR_INVALID_PARAMETER; + break; + default: + sprintf(msg, "Internal error - %d\n", ctx->rc); + hdr->errMsg = strdup(msg); + err = CMPI_RC_ERR_FAILED; + } + if (meth) return(methodErrResponse(hdr,getErrSegment(err,hdr->errMsg))); + else return(iMethodErrResponse(hdr,getErrSegment(err,hdr->errMsg))); +} + static RespSegments ctxErrResponse(RequestHdr * hdr, BinRequestContext * ctx, int meth) { @@ -983,9 +1003,17 @@ modifyInstance(CimRequestContext * ctx, RequestHdr * hdr) _SFCB_ENTER(TRACE_CIMXMLPROC, "modifyInstance"); int irc; BinResponseHdr *resp; + BinRequestContext *binCtx = hdr->binCtx; + + /* If CMPIType for a value is incorrect, return error #75543 */ + if (binCtx->rc != CMPI_RC_OK) { + _SFCB_TRACE(1, ("--- binCtx->rc returned: %d",hdr->binCtx->rc)); + if (hdr->binCtx->bHdr) free(hdr->binCtx->bHdr); + _SFCB_RETURN(valErrResponse(hdr, hdr->binCtx, 0)); + } + _SFCB_TRACE(1, ("--- Getting Provider context")); irc = getProviderContext(hdr->binCtx); - _SFCB_TRACE(1, ("--- Provider context gotten")); if (irc == MSG_X_PROVIDER) { RespSegments rs; diff --git a/cimXmlGen.c b/cimXmlGen.c index 428b368..e8db53f 100644 --- a/cimXmlGen.c +++ b/cimXmlGen.c @@ -324,6 +324,7 @@ makeFromEmbeddedObject(XtokValue value, char *ns) CMPIValue val; memset(&val, 0, sizeof(CMPIValue)); CMPIObjectPath *path; + CMPIStatus rc = {CMPI_RC_OK, NULL}; if (value.type == typeValue_Instance) { CMPIInstance *inst; @@ -333,7 +334,7 @@ makeFromEmbeddedObject(XtokValue value, char *ns) for (p = xtokInstance->properties.first; p; p = p->next) { if (p->val.val.value) { - val = str2CMPIValue(p->valueType, p->val.val, &p->val.ref, NULL); + val = str2CMPIValue(p->valueType, p->val.val, &p->val.ref, NULL, &rc); CMSetProperty(inst, p->name, &val, p->valueType); } } @@ -346,10 +347,11 @@ makeFromEmbeddedObject(XtokValue value, char *ns) CMPIValue str2CMPIValue(CMPIType type, XtokValue val, XtokValueReference * ref, - char *ns) + char *ns, CMPIStatus *status) { CMPIValue value; CMPIType t = 0; + CMPIStatus rc = {CMPI_RC_OK, NULL}; if (type == 0) { type = guessType(val.value); @@ -383,13 +385,14 @@ str2CMPIValue(CMPIType type, XtokValue val, XtokValueReference * ref, value.array = TrackedCMPIArray(max, t, NULL); if (value.array != NULL) { for (i = 0; i < max; i++) { - v = str2CMPIValue(t, arr->values[i], refarr->values + i, ns); + v = str2CMPIValue(t, arr->values[i], refarr->values + i, ns, &rc); CMSetArrayElementAt(value.array, i, &v, t); } return value; } } + /* Feature 75543 - set and return status->rc on failures */ switch (type) { case CMPI_char16: value.char16 = *val.value; @@ -398,41 +401,69 @@ str2CMPIValue(CMPIType type, XtokValue val, XtokValueReference * ref, value.string = sfcb_native_new_CMPIString(val.value, NULL, 0); break; case CMPI_sint64: - sscanf(val.value, "%lld", &value.sint64); + if (invalid_int(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%lld", &value.sint64); break; case CMPI_uint64: - sscanf(val.value, "%llu", &value.uint64); + if (invalid_uint(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%llu", &value.uint64); break; case CMPI_sint32: - sscanf(val.value, "%d", &value.sint32); + if (invalid_int(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%d", &value.sint32); break; case CMPI_uint32: - sscanf(val.value, "%u", &value.uint32); + if (invalid_uint(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%u", &value.uint32); break; case CMPI_sint16: - sscanf(val.value, "%hd", &value.sint16); + if (invalid_int(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%hd", &value.sint16); break; case CMPI_uint16: - sscanf(val.value, "%hu", &value.uint16); + if (invalid_uint(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%hu", &value.uint16); break; case CMPI_uint8: - sscanf(val.value, "%u", &value.uint32); - value.uint8 = value.uint32; + if (invalid_uint(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else { + sscanf(val.value, "%u", &value.uint32); + value.uint8 = value.uint32; + } break; case CMPI_sint8: - sscanf(val.value, "%d", &value.sint32); - value.sint8 = value.sint32; + if (invalid_int(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else { + sscanf(val.value, "%d", &value.sint32); + value.sint8 = value.sint32; + } break; case CMPI_boolean: - value.boolean = strcasecmp(val.value, "false"); - if (value.boolean) - value.boolean = 1; + if (invalid_boolean(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else { + value.boolean = strcasecmp(val.value, "false"); + if (value.boolean) + value.boolean = 1; + } break; case CMPI_real32: - sscanf(val.value, "%f", &value.real32); + if (invalid_real(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%f", &value.real32); break; case CMPI_real64: - sscanf(val.value, "%lf", &value.real64); + if (invalid_real(val.value, type)) + status->rc = CMPI_RC_ERR_INVALID_PARAMETER; + else sscanf(val.value, "%lf", &value.real64); break; case CMPI_dateTime: value.dateTime = diff --git a/cimXmlGen.h b/cimXmlGen.h index 9425393..dfc9edc 100644 --- a/cimXmlGen.h +++ b/cimXmlGen.h @@ -40,7 +40,7 @@ extern CMPIValue *getKeyValueTypePtr(char *type, char *value, CMPIValue * val, CMPIType *typ, char *scopingNS); extern CMPIValue str2CMPIValue(CMPIType type, XtokValue val, - XtokValueReference * ref, char *ns); + XtokValueReference * ref, char *ns, CMPIStatus *status); extern int value2xml(CMPIData d, UtilStringBuffer * sb, int wv); extern int instanceName2xml(CMPIObjectPath * cop, UtilStringBuffer * sb); @@ -63,6 +63,11 @@ extern void data2xml(CMPIData *data, void *obj, CMPIString *name, UtilStringBuffer * qsb, int inst, int param); CMPIType guessType(char *val); +extern int invalid_int(const char *v, const CMPIType type); +extern int invalid_uint(const char *v, const CMPIType type); +extern int invalid_real(const char *v, const CMPIType type); +extern int invalid_boolean(const char *v, const CMPIType type); + #endif /* MODELINES */ /* DO NOT EDIT BELOW THIS COMMENT */ diff --git a/cimXmlOps.y b/cimXmlOps.y index 4d79674..fbc3d31 100644 --- a/cimXmlOps.y +++ b/cimXmlOps.y @@ -35,6 +35,7 @@ #include "cmpidtx.h" #include "cimXmlGen.h" #include "cimXmlParser.h" +#include "cimXmlOps.h" #include "objectImpl.h" #include "constClass.h" #include "native.h" @@ -288,6 +289,7 @@ buildCreateInstanceRequest(void *parm) RequestHdr *hdr = &(((ParserControl *)parm)->reqHdr); BinRequestContext *binCtx = hdr->binCtx; + CMPIStatus rc = {CMPI_RC_OK, NULL}; memset(binCtx, 0, sizeof(BinRequestContext)); XtokCreateInstance *req = (XtokCreateInstance *) hdr->cimRequest; @@ -307,7 +309,7 @@ buildCreateInstanceRequest(void *parm) if (p->val.val.value) { val = str2CMPIValue(p->valueType, p->val.val, &p->val.ref, - req->op.nameSpace.data); + req->op.nameSpace.data, &rc); CMSetProperty(inst, p->name, &val, p->valueType); } } @@ -527,6 +529,7 @@ buildCreateClassRequest(void *parm) XtokClass *c; CMPIData d; CMPIParameter pa; + CMPIStatus rc = {CMPI_RC_OK, NULL}; memset(binCtx, 0, sizeof(BinRequestContext)); XtokCreateClass *req = (XtokCreateClass *) hdr->cimRequest; @@ -547,7 +550,7 @@ buildCreateClassRequest(void *parm) d.value.uint64 = 0; } else { d.state = CMPI_goodValue; - d.value = str2CMPIValue(q->type, q->value, NULL, NULL); + d.value = str2CMPIValue(q->type, q->value, NULL, NULL, &rc); } d.type = q->type; ClClassAddQualifier(&cl->hdr, &cl->qualifiers, q->name, d); @@ -564,7 +567,7 @@ buildCreateClassRequest(void *parm) d.state = CMPI_goodValue; d.value = str2CMPIValue(p->valueType, p->val.val, &p->val.ref, - req->op.nameSpace.data); + req->op.nameSpace.data, &rc); } d.type = p->valueType; propId = ClClassAddProperty(cl, p->name, d, p->referenceClass); @@ -579,7 +582,7 @@ buildCreateClassRequest(void *parm) d.value.uint64 = 0; } else { d.state = CMPI_goodValue; - d.value = str2CMPIValue(q->type, q->value, NULL, NULL); + d.value = str2CMPIValue(q->type, q->value, NULL, NULL, &rc); } d.type = q->type; ClClassAddPropertyQualifier(&cl->hdr, prop, q->name, d); @@ -605,7 +608,7 @@ buildCreateClassRequest(void *parm) d.value.uint64 = 0; } else { d.state = CMPI_goodValue; - d.value = str2CMPIValue(q->type, q->value, NULL, NULL); + d.value = str2CMPIValue(q->type, q->value, NULL, NULL, &rc); } d.type = q->type; ClClassAddMethodQualifier(&cl->hdr, meth, q->name, d); @@ -628,7 +631,7 @@ buildCreateClassRequest(void *parm) d.value.uint64 = 0; } else { d.state = CMPI_goodValue; - d.value = str2CMPIValue(q->type, q->value, NULL, NULL); + d.value = str2CMPIValue(q->type, q->value, NULL, NULL, &rc); } d.type = q->type; ClClassAddMethParamQualifier(&cl->hdr, cl_parm, q->name, d); @@ -659,7 +662,7 @@ buildCreateClassRequest(void *parm) binCtx->pAs = NULL; } -static void +static int buildModifyInstanceRequest(void *parm) { CMPIObjectPath *path; @@ -676,6 +679,8 @@ buildModifyInstanceRequest(void *parm) XtokProperty *p = NULL; RequestHdr *hdr = &(((ParserControl *)parm)->reqHdr); BinRequestContext *binCtx = hdr->binCtx; + CMPIStatus rc = {CMPI_RC_OK, NULL}; + int err = 0; memset(binCtx, 0, sizeof(BinRequestContext)); XtokModifyInstance *req = (XtokModifyInstance *) hdr->cimRequest; @@ -712,7 +717,12 @@ buildModifyInstanceRequest(void *parm) if (p->val.val.value) { val = str2CMPIValue(p->valueType, p->val.val, &p->val.ref, - req->op.nameSpace.data); + req->op.nameSpace.data, &rc); + if (rc.rc != CMPI_RC_OK) { /* bugzilla 75543 */ + binCtx->rc = rc.rc; + err = 1; + break; + } CMSetProperty(inst, p->name, &val, p->valueType); } } @@ -727,6 +737,7 @@ buildModifyInstanceRequest(void *parm) binCtx->bHdrSize = sreqSize; binCtx->chunkedMode = binCtx->xmlAs = binCtx->noResp = 0; binCtx->pAs = NULL; + return err; } static void @@ -1079,6 +1090,7 @@ buildSetPropertyRequest(void *parm) SetPropertyReq *sreq;// = BINREQ(OPS_SetProperty, 3); RequestHdr *hdr = &(((ParserControl *)parm)->reqHdr); BinRequestContext *binCtx = hdr->binCtx; + CMPIStatus st = {CMPI_RC_OK, NULL}; memset(binCtx, 0, sizeof(BinRequestContext)); XtokSetProperty *req = (XtokSetProperty *) hdr->cimRequest; @@ -1107,7 +1119,7 @@ buildSetPropertyRequest(void *parm) if (t != CMPI_null) { val = str2CMPIValue(t, req->newVal.val, &req->newVal.ref, - req->op.nameSpace.data); + req->op.nameSpace.data, &st); CMSetProperty(inst, req->propertyName, &val, t); } else { val.string = 0; @@ -1201,6 +1213,7 @@ buildSetQualifierRequest(void *parm) SetQualifierReq *sreq;// = BINREQ(OPS_SetQualifier, 3); RequestHdr *hdr = &(((ParserControl *)parm)->reqHdr); BinRequestContext *binCtx = hdr->binCtx; + CMPIStatus rc = {CMPI_RC_OK, NULL}; memset(binCtx, 0, sizeof(BinRequestContext)); XtokSetQualifier *req = (XtokSetQualifier *) hdr->cimRequest; @@ -1256,7 +1269,7 @@ buildSetQualifierRequest(void *parm) d.value = str2CMPIValue(d.type, req->qualifierdeclaration.data.value, (XtokValueReference *) & req->qualifierdeclaration.data.valueArray, - NULL); + NULL, &rc); ClQualifierAddQualifier(&q->hdr, &q->qualifierData, req->qualifierdeclaration.name, d); } else { // no default value - rely on ISARRAY @@ -1338,6 +1351,7 @@ buildInvokeMethodRequest(void *parm) XtokParamValue *p; RequestHdr *hdr = &(((ParserControl *)parm)->reqHdr); BinRequestContext *binCtx = hdr->binCtx; + CMPIStatus st = {CMPI_RC_OK, NULL}; memset(binCtx, 0, sizeof(BinRequestContext)); XtokMethodCall *req = (XtokMethodCall *) hdr->cimRequest; @@ -1385,7 +1399,7 @@ buildInvokeMethodRequest(void *parm) if (p->value.value) { CMPIValue val = str2CMPIValue(p->type, p->value, &p->valueRef, - req->op.nameSpace.data); + req->op.nameSpace.data, &st); CMAddArg(in, p->name, &val, p->type); } } @@ -2905,7 +2919,7 @@ modifyInstance $$.properties=0; setRequest(parm,&$$,sizeof(XtokModifyInstance),OPS_ModifyInstance); - buildModifyInstanceRequest(parm); + if (buildModifyInstanceRequest(parm)) yyerror("Invalid Parameter"); } | localNameSpacePath modifyInstanceParmsList { @@ -2919,7 +2933,7 @@ modifyInstance $$.properties=$2.properties; setRequest(parm,&$$,sizeof(XtokModifyInstance),OPS_ModifyInstance); - buildModifyInstanceRequest(parm); + if (buildModifyInstanceRequest(parm)) yyerror("Invalid Parameter"); } ; hooks/post-receive -- SFCB - Small Footprint CIM Broker |