From f9800113caf680157b86a7d7e072fb163985e52f Mon Sep 17 00:00:00 2001 From: Jan Synacek Date: Wed, 13 Feb 2013 15:31:23 +0100 Subject: LogicalFile: check for valid classes in association methods --- .../LMI_DirectoryContainsFileProvider.c | 30 ++++++++++++++++++++ src/logicalfile/LMI_FileIdentityProvider.c | 32 ++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/logicalfile/LMI_DirectoryContainsFileProvider.c b/src/logicalfile/LMI_DirectoryContainsFileProvider.c index 8eb6018..fcc77f3 100644 --- a/src/logicalfile/LMI_DirectoryContainsFileProvider.c +++ b/src/logicalfile/LMI_DirectoryContainsFileProvider.c @@ -93,6 +93,27 @@ static CMPIStatus dir_file_objectpaths( CMReturn(CMPI_RC_OK); } +static int check_valid_classes(const CMPIObjectPath *o) +{ + const char *VALID_CLASSES[] = { + "LMI_DataFile", + "LMI_UnixDeviceFile", + "LMI_UnixDirectory", + "LMI_FIFOPipeFile", + "LMI_SymbolicLink", + "LMI_UnixSocket", + NULL + }; + int found = 0; + for (int i = 0; VALID_CLASSES[i]; i++) { + if (CMClassPathIsA(_cb, o, VALID_CLASSES[i], NULL)) { + found++; + break; + } + } + return found; +} + static CMPIStatus associators( CMPIAssociationMI* mi, const CMPIContext* cc, @@ -115,6 +136,10 @@ static CMPIStatus associators( if (st.rc != CMPI_RC_OK) { return st; } + /* allow only LMI_UnixFile and classes derived from CIM_LogicalFile */ + if (!check_valid_classes(cop)) { + CMReturn(CMPI_RC_OK); + } cd = CMGetKey(cop, "CreationClassName", &st); const char *ccname = KChars(cd.value.string); @@ -182,6 +207,11 @@ static CMPIStatus references( CMPIObjectPath *o; CMPIInstance *ci; + /* allow only LMI_UnixFile and classes derived from CIM_LogicalFile */ + if (!check_valid_classes(cop)) { + CMReturn(CMPI_RC_OK); + } + CIM_DirectoryRef_Init(&lmi_dr, _cb, ns); CIM_LogicalFileRef_Init(&lmi_lfr, _cb, ns); LMI_DirectoryContainsFile_Init(&lmi_dcf, _cb, ns); diff --git a/src/logicalfile/LMI_FileIdentityProvider.c b/src/logicalfile/LMI_FileIdentityProvider.c index 453764e..9e3427c 100644 --- a/src/logicalfile/LMI_FileIdentityProvider.c +++ b/src/logicalfile/LMI_FileIdentityProvider.c @@ -27,6 +27,28 @@ static const CMPIBroker* _cb; +static int check_valid_classes(const CMPIObjectPath *o) +{ + const char *VALID_CLASSES[] = { + "LMI_UnixFile", + "LMI_DataFile", + "LMI_UnixDeviceFile", + "LMI_UnixDirectory", + "LMI_FIFOPipeFile", + "LMI_SymbolicLink", + "LMI_UnixSocket", + NULL + }; + int found = 0; + for (int i = 0; VALID_CLASSES[i]; i++) { + if (CMClassPathIsA(_cb, o, VALID_CLASSES[i], NULL)) { + found++; + break; + } + } + return found; +} + static CMPIStatus associators( CMPIAssociationMI* mi, const CMPIContext* cc, @@ -42,6 +64,11 @@ static CMPIStatus associators( CMPIStatus st, res; CMPIInstance *ci; + /* allow only LMI_UnixFile and classes derived from CIM_LogicalFile */ + if (!check_valid_classes(cop)) { + CMReturn(CMPI_RC_OK); + } + /* TODO filtering */ if (names) { res = CMReturnObjectPath(cr, cop); @@ -74,6 +101,11 @@ static CMPIStatus references( const char *ns = KNameSpace(cop); CMPIInstance *ci; + /* allow only LMI_UnixFile and classes derived from CIM_LogicalFile */ + if (!check_valid_classes(cop)) { + CMReturn(CMPI_RC_OK); + } + LMI_FileIdentity_Init(&lmi_fi, _cb, ns); if (CMClassPathIsA(_cb, cop, LMI_UnixFile_ClassName, &st)) { -- cgit