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