| 635 | } |
| 636 | |
| 637 | const unsigned char * |
| 638 | nvpair_unpack_header(bool isbe, nvpair_t *nvp, const unsigned char *ptr, |
| 639 | size_t *leftp) |
| 640 | { |
| 641 | struct nvpair_header nvphdr; |
| 642 | |
| 643 | if (*leftp < sizeof(nvphdr)) |
| 644 | goto fail; |
| 645 | |
| 646 | memcpy(&nvphdr, ptr, sizeof(nvphdr)); |
| 647 | ptr += sizeof(nvphdr); |
| 648 | *leftp -= sizeof(nvphdr); |
| 649 | |
| 650 | #if NV_TYPE_FIRST > 0 |
| 651 | if (nvphdr.nvph_type < NV_TYPE_FIRST) |
| 652 | goto fail; |
| 653 | #endif |
| 654 | if (nvphdr.nvph_type > NV_TYPE_LAST && |
| 655 | nvphdr.nvph_type != NV_TYPE_NVLIST_UP && |
| 656 | nvphdr.nvph_type != NV_TYPE_NVLIST_ARRAY_NEXT) { |
| 657 | goto fail; |
| 658 | } |
| 659 | |
| 660 | #if BYTE_ORDER == BIG_ENDIAN |
| 661 | if (!isbe) { |
| 662 | nvphdr.nvph_namesize = le16toh(nvphdr.nvph_namesize); |
| 663 | nvphdr.nvph_datasize = le64toh(nvphdr.nvph_datasize); |
| 664 | } |
| 665 | #else |
| 666 | if (isbe) { |
| 667 | nvphdr.nvph_namesize = be16toh(nvphdr.nvph_namesize); |
| 668 | nvphdr.nvph_datasize = be64toh(nvphdr.nvph_datasize); |
| 669 | } |
| 670 | #endif |
| 671 | |
| 672 | if (nvphdr.nvph_namesize > NV_NAME_MAX) |
| 673 | goto fail; |
| 674 | if (*leftp < nvphdr.nvph_namesize) |
| 675 | goto fail; |
| 676 | if (nvphdr.nvph_namesize < 1) |
| 677 | goto fail; |
| 678 | if (strnlen((const char *)ptr, nvphdr.nvph_namesize) != |
| 679 | (size_t)(nvphdr.nvph_namesize - 1)) { |
| 680 | goto fail; |
| 681 | } |
| 682 | |
| 683 | memcpy(nvp->nvp_name, ptr, nvphdr.nvph_namesize); |
| 684 | ptr += nvphdr.nvph_namesize; |
| 685 | *leftp -= nvphdr.nvph_namesize; |
| 686 | |
| 687 | if (*leftp < nvphdr.nvph_datasize) |
| 688 | goto fail; |
| 689 | |
| 690 | nvp->nvp_type = nvphdr.nvph_type; |
| 691 | nvp->nvp_data = 0; |
| 692 | nvp->nvp_datasize = nvphdr.nvph_datasize; |
| 693 | nvp->nvp_nitems = nvphdr.nvph_nitems; |
| 694 |
no test coverage detected