1    	/*
2    	 * Copyright (C) 2016-2026 Red Hat, Inc.  All rights reserved.
3    	 *
4    	 * Authors: Fabio M. Di Nitto <fabbione@kronosnet.org>
5    	 *
6    	 * This software licensed under GPL-2.0+
7    	 */
8    	
9    	#include "config.h"
10   	
11   	#include <errno.h>
12   	#include <fcntl.h>
13   	#include <limits.h>
14   	#include <stdio.h>
15   	#include <stdlib.h>
16   	#include <string.h>
17   	#include <unistd.h>
18   	#include <arpa/inet.h>
19   	#include <netinet/in.h>
20   	#include <sys/socket.h>
21   	#include <sys/stat.h>
22   	#include <sys/un.h>
23   	
24   	#include "libknet.h"
25   	
26   	#include "internals.h"
27   	#include "test-common.h"
28   	
29   	#define TEST_NAME "api_knet_handle_add_datafd"
30   	
31   	static int private_data;
32   	
33   	static void sock_notify(void *pvt_data,
34   				int datafd,
35   				int8_t channel,
36   				uint8_t tx_rx,
37   				int error,
38   				int errorno)
39   	{
40   		return;
41   	}
42   	
43   	static void test(void)
44   	{
45   		int logfd;
46   		knet_handle_t knet_h[2] = {0};
47   		knet_handle_t knet_h1;
48   		int datafd = 0, i;
49   		int8_t channel = 0;
50   		int datafdmax[KNET_DATAFD_MAX];
51   		int8_t channels[KNET_DATAFD_MAX];
52   		struct sockaddr_storage lo;
53   		int sp[2];
54   		int unconnected_sock;
55   		int pipefd[2];
56   		int chardev_fd;
57   		int add_result;
58   		int saved_errno;
59   		int listen_sock, client_sock, server_sock;
60   		struct sockaddr_in addr;
61   		socklen_t addrlen;
62   		int dgram_sock1, dgram_sock2;
63   		struct sockaddr_in addr1, addr2;
64   		char send_buf[4096];
65   		char recv_buf[4096];
66   		ssize_t send_len, recv_len;
67   	
68   		logfd = start_logging(stdout);
69   	
(1) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
70   		log_test(logfd, "Test knet_handle_add_datafd incorrect knet_h");
71   	
(2) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(3) Event path: Condition "(_fos_res = knet_handle_add_datafd(NULL, &datafd, &channel, 0)) == 0", taking true branch.
(4) Event path: Condition "_fos_res == -2", taking false branch.
(5) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(6) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(7) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(8) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(9) Event path: Falling through to end of if statement.
72   		FAIL_ON_SUCCESS(knet_handle_add_datafd(NULL, &datafd, &channel, 0), EINVAL);
73   	
74   	
75   		knet_h1 = _ts_knet_handle_start(logfd, KNET_LOG_DEBUG, knet_h);
76   	
(10) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
77   		log_test(logfd, "Test knet_handle_add_datafd with no datafd");
(11) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(12) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, NULL, &channel, 0)) == 0", taking true branch.
(13) Event path: Condition "_fos_res == -2", taking false branch.
(14) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(15) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(16) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(17) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(18) Event path: Falling through to end of if statement.
78   		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, NULL, &channel, 0), EINVAL);
79   	
(19) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
80   		log_test(logfd, "Test knet_handle_add_datafd with no channel");
(20) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(21) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, NULL, 0)) == 0", taking true branch.
(22) Event path: Condition "_fos_res == -2", taking false branch.
(23) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(24) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(25) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(26) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(27) Event path: Falling through to end of if statement.
81   		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, NULL, 0), EINVAL);
82   	
(28) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
83   		log_test(logfd, "Test knet_handle_add_datafd with invalid channel");
84   		channel = KNET_DATAFD_MAX;
85   	
(29) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(30) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(31) Event path: Condition "_fos_res == -2", taking false branch.
(32) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(33) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(34) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(35) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(36) Event path: Falling through to end of if statement.
86   		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
87   	
88   	
(37) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
89   		log_test(logfd, "Test knet_handle_add_datafd with no socknotify");
90   		datafd = 0;
91   		channel = -1;
(38) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(39) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(40) Event path: Condition "_fos_res == -2", taking false branch.
(41) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(42) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(43) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(44) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(45) Event path: Falling through to end of if statement.
92   		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
93   	
(46) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
94   		log_test(logfd, "Test knet_handle_add_datafd with automatic config values");
(47) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(48) Event path: Condition "(_foe_res = knet_handle_enable_sock_notify(knet_h1, &private_data, sock_notify)) != 0", taking true branch.
(49) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(50) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(51) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(52) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(53) Event path: Falling through to end of if statement.
95   		FAIL_ON_ERR(knet_handle_enable_sock_notify(knet_h1, &private_data, sock_notify));
96   	
97   		datafd = 0;
98   		channel = -1;
99   	
(54) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(55) Event path: Condition "(_foe_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) != 0", taking true branch.
(56) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(57) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(58) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(59) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(60) Event path: Falling through to end of if statement.
100  		FAIL_ON_ERR(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0));
(61) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
101  		log_test(logfd, "got datafd: %d channel: %d", datafd, channel);
102  	
(62) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
103  		log_test(logfd, "Test knet_handle_add_datafd with duplicated datafd");
(63) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(64) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(65) Event path: Condition "_fos_res == -2", taking false branch.
(66) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(67) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(68) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(69) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(70) Event path: Falling through to end of if statement.
104  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EEXIST);
105  	
(71) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
106  		log_test(logfd, "Test knet_handle_add_datafd with busy channel");
107  		datafd = datafd + 1;
(72) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(73) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(74) Event path: Condition "_fos_res == -2", taking false branch.
(75) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(76) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(77) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(78) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(79) Event path: Falling through to end of if statement.
108  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EBUSY);
109  	
110  		datafd = datafd - 1;
111  	
(80) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(81) Event path: Condition "(_foe_res = knet_handle_remove_datafd(knet_h1, datafd)) != 0", taking true branch.
(82) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(83) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(84) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(85) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(86) Event path: Falling through to end of if statement.
112  		FAIL_ON_ERR(knet_handle_remove_datafd(knet_h1, datafd));
113  	
(87) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
114  		log_test(logfd, "Test knet_handle_add_datafd with no available channels");
(88) Event path: Condition "i < 32", taking true branch.
(97) Event path: Condition "i < 32", taking true branch.
(106) Event path: Condition "i < 32", taking false branch.
115  		for (i = 0; i < KNET_DATAFD_MAX; i++) {
116  			datafdmax[i] = 0;
117  			channels[i] = -1;
(89) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(90) Event path: Condition "(_foe_res = knet_handle_add_datafd(knet_h1, &datafdmax[i], &channels[i], 0)) != 0", taking true branch.
(91) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(92) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(93) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(94) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(95) Event path: Falling through to end of if statement.
(98) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(99) Event path: Condition "(_foe_res = knet_handle_add_datafd(knet_h1, &datafdmax[i], &channels[i], 0)) != 0", taking true branch.
(100) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(101) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(102) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(103) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(104) Event path: Falling through to end of if statement.
118  			FAIL_ON_ERR(knet_handle_add_datafd(knet_h1, &datafdmax[i], &channels[i], 0));
(96) Event path: Jumping back to the beginning of the loop.
(105) Event path: Jumping back to the beginning of the loop.
119  		}
120  	
121  		datafd = 0;
122  		channel = -1;
123  	
(107) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(108) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(109) Event path: Condition "_fos_res == -2", taking false branch.
(110) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(111) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(112) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(113) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(114) Event path: Falling through to end of if statement.
124  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EBUSY);
125  	
(115) Event path: Condition "i < 32", taking true branch.
(124) Event path: Condition "i < 32", taking true branch.
(133) Event path: Condition "i < 32", taking false branch.
126  		for (i = 0; i < KNET_DATAFD_MAX; i++) {
(116) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(117) Event path: Condition "(_foe_res = knet_handle_remove_datafd(knet_h1, datafdmax[i])) != 0", taking true branch.
(118) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(119) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(120) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(121) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(122) Event path: Falling through to end of if statement.
(125) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(126) Event path: Condition "(_foe_res = knet_handle_remove_datafd(knet_h1, datafdmax[i])) != 0", taking true branch.
(127) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(128) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(129) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(130) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(131) Event path: Falling through to end of if statement.
127  			FAIL_ON_ERR(knet_handle_remove_datafd(knet_h1, datafdmax[i]));
(123) Event path: Jumping back to the beginning of the loop.
(132) Event path: Jumping back to the beginning of the loop.
128  		}
129  	
(134) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
130  		log_test(logfd, "Test knet_handle_add_datafd with user-provided AF_UNIX socketpair (should fail)");
(135) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(136) Event path: Condition "(_foe_res = socketpair(1, SOCK_SEQPACKET, 0, sp)) != 0", taking true branch.
(137) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(138) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(139) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(140) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(141) Event path: Falling through to end of if statement.
131  		FAIL_ON_ERR(socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sp));
132  		datafd = sp[0];
133  		channel = -1;
(142) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(143) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(144) Event path: Condition "_fos_res == -2", taking false branch.
(145) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(146) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(147) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(148) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(149) Event path: Falling through to end of if statement.
134  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
135  		close(sp[0]);
136  		close(sp[1]);
(150) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
137  		log_test(logfd, "Correctly rejected user-provided socketpair");
138  	
(151) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
139  		log_test(logfd, "Test knet_handle_add_datafd with user-provided SOCK_DGRAM socketpair (should fail)");
(152) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(153) Event path: Condition "(_foe_res = socketpair(1, SOCK_DGRAM, 0, sp)) != 0", taking true branch.
(154) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(155) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(156) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(157) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(158) Event path: Falling through to end of if statement.
140  		FAIL_ON_ERR(socketpair(AF_UNIX, SOCK_DGRAM, 0, sp));
141  		datafd = sp[0];
142  		channel = -1;
(159) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(160) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(161) Event path: Condition "_fos_res == -2", taking false branch.
(162) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(163) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(164) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(165) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(166) Event path: Falling through to end of if statement.
143  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
144  		close(sp[0]);
145  		close(sp[1]);
(167) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
146  		log_test(logfd, "Correctly rejected user-provided DGRAM socketpair");
147  	
(168) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
148  		log_test(logfd, "Test knet_handle_add_datafd with unconnected SOCK_STREAM socket (should fail)");
(169) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(170) Event path: Condition "(_foeo_res = unconnected_sock = socket(1, SOCK_STREAM, 0)) == -1", taking true branch.
(171) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(172) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(173) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(174) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(175) Event path: Falling through to end of if statement.
149  		FAIL_ON_ERR_ONLY(unconnected_sock = socket(AF_UNIX, SOCK_STREAM, 0));
150  		datafd = unconnected_sock;
151  		channel = -1;
(176) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(177) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(178) Event path: Condition "_fos_res == -2", taking false branch.
(179) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(180) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(181) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(182) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(183) Event path: Falling through to end of if statement.
152  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
153  		close(unconnected_sock);
(184) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
154  		log_test(logfd, "Correctly rejected unconnected SOCK_STREAM socket");
155  	
(185) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
156  		log_test(logfd, "Test knet_handle_add_datafd with unbound SOCK_DGRAM socket (should fail)");
(186) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(187) Event path: Condition "(_foeo_res = unconnected_sock = socket(1, SOCK_DGRAM, 0)) == -1", taking true branch.
(188) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(189) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(190) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(191) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(192) Event path: Falling through to end of if statement.
157  		FAIL_ON_ERR_ONLY(unconnected_sock = socket(AF_UNIX, SOCK_DGRAM, 0));
158  		datafd = unconnected_sock;
159  		channel = -1;
(193) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(194) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(195) Event path: Condition "_fos_res == -2", taking false branch.
(196) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(197) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(198) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(199) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(200) Event path: Falling through to end of if statement.
160  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
161  		close(unconnected_sock);
(201) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
162  		log_test(logfd, "Correctly rejected unbound SOCK_DGRAM socket");
163  	
(202) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
164  		log_test(logfd, "Test knet_handle_add_datafd with pipe (should fail)");
(203) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(204) Event path: Condition "(_foe_res = pipe(pipefd)) != 0", taking true branch.
(205) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(206) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(207) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(208) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(209) Event path: Falling through to end of if statement.
165  		FAIL_ON_ERR(pipe(pipefd));
166  		datafd = pipefd[0];
167  		channel = -1;
(210) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(211) Event path: Condition "(_fos_res = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0)) == 0", taking true branch.
(212) Event path: Condition "_fos_res == -2", taking false branch.
(213) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(214) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(215) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(216) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(217) Event path: Falling through to end of if statement.
168  		FAIL_ON_SUCCESS(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0), EINVAL);
169  		close(pipefd[0]);
170  		close(pipefd[1]);
(218) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
171  		log_test(logfd, "Correctly rejected pipe (knet requires bidirectional I/O on single fd)");
172  	
(219) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
173  		log_test(logfd, "Test knet_handle_add_datafd with character device /dev/null (validates fd type acceptance)");
(220) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(221) Event path: Condition "(_foeo_res = chardev_fd = open("/dev/null", 2)) == -1", taking true branch.
(222) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(223) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(224) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(225) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(226) Event path: Falling through to end of if statement.
174  		FAIL_ON_ERR_ONLY(chardev_fd = open("/dev/null", O_RDWR));
175  		datafd = chardev_fd;
176  		channel = -1;
177  	
178  		/* This may fail at epoll/kqueue stage (EPERM/ENODEV/EOPNOTSUPP) but should pass fd validation */
179  		add_result = knet_handle_add_datafd(knet_h1, &datafd, &channel, 0);
180  		saved_errno = errno;
181  	
(227) Event path: Condition "add_result == 0", taking true branch.
182  		if (add_result == 0) {
(228) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
183  			log_test(logfd, "Successfully accepted character device, datafd: %d channel: %d", datafd, channel);
(229) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(230) Event path: Condition "(_foe_res = knet_handle_remove_datafd(knet_h1, datafd)) != 0", taking true branch.
(231) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(232) Event path: Condition "0 /* -1 == 101 */", taking false branch.
(233) Event path: Condition "0 /* -1 == 0 */", taking false branch.
(234) Event path: Condition "1 /* -1 == -1 */", taking true branch.
(235) Event path: Falling through to end of if statement.
184  			FAIL_ON_ERR(knet_handle_remove_datafd(knet_h1, datafd));
185  			close(chardev_fd);
(236) Event path: Falling through to end of if statement.
186  		} else if (saved_errno == EPERM || saved_errno == ENODEV || saved_errno == EOPNOTSUPP) {
187  			log_test(logfd, "Character device passed validation but failed at epoll/kqueue (expected for non-pollable devices)");
188  			close(chardev_fd);
189  		} else {
190  			log_test(logfd, "*** FAIL: Unexpected error adding character device: errno=%d (%s)", saved_errno, strerror(saved_errno));
191  			close(chardev_fd);
192  			TEST_EXIT_CLEAN(FAIL);
193  		}
194  	
(237) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
195  		log_test(logfd, "Test knet_handle_add_datafd with connected named AF_UNIX SOCK_STREAM socket (should succeed)");
196  		int unix_listen_sock, unix_client_sock, unix_server_sock;
197  		struct sockaddr_un unix_addr;
198  		char socket_path[PATH_MAX];
199  		int socket_path_len;
200  	
201  		snprintf(socket_path, sizeof(socket_path), ABSBUILDDIR "/knet_test_unix_stream.XXXXXX");
202  		socket_path_len = strlen(socket_path);
203  	
(238) Event path: Condition "socket_path_len >= 108 /* (int)sizeof (unix_addr.sun_path) */", taking false branch.
204  		if (socket_path_len >= (int)sizeof(unix_addr.sun_path)) {
205  			log_test(logfd, "Skipping AF_UNIX SOCK_STREAM test: build path too long (%d >= %zu)", socket_path_len, sizeof(unix_addr.sun_path));
206  		} else {
CID (unavailable; MK=61c23f3c36b209641c77cee1b367b62a) (#1 of 1): Insecure temporary file (SECURE_TEMP):
(239) Event path: Condition "write(logfd, &_log_msg, 264UL /* sizeof (_log_msg) */) != 264UL /* sizeof (_log_msg) */", taking true branch.
(240) Event secure_temp: Calling "mkstemp" without securely setting umask first.
207  			FAIL_ON_ERR_ONLY(mkstemp(socket_path));
208  			unlink(socket_path);  /* Remove the file, we just need a unique name */
209  	
210  			FAIL_ON_ERR_ONLY(unix_listen_sock = socket(AF_UNIX, SOCK_STREAM, 0));
211  			memset(&unix_addr, 0, sizeof(unix_addr));
212  			unix_addr.sun_family = AF_UNIX;
213  			memcpy(unix_addr.sun_path, socket_path, socket_path_len + 1);
214  			FAIL_ON_ERR(bind(unix_listen_sock, (struct sockaddr *)&unix_addr, sizeof(unix_addr)));
215  			FAIL_ON_ERR(listen(unix_listen_sock, 1));
216  	
217  			FAIL_ON_ERR_ONLY(unix_client_sock = socket(AF_UNIX, SOCK_STREAM, 0));
218  			FAIL_ON_ERR(connect(unix_client_sock, (struct sockaddr *)&unix_addr, sizeof(unix_addr)));
219  			FAIL_ON_ERR_ONLY(unix_server_sock = accept(unix_listen_sock, NULL, NULL));
220  	
221  			datafd = unix_client_sock;
222  			channel = -1;
223  			FAIL_ON_ERR(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0));
224  			log_test(logfd, "Successfully accepted connected named AF_UNIX SOCK_STREAM socket, datafd: %d channel: %d", datafd, channel);
225  			FAIL_ON_ERR(knet_handle_remove_datafd(knet_h1, datafd));
226  			close(unix_client_sock);
227  			close(unix_server_sock);
228  			close(unix_listen_sock);
229  			unlink(socket_path);
230  		}
231  	
232  		log_test(logfd, "Test knet_handle_add_datafd with connected AF_INET SOCK_STREAM socket (should succeed)");
233  		addrlen = sizeof(addr);
234  	
235  		FAIL_ON_ERR_ONLY(listen_sock = socket(AF_INET, SOCK_STREAM, 0));
236  		memset(&addr, 0, sizeof(addr));
237  		addr.sin_family = AF_INET;
238  		addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
239  		addr.sin_port = 0;  /* let kernel pick a port */
240  		FAIL_ON_ERR(bind(listen_sock, (struct sockaddr *)&addr, sizeof(addr)));
241  		FAIL_ON_ERR(listen(listen_sock, 1));
242  		FAIL_ON_ERR(getsockname(listen_sock, (struct sockaddr *)&addr, &addrlen));
243  	
244  		FAIL_ON_ERR_ONLY(client_sock = socket(AF_INET, SOCK_STREAM, 0));
245  		FAIL_ON_ERR(connect(client_sock, (struct sockaddr *)&addr, sizeof(addr)));
246  		FAIL_ON_ERR_ONLY(server_sock = accept(listen_sock, NULL, NULL));
247  	
248  		datafd = client_sock;
249  		channel = -1;
250  		FAIL_ON_ERR(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0));
251  		log_test(logfd, "Successfully accepted connected SOCK_STREAM socket, datafd: %d channel: %d", datafd, channel);
252  		FAIL_ON_ERR(knet_handle_remove_datafd(knet_h1, datafd));
253  		close(client_sock);
254  		close(server_sock);
255  		close(listen_sock);
256  	
257  		log_test(logfd, "Test knet_handle_add_datafd with connected AF_INET SOCK_DGRAM socket (should succeed)");
258  	
259  		FAIL_ON_ERR_ONLY(dgram_sock1 = socket(AF_INET, SOCK_DGRAM, 0));
260  		FAIL_ON_ERR_ONLY(dgram_sock2 = socket(AF_INET, SOCK_DGRAM, 0));
261  	
262  		memset(&addr1, 0, sizeof(addr1));
263  		addr1.sin_family = AF_INET;
264  		addr1.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
265  		addr1.sin_port = 0;
266  		FAIL_ON_ERR(bind(dgram_sock1, (struct sockaddr *)&addr1, sizeof(addr1)));
267  	
268  		memset(&addr2, 0, sizeof(addr2));
269  		addr2.sin_family = AF_INET;
270  		addr2.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
271  		addr2.sin_port = 0;
272  		FAIL_ON_ERR(bind(dgram_sock2, (struct sockaddr *)&addr2, sizeof(addr2)));
273  	
274  		addrlen = sizeof(addr1);
275  		FAIL_ON_ERR(getsockname(dgram_sock1, (struct sockaddr *)&addr1, &addrlen));
276  		addrlen = sizeof(addr2);
277  		FAIL_ON_ERR(getsockname(dgram_sock2, (struct sockaddr *)&addr2, &addrlen));
278  	
279  		FAIL_ON_ERR(connect(dgram_sock1, (struct sockaddr *)&addr2, sizeof(addr2)));
280  		FAIL_ON_ERR(connect(dgram_sock2, (struct sockaddr *)&addr1, sizeof(addr1)));
281  	
282  		datafd = dgram_sock1;
283  		channel = -1;
284  		FAIL_ON_ERR(knet_handle_add_datafd(knet_h1, &datafd, &channel, 0));
285  		log_test(logfd, "Successfully accepted connected SOCK_DGRAM socket, datafd: %d channel: %d", datafd, channel);
286  	
287  		FAIL_ON_ERR(knet_host_add(knet_h1, 1));
288  		FAIL_ON_ERR(_ts_knet_link_set_config(knet_h1, 1, 0, KNET_TRANSPORT_LOOPBACK, 0, AF_INET, 0, &lo, logfd));
289  		FAIL_ON_ERR(knet_link_set_enable(knet_h1, 1, 0, 1));
290  		FAIL_ON_ERR(knet_handle_setfwd(knet_h1, 1));
291  		FAIL_ON_ERR(wait_for_host(knet_h1, 1, TEST_TIMEOUT_SHORT, logfd));
292  	
293  		memset(send_buf, 0xBB, sizeof(send_buf));
294  		memset(recv_buf, 0, sizeof(recv_buf));
295  	
296  		send_len = knet_send(knet_h1, send_buf, sizeof(send_buf), channel);
297  		if (send_len <= 0) {
298  			log_test(logfd, "knet_send failed: %s", strerror(errno));
299  			close(dgram_sock1);
300  			close(dgram_sock2);
301  			TEST_EXIT_CLEAN(FAIL);
302  		}
303  	
304  		recv_len = recv(dgram_sock2, recv_buf, sizeof(recv_buf), 0);
305  		if (recv_len != send_len) {
306  			log_test(logfd, "Failed to receive knet data on dgram_sock2: got %zd, expected %zd: %s", recv_len, send_len, strerror(errno));
307  			close(dgram_sock1);
308  			close(dgram_sock2);
309  			TEST_EXIT_CLEAN(FAIL);
310  		}
311  	
312  		if (memcmp(send_buf, recv_buf, send_len)) {
313  			log_test(logfd, "Received knet data doesn't match sent data");
314  			close(dgram_sock1);
315  			close(dgram_sock2);
316  			TEST_EXIT_CLEAN(FAIL);
317  		}
318  	
319  		log_test(logfd, "Validated knet I/O through SOCK_DGRAM datafd");
320  	
321  		FAIL_ON_ERR(knet_handle_remove_datafd(knet_h1, datafd));
322  		close(dgram_sock1);
323  		close(dgram_sock2);
324  	
325  		TEST_EXIT_CLEAN(CONTINUE);
326  	}
327  	
328  	int main(int argc, char *argv[])
329  	{
330  		printf("[TEST] %s: Test knet handle add datafd\n", TEST_NAME);
331  	
332  		test();
333  	
334  		TEST_EXIT(PASS);
335  	}
336