Changeset View
Changeset View
Standalone View
Standalone View
lib/libnv/tests/nvlist_send_recv_test.c
| /*- | /*- | ||||
| * SPDX-License-Identifier: BSD-2-Clause | |||||
| * | |||||
| * Copyright (c) 2013 The FreeBSD Foundation | * Copyright (c) 2013 The FreeBSD Foundation | ||||
| * Copyright (c) 2024-2026 Mariusz Zaborski <oshogbo@FreeBSD.org> | |||||
| * | * | ||||
| * This software was developed by Pawel Jakub Dawidek under sponsorship from | * This software was developed by Pawel Jakub Dawidek under sponsorship from | ||||
| * the FreeBSD Foundation. | * the FreeBSD Foundation. | ||||
| * | * | ||||
| * Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions | * modification, are permitted provided that the following conditions | ||||
| * are met: | * are met: | ||||
| * 1. Redistributions of source code must retain the above copyright | * 1. Redistributions of source code must retain the above copyright | ||||
| ▲ Show 20 Lines • Show All 645 Lines • ▼ Show 20 Lines | if (pid == 0) { | ||||
| ATF_REQUIRE(errno == EINVAL); | ATF_REQUIRE(errno == EINVAL); | ||||
| ATF_REQUIRE(waitpid(pid, &status, 0) == pid); | ATF_REQUIRE(waitpid(pid, &status, 0) == pid); | ||||
| ATF_REQUIRE(status == 0); | ATF_REQUIRE(status == 0); | ||||
| close(fd); | close(fd); | ||||
| } | } | ||||
| } | } | ||||
| ATF_TC_WITHOUT_HEAD(nvlist_send_recv__overflow_big_endian_size); | |||||
| ATF_TC_BODY(nvlist_send_recv__overflow_big_endian_size, tc) | |||||
| { | |||||
| static const unsigned char payload[] = { | |||||
| 0x6c, /* magic */ | |||||
| 0x00, /* version */ | |||||
| 0x80, /* flags: NV_FLAG_BIG_ENDIAN */ | |||||
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, | |||||
| }; | |||||
| nvlist_t *nvl; | |||||
| int sv[2]; | |||||
| ATF_REQUIRE_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0); | |||||
| ATF_REQUIRE_EQ(write(sv[1], payload, sizeof(payload)), | |||||
| (ssize_t)sizeof(payload)); | |||||
| ATF_REQUIRE_EQ(close(sv[1]), 0); | |||||
| errno = 0; | |||||
| nvl = nvlist_recv(sv[0], 0); | |||||
| ATF_REQUIRE(nvl == NULL); | |||||
| ATF_REQUIRE_EQ(errno, EINVAL); | |||||
| ATF_REQUIRE_EQ(close(sv[0]), 0); | |||||
| } | |||||
| ATF_TC_WITHOUT_HEAD(nvlist_send_recv__overflow_little_endian_size); | |||||
| ATF_TC_BODY(nvlist_send_recv__overflow_little_endian_size, tc) | |||||
| { | |||||
| static const unsigned char payload[] = { | |||||
| 0x6c, /* magic */ | |||||
| 0x00, /* version */ | |||||
| 0x00, /* flags */ | |||||
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
| 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, | |||||
| }; | |||||
| nvlist_t *nvl; | |||||
| int sv[2]; | |||||
| ATF_REQUIRE_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0); | |||||
| ATF_REQUIRE_EQ(write(sv[1], payload, sizeof(payload)), | |||||
| (ssize_t)sizeof(payload)); | |||||
| ATF_REQUIRE_EQ(close(sv[1]), 0); | |||||
| errno = 0; | |||||
| nvl = nvlist_recv(sv[0], 0); | |||||
| ATF_REQUIRE(nvl == NULL); | |||||
| ATF_REQUIRE_EQ(errno, EINVAL); | |||||
| ATF_REQUIRE_EQ(close(sv[0]), 0); | |||||
| } | |||||
| ATF_TC_WITHOUT_HEAD(nvlist_send_recv__invalid_fd_size); | ATF_TC_WITHOUT_HEAD(nvlist_send_recv__invalid_fd_size); | ||||
| ATF_TC_BODY(nvlist_send_recv__invalid_fd_size, tc) | ATF_TC_BODY(nvlist_send_recv__invalid_fd_size, tc) | ||||
| { | { | ||||
| nvlist_t *nvl; | nvlist_t *nvl; | ||||
| void *packed; | void *packed; | ||||
| size_t packed_size; | size_t packed_size; | ||||
| struct nvlist_header *header; | struct nvlist_header *header; | ||||
| int fd, socks[2], status; | int fd, socks[2], status; | ||||
| ▲ Show 20 Lines • Show All 119 Lines • ▼ Show 20 Lines | ATF_TP_ADD_TCS(tp) | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__send_nvlist__stream); | ATF_TP_ADD_TC(tp, nvlist_send_recv__send_nvlist__stream); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__highfd); | ATF_TP_ADD_TC(tp, nvlist_send_recv__highfd); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd__dgram); | ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd__dgram); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd__stream); | ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd__stream); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds__dgram); | ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds__dgram); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds__stream); | ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds__stream); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__overflow_header_size); | ATF_TP_ADD_TC(tp, nvlist_send_recv__overflow_header_size); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__overflow_big_endian_size); | |||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__overflow_little_endian_size); | |||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__invalid_fd_size); | ATF_TP_ADD_TC(tp, nvlist_send_recv__invalid_fd_size); | ||||
| ATF_TP_ADD_TC(tp, nvlist_send_recv__overflow_fd_size); | ATF_TP_ADD_TC(tp, nvlist_send_recv__overflow_fd_size); | ||||
| return (atf_no_error()); | return (atf_no_error()); | ||||
| } | } | ||||