From 01e0800741a2934e2cfb2469385b46499730ece9 Mon Sep 17 00:00:00 2001 From: Chris Freehill Date: Sun, 25 Aug 2019 19:22:05 -0500 Subject: [PATCH] Fix issues with buffer length when getting brand name * Specifically, address case when brand name is longer than buffer provided * Also, slightly modify prototype to match similar, existing APIs. * Address some cpplint issues. Change-Id: Iaf77304e23085123e88f301e4b33bc4e6be2a225 --- include/rocm_smi/rocm_smi.h | 2 +- src/rocm_smi.cc | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/rocm_smi/rocm_smi.h b/include/rocm_smi/rocm_smi.h index 7203bbde..28a5f52c 100755 --- a/include/rocm_smi/rocm_smi.h +++ b/include/rocm_smi/rocm_smi.h @@ -806,7 +806,7 @@ rsmi_status_t rsmi_dev_name_get(uint32_t dv_ind, char *name, size_t len); * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. * */ -rsmi_status_t rsmi_dev_brand_get(uint32_t dv_ind, char *brand, size_t len); +rsmi_status_t rsmi_dev_brand_get(uint32_t dv_ind, char *brand, uint32_t len); /** * @brief Get the name string for a give vendor ID diff --git a/src/rocm_smi.cc b/src/rocm_smi.cc index 873c7b47..742379d2 100755 --- a/src/rocm_smi.cc +++ b/src/rocm_smi.cc @@ -1423,14 +1423,13 @@ rsmi_dev_name_get(uint32_t dv_ind, char *name, size_t len) { } rsmi_status_t -rsmi_dev_brand_get(uint32_t dv_ind, char *brand, size_t len) { +rsmi_dev_brand_get(uint32_t dv_ind, char *brand, uint32_t len) { GET_DEV_FROM_INDX // Return 'invalid args' if arguments are invalid - if (brand == nullptr || len == 0){ + if (brand == nullptr || len == 0) { return RSMI_STATUS_INVALID_ARGS; } - std::map brand_names = - { + std::map brand_names = { {"D05121", "mi25"}, {"D05131", "mi25"}, {"D05133", "mi25"}, @@ -1447,11 +1446,17 @@ rsmi_dev_brand_get(uint32_t dv_ind, char *brand, size_t len) { return errno_to_rsmi_status(ret); } if (vbios_value.length() == 16) { - sku_value = vbios_value.substr(4,6); + sku_value = vbios_value.substr(4, 6); // Find the brand name using sku_value it = brand_names.find(sku_value); if (it != brand_names.end()) { - strcpy(brand, it->second.c_str()); + uint32_t ln = it->second.copy(brand, len); + brand[std::min(len - 1, ln)] = '\0'; + + if (len < (it->second.size() + 1)) { + return RSMI_STATUS_INSUFFICIENT_SIZE; + } + return RSMI_STATUS_SUCCESS; } }