| 230 | } |
| 231 | |
| 232 | static int test_send_faults(int sock_tx, int sock_rx) |
| 233 | { |
| 234 | struct io_uring_sqe *sqe; |
| 235 | int msg_flags = 0; |
| 236 | unsigned zc_flags = 0; |
| 237 | int ret, payload_size = 100; |
| 238 | struct io_uring ring; |
| 239 | |
| 240 | ret = io_uring_queue_init(32, &ring, 0); |
| 241 | if (ret) { |
| 242 | fprintf(stderr, "queue init failed: %d\n", ret); |
| 243 | return -1; |
| 244 | } |
| 245 | |
| 246 | /* invalid buffer */ |
| 247 | sqe = io_uring_get_sqe(&ring); |
| 248 | io_uring_prep_send_zc(sqe, sock_tx, (void *)1UL, payload_size, |
| 249 | msg_flags, zc_flags); |
| 250 | sqe->user_data = 1; |
| 251 | ret = io_uring_submit(&ring); |
| 252 | assert(ret == 1); |
| 253 | |
| 254 | ret = test_send_faults_check(&ring, -EFAULT); |
| 255 | if (ret) { |
| 256 | fprintf(stderr, "test_send_faults with invalid buf failed\n"); |
| 257 | return -1; |
| 258 | } |
| 259 | |
| 260 | /* invalid address */ |
| 261 | sqe = io_uring_get_sqe(&ring); |
| 262 | io_uring_prep_send_zc(sqe, sock_tx, tx_buffer, payload_size, |
| 263 | msg_flags, zc_flags); |
| 264 | io_uring_prep_send_set_addr(sqe, (const struct sockaddr *)1UL, |
| 265 | sizeof(struct sockaddr_in6)); |
| 266 | sqe->user_data = 1; |
| 267 | ret = io_uring_submit(&ring); |
| 268 | assert(ret == 1); |
| 269 | |
| 270 | ret = test_send_faults_check(&ring, -EFAULT); |
| 271 | if (ret) { |
| 272 | fprintf(stderr, "test_send_faults with invalid addr failed\n"); |
| 273 | return -1; |
| 274 | } |
| 275 | |
| 276 | /* invalid send/recv flags */ |
| 277 | sqe = io_uring_get_sqe(&ring); |
| 278 | io_uring_prep_send_zc(sqe, sock_tx, tx_buffer, payload_size, |
| 279 | msg_flags, ~0U); |
| 280 | sqe->user_data = 1; |
| 281 | ret = io_uring_submit(&ring); |
| 282 | assert(ret == 1); |
| 283 | |
| 284 | ret = test_send_faults_check(&ring, -EINVAL); |
| 285 | if (ret) { |
| 286 | fprintf(stderr, "test_send_faults with invalid flags failed\n"); |
| 287 | return -1; |
| 288 | } |
| 289 |
no test coverage detected