| 1609 | #endif |
| 1610 | |
| 1611 | static void |
| 1612 | DeserializeNumber(char *szLocation, char *pBuffer, size_t zBUfferLength, struct CTypeDescriptor *pType, unsigned long ulNumber) |
| 1613 | { |
| 1614 | |
| 1615 | ASSERT(szLocation); |
| 1616 | ASSERT(pBuffer); |
| 1617 | ASSERT(zBUfferLength > 0); |
| 1618 | ASSERT(pType); |
| 1619 | |
| 1620 | switch(pType->mTypeKind) { |
| 1621 | case KIND_INTEGER: |
| 1622 | if (ISSET(pType->mTypeInfo, NUMBER_SIGNED_BIT)) { |
| 1623 | longest L = llliGetNumber(szLocation, pType, ulNumber); |
| 1624 | DeserializeNumberSigned(pBuffer, zBUfferLength, pType, L); |
| 1625 | } else { |
| 1626 | ulongest UL = llluGetNumber(szLocation, pType, ulNumber); |
| 1627 | DeserializeNumberUnsigned(pBuffer, zBUfferLength, pType, UL); |
| 1628 | } |
| 1629 | break; |
| 1630 | case KIND_FLOAT: |
| 1631 | #ifdef _KERNEL |
| 1632 | Report(true, "UBSan: Unexpected Float Type in %s\n", szLocation); |
| 1633 | __unreachable(); |
| 1634 | /* NOTREACHED */ |
| 1635 | #else |
| 1636 | DeserializeNumberFloat(szLocation, pBuffer, zBUfferLength, pType, ulNumber); |
| 1637 | break; |
| 1638 | #endif |
| 1639 | case KIND_UNKNOWN: |
| 1640 | Report(true, "UBSan: Unknown Type in %s\n", szLocation); |
| 1641 | __unreachable(); |
| 1642 | /* NOTREACHED */ |
| 1643 | } |
| 1644 | } |
| 1645 | |
| 1646 | static const char * |
| 1647 | DeserializeTypeCheckKind(uint8_t hhuTypeCheckKind) |
no test coverage detected