Legacy: Prevent incorrect access to NetID maps

v0.3.0-dev
Paul Hollinsky 2022-02-21 20:53:42 -05:00
parent 58944a2523
commit 94e0ea1fe0
1 changed files with 62 additions and 13 deletions

View File

@ -27,8 +27,28 @@ using namespace icsneo;
typedef uint64_t legacymaphandle_t;
static std::map<legacymaphandle_t, neodevice_t> neodevices;
static std::map<const size_t, size_t> mp_netIDToVnetOffSet = {{NETID_HSCAN, 1}, {NETID_MSCAN, 2}, {NETID_HSCAN2, 18}, {NETID_HSCAN3, 19}, {NETID_HSCAN4, 32}, {NETID_HSCAN5, 33}, {NETID_HSCAN6, 47}, {NETID_HSCAN7, 48}};
static std::map<const size_t, size_t> mp_HWnetIDToCMnetID = {{NETID_HSCAN, 0}, {NETID_MSCAN, 1}, {NETID_HSCAN2, 5}, {NETID_HSCAN3, 8}, {NETID_HSCAN4, 14}, {NETID_HSCAN5, 15}, {NETID_HSCAN6, 32}, {NETID_HSCAN7, 33}};
static const std::map<size_t, size_t> mp_netIDToVnetOffSet = {
{NETID_HSCAN, 1},
{NETID_MSCAN, 2},
{NETID_HSCAN2, 18},
{NETID_HSCAN3, 19},
{NETID_HSCAN4, 32},
{NETID_HSCAN5, 33},
{NETID_HSCAN6, 47},
{NETID_HSCAN7, 48},
};
static const std::map<size_t, size_t> mp_HWnetIDToCMnetID = {
{NETID_HSCAN, 0},
{NETID_MSCAN, 1},
{NETID_HSCAN2, 5},
{NETID_HSCAN3, 8},
{NETID_HSCAN4, 14},
{NETID_HSCAN5, 15},
{NETID_HSCAN6, 32},
{NETID_HSCAN7, 33},
};
static unsigned long vnet_table[] = {0, PLASMA_SLAVE1_OFFSET, PLASMA_SLAVE2_OFFSET};
static NeoDevice OldNeoDeviceFromNew(const neodevice_t *newnd)
@ -119,10 +139,14 @@ static inline bool IdIsSlaveBRange2(unsigned int fullNetid)
static inline unsigned int GetVnetNetid(size_t simpleNetId, EPlasmaIonVnetChannel_t vnetSlot)
{
if (vnetSlot == 0 || vnetSlot > 3)
if (vnetSlot == 0 || vnetSlot >= sizeof(vnet_table)/sizeof(vnet_table[0]))
return simpleNetId;
return mp_netIDToVnetOffSet[simpleNetId] + vnet_table[vnetSlot];
const auto offset = mp_netIDToVnetOffSet.find(simpleNetId);
if (offset == mp_netIDToVnetOffSet.end())
return simpleNetId;
return offset->second + vnet_table[vnetSlot];
}
/**
@ -1107,10 +1131,25 @@ int LegacyDLLExport icsneoJ2534Cmd(void *hObject, unsigned char *CmdBuf, short L
case NEODEVICE_ION: //FIRE2 VNETS
SFire2Settings Cs;
iNumBytes = sizeof(Cs);
if (!!icsneoGetFire2Settings(hObject, &Cs, iNumBytes))
(Cs.termination_enables & (1ull << mp_HWnetIDToCMnetID[GetVnetAgnosticNetid(NetworkID)])) ? *pTmp = 3 /*Termination ON*/ : *pTmp = 0 /*Termination OFF*/;
if (icsneoGetFire2Settings(hObject, &Cs, iNumBytes))
{
const auto cmId = mp_HWnetIDToCMnetID.find(GetVnetAgnosticNetid(NetworkID));
if (cmId != mp_HWnetIDToCMnetID.end())
{
if (Cs.termination_enables & (1ull << cmId->second))
*pTmp = 3; // Termination ON
else
*pTmp = 0; // Termination OFF
}
else
{
iRetVal = 0;
}
}
else
{
iRetVal = 0;
}
break;
}
break;
@ -1130,15 +1169,25 @@ int LegacyDLLExport icsneoJ2534Cmd(void *hObject, unsigned char *CmdBuf, short L
iNumBytes = sizeof(Cs);
if (icsneoGetFire2Settings(hObject, &Cs, iNumBytes))
{
unsigned long long CoremininetID = mp_HWnetIDToCMnetID[GetVnetAgnosticNetid(NetworkID)];
const auto cmId = mp_HWnetIDToCMnetID.find(GetVnetAgnosticNetid(NetworkID));
if (cmId != mp_HWnetIDToCMnetID.end())
{
if (*pTmp == 3) /*Termination ON*/
Cs.termination_enables |= (1ull << CoremininetID);
Cs.termination_enables |= (1ull << cmId->second);
else /*Termination OFF*/
Cs.termination_enables &= ~(1ull << CoremininetID);
Cs.termination_enables &= ~(1ull << cmId->second);
iRetVal = icsneoSetFire2Settings(hObject, &Cs, iNumBytes, 1 /* ConfigurationOptionDoNotSaveToEEPROM */);
}
else
{
iRetVal = 0;
}
}
else
{
iRetVal = 0;
}
break;
}
break;