summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Smirnov <ismirno@us.ibm.com>2019-09-30 17:54:22 -0500
committerDaniel M Crowell <dcrowell@us.ibm.com>2019-10-02 09:24:15 -0500
commit0e562123238003f23d423a63bbc25919f30cf817 (patch)
tree6b3530893d01bbf20abe750f37fb95dbd2e727dc
parentadc61f1bddd14ae2ec47f931f496f40d1f96dada (diff)
downloadtalos-hostboot-0e562123238003f23d423a63bbc25919f30cf817.tar.gz
talos-hostboot-0e562123238003f23d423a63bbc25919f30cf817.zip
Fix ThreadPool Memory Corruption
One of the functions that ends up being called by threads spun by ThreadPool has a potential memory corruption where a vector of data structures can be searched while it's being populated by two different threads. This commit changes the positions of mutex lock and ulock calls in the vicinity to protect the population and search of the vector. Change-Id: Ic1a5eb8928c1133ee2a99e2d9c04607be3c41b15 CQ: SW476649 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84561 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R Geddes <crgeddes@us.ibm.com> Reviewed-by: Nicholas E Bofferding <bofferdn@us.ibm.com> Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
-rw-r--r--src/usr/fapi2/attribute_service.C8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/usr/fapi2/attribute_service.C b/src/usr/fapi2/attribute_service.C
index 2f2ae45e0..d1a301169 100644
--- a/src/usr/fapi2/attribute_service.C
+++ b/src/usr/fapi2/attribute_service.C
@@ -2081,6 +2081,7 @@ ReturnCode platGetDQAttrISDIMM(
}
else
{
+ mutex_lock(&l_C4DQmutex);
auto l_huid = TARGETING::get_huid(l_pTarget);
auto l_iterator = std::find ( l_cachedC4DQValues.begin(),
l_cachedC4DQValues.end(),
@@ -2093,14 +2094,13 @@ ReturnCode platGetDQAttrISDIMM(
l_kvPair.huid = l_huid;
rc = getDQAttrISDIMM(l_fapiTarget, l_kvPair.value);
memcpy(o_vpdIsDimmTOC4DQVal, l_kvPair.value, sizeof(ATTR_CEN_VPD_ISDIMMTOC4DQ_Type));
- mutex_lock(&l_C4DQmutex);
l_cachedC4DQValues.push_back(l_kvPair);
- mutex_unlock(&l_C4DQmutex);
}
else
{
memcpy(o_vpdIsDimmTOC4DQVal, (*l_iterator).value, sizeof(ATTR_CEN_VPD_ISDIMMTOC4DQ_Type));
}
+ mutex_unlock(&l_C4DQmutex);
}
return rc;
@@ -2132,6 +2132,7 @@ ReturnCode platGetDQSAttrISDIMM(
}
else
{
+ mutex_lock(&l_C4DQSmutex);
auto l_huid = TARGETING::get_huid(l_pTarget);
auto l_iterator = std::find ( l_cachedC4DQSValues.begin(),
l_cachedC4DQSValues.end(),
@@ -2145,14 +2146,13 @@ ReturnCode platGetDQSAttrISDIMM(
l_kvPair.huid = l_huid;
rc = getDQSAttrISDIMM(l_fapiTarget, l_kvPair.value);
memcpy(o_vpdIsDimmTOC4DQSVal, l_kvPair.value, sizeof(ATTR_CEN_VPD_ISDIMMTOC4DQS_Type));
- mutex_lock(&l_C4DQSmutex);
l_cachedC4DQSValues.push_back(l_kvPair);
- mutex_unlock(&l_C4DQSmutex);
}
else
{
memcpy(o_vpdIsDimmTOC4DQSVal, (*l_iterator).value, sizeof(ATTR_CEN_VPD_ISDIMMTOC4DQS_Type));
}
+ mutex_unlock(&l_C4DQSmutex);
}
return rc;
OpenPOWER on IntegriCloud