MCPcopy Create free account
hub / github.com/F-Stack/f-stack / nvpair_unpack_header

Function nvpair_unpack_header

freebsd/contrib/libnv/bsd_nvpair.c:637–699  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

635}
636
637const unsigned char *
638nvpair_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

Callers 1

nvpair_unpackFunction · 0.85

Calls 2

strnlenFunction · 0.85
memcpyFunction · 0.50

Tested by

no test coverage detected