diff options
author | Suryakanth Sekar <suryakanth.sekar@linux.intel.com> | 2019-08-08 14:30:19 +0530 |
---|---|---|
committer | Tom Joseph <tomjoseph@in.ibm.com> | 2019-08-28 09:52:47 +0000 |
commit | 0a327e1ce11fb6ef083bffcbb5426e3d10542753 (patch) | |
tree | 0e7085e0776db45a2e8ad285aa3183740cbaf213 | |
parent | e405440f87a4748a7ec116eb3ec44693ede8cf79 (diff) | |
download | phosphor-host-ipmid-0a327e1ce11fb6ef083bffcbb5426e3d10542753.tar.gz phosphor-host-ipmid-0a327e1ce11fb6ef083bffcbb5426e3d10542753.zip |
Added VLAN ID checking condition in Set LAN config
According to the VLAN 802.1VLAN spec, VLAN ID should be 1-4095
Unit test:
Verified VLAN ID 1-4095 is allowed and CC returns for 0 & > 4095
Signed-off-by: Suryakanth Sekar <suryakanth.sekar@linux.intel.com>
Change-Id: I54bbc94c814c98dda11f8241fa31bfe0e5bbb150
-rw-r--r-- | transporthandler.cpp | 13 | ||||
-rw-r--r-- | transporthandler.hpp | 3 |
2 files changed, 15 insertions, 1 deletions
diff --git a/transporthandler.cpp b/transporthandler.cpp index 8795c1a..acff251 100644 --- a/transporthandler.cpp +++ b/transporthandler.cpp @@ -416,7 +416,6 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_context_t context) { ipmi_ret_t rc = IPMI_CC_OK; - *data_len = 0; char ipaddr[INET_ADDRSTRLEN]; char netmask[INET_ADDRSTRLEN]; @@ -425,6 +424,9 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, auto reqptr = reinterpret_cast<const set_lan_t*>(request); sdbusplus::bus::bus bus(ipmid_get_sd_bus_connection()); + size_t reqLen = *data_len; + *data_len = 0; + // channel number is the lower nibble int channel = reqptr->channel & CHANNEL_MASK; auto ethdevice = ipmi::getChannelName(channel); @@ -499,12 +501,21 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd, case LanParam::VLAN: { + if (reqLen != lanParamVLANSize) + { + return IPMI_CC_REQ_DATA_LEN_INVALID; + } + uint16_t vlan{}; std::memcpy(&vlan, reqptr->data, ipmi::network::VLAN_SIZE_BYTE); // We are not storing the enable bit // We assume that ipmitool always send enable // bit as 1. vlan = le16toh(vlan); + if (vlan == 0 || vlan > maxValidVLANIDValue) + { + return IPMI_CC_INVALID_FIELD_REQUEST; + } channelConf->vlanID = vlan; } break; diff --git a/transporthandler.hpp b/transporthandler.hpp index 04d4673..5896082 100644 --- a/transporthandler.hpp +++ b/transporthandler.hpp @@ -79,6 +79,8 @@ enum class LanParam : uint8_t IPV6_NEIGHBOR_TIMING_CONFIGURATION = 80, }; +// Data length of parameters +constexpr size_t lanParamVLANSize = 4; constexpr uint8_t SET_COMPLETE = 0; constexpr uint8_t SET_IN_PROGRESS = 1; constexpr uint8_t SET_COMMIT_WRITE = 2; // Optional @@ -136,3 +138,4 @@ void commitNetworkChanges(); * @param[in] channel: channel number. */ void applyChanges(int channel); +constexpr uint16_t maxValidVLANIDValue = 4095; |