Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest: af_unix: Check SIOCATMARK after every send()/recv() in msg_oob.c.

To catch regression, let's check ioctl(SIOCATMARK) after every
send() and recv() calls.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

authored by

Kuniyuki Iwashima and committed by
Paolo Abeni
91b7186c e400cfa3

+72
+72
tools/testing/selftests/net/af_unix/msg_oob.c
··· 339 339 { 340 340 sendpair("x", 1, 0); 341 341 epollpair(false); 342 + siocatmarkpair(false); 342 343 343 344 recvpair("", -EINVAL, 1, MSG_OOB); 344 345 epollpair(false); 346 + siocatmarkpair(false); 345 347 } 346 348 347 349 TEST_F(msg_oob, oob) ··· 361 359 { 362 360 sendpair("x", 1, MSG_OOB); 363 361 epollpair(true); 362 + siocatmarkpair(true); 364 363 365 364 recvpair("", -EAGAIN, 1, 0); /* Drop OOB. */ 366 365 epollpair(false); 366 + siocatmarkpair(false); 367 367 368 368 recvpair("", -EINVAL, 1, MSG_OOB); 369 369 epollpair(false); 370 + siocatmarkpair(false); 370 371 } 371 372 372 373 TEST_F(msg_oob, oob_ahead) 373 374 { 374 375 sendpair("hello", 5, MSG_OOB); 375 376 epollpair(true); 377 + siocatmarkpair(false); 376 378 377 379 recvpair("o", 1, 1, MSG_OOB); 378 380 epollpair(false); 381 + siocatmarkpair(false); 379 382 380 383 recvpair("hell", 4, 4, 0); 381 384 epollpair(false); 385 + siocatmarkpair(true); 382 386 } 383 387 384 388 TEST_F(msg_oob, oob_break) 385 389 { 386 390 sendpair("hello", 5, MSG_OOB); 387 391 epollpair(true); 392 + siocatmarkpair(false); 388 393 389 394 recvpair("hell", 4, 5, 0); /* Break at OOB even with enough buffer. */ 390 395 epollpair(true); 396 + siocatmarkpair(true); 391 397 392 398 recvpair("o", 1, 1, MSG_OOB); 393 399 epollpair(false); 400 + siocatmarkpair(true); 401 + 402 + recvpair("", -EAGAIN, 1, 0); 403 + siocatmarkpair(false); 394 404 } 395 405 396 406 TEST_F(msg_oob, oob_ahead_break) 397 407 { 398 408 sendpair("hello", 5, MSG_OOB); 399 409 epollpair(true); 410 + siocatmarkpair(false); 400 411 401 412 sendpair("world", 5, 0); 402 413 epollpair(true); 414 + siocatmarkpair(false); 403 415 404 416 recvpair("o", 1, 1, MSG_OOB); 405 417 epollpair(false); 418 + siocatmarkpair(false); 406 419 407 420 recvpair("hell", 4, 9, 0); /* Break at OOB even after it's recv()ed. */ 408 421 epollpair(false); 422 + siocatmarkpair(true); 409 423 410 424 recvpair("world", 5, 5, 0); 411 425 epollpair(false); 426 + siocatmarkpair(false); 412 427 } 413 428 414 429 TEST_F(msg_oob, oob_break_drop) 415 430 { 416 431 sendpair("hello", 5, MSG_OOB); 417 432 epollpair(true); 433 + siocatmarkpair(false); 418 434 419 435 sendpair("world", 5, 0); 420 436 epollpair(true); 437 + siocatmarkpair(false); 421 438 422 439 recvpair("hell", 4, 10, 0); /* Break at OOB even with enough buffer. */ 423 440 epollpair(true); 441 + siocatmarkpair(true); 424 442 425 443 recvpair("world", 5, 10, 0); /* Drop OOB and recv() the next skb. */ 426 444 epollpair(false); 445 + siocatmarkpair(false); 427 446 428 447 recvpair("", -EINVAL, 1, MSG_OOB); 429 448 epollpair(false); 449 + siocatmarkpair(false); 430 450 } 431 451 432 452 TEST_F(msg_oob, ex_oob_break) 433 453 { 434 454 sendpair("hello", 5, MSG_OOB); 435 455 epollpair(true); 456 + siocatmarkpair(false); 436 457 437 458 sendpair("wor", 3, MSG_OOB); 438 459 epollpair(true); 460 + siocatmarkpair(false); 439 461 440 462 sendpair("ld", 2, 0); 441 463 epollpair(true); 464 + siocatmarkpair(false); 442 465 443 466 recvpair("hellowo", 7, 10, 0); /* Break at OOB but not at ex-OOB. */ 444 467 epollpair(true); 468 + siocatmarkpair(true); 445 469 446 470 recvpair("r", 1, 1, MSG_OOB); 447 471 epollpair(false); 472 + siocatmarkpair(true); 448 473 449 474 recvpair("ld", 2, 2, 0); 450 475 epollpair(false); 476 + siocatmarkpair(false); 451 477 } 452 478 453 479 TEST_F(msg_oob, ex_oob_drop) 454 480 { 455 481 sendpair("x", 1, MSG_OOB); 456 482 epollpair(true); 483 + siocatmarkpair(true); 457 484 458 485 sendpair("y", 1, MSG_OOB); /* TCP drops "x" at this moment. */ 459 486 epollpair(true); 460 487 461 488 tcp_incompliant { 489 + siocatmarkpair(false); 490 + 462 491 recvpair("x", 1, 1, 0); /* TCP drops "y" by passing through it. */ 463 492 epollpair(true); 493 + siocatmarkpair(true); 464 494 465 495 recvpair("y", 1, 1, MSG_OOB); /* TCP returns -EINVAL. */ 466 496 epollpair(false); 497 + siocatmarkpair(true); 467 498 } 468 499 } 469 500 ··· 504 469 { 505 470 sendpair("x", 1, MSG_OOB); 506 471 epollpair(true); 472 + siocatmarkpair(true); 507 473 508 474 sendpair("y", 1, MSG_OOB); /* TCP drops "x" at this moment. */ 509 475 epollpair(true); 476 + 477 + tcp_incompliant { 478 + siocatmarkpair(false); 479 + } 510 480 511 481 recvpair("y", 1, 1, MSG_OOB); 512 482 epollpair(false); 513 483 514 484 tcp_incompliant { 485 + siocatmarkpair(false); 486 + 515 487 recvpair("x", 1, 1, 0); /* TCP returns -EAGAIN. */ 516 488 epollpair(false); 489 + siocatmarkpair(true); 517 490 } 518 491 } 519 492 ··· 529 486 { 530 487 sendpair("hello", 5, MSG_OOB); 531 488 epollpair(true); 489 + siocatmarkpair(false); 532 490 533 491 sendpair("wor", 3, MSG_OOB); 534 492 epollpair(true); 493 + siocatmarkpair(false); 535 494 536 495 recvpair("r", 1, 1, MSG_OOB); 537 496 epollpair(false); 497 + siocatmarkpair(false); 538 498 539 499 sendpair("ld", 2, MSG_OOB); 540 500 epollpair(true); 501 + siocatmarkpair(false); 541 502 542 503 tcp_incompliant { 543 504 recvpair("hellowol", 8, 10, 0); /* TCP recv()s "helloworl", why "r" ?? */ 544 505 } 545 506 546 507 epollpair(true); 508 + siocatmarkpair(true); 547 509 548 510 recvpair("d", 1, 1, MSG_OOB); 549 511 epollpair(false); 512 + siocatmarkpair(true); 550 513 } 551 514 552 515 TEST_F(msg_oob, ex_oob_siocatmark) ··· 597 548 598 549 sendpair("hello", 5, MSG_OOB); 599 550 epollpair(true); 551 + siocatmarkpair(false); 600 552 601 553 recvpair("", -EINVAL, 1, MSG_OOB); 602 554 epollpair(true); 555 + siocatmarkpair(false); 603 556 604 557 recvpair("hell", 4, 5, 0); /* Break at OOB but not at ex-OOB. */ 605 558 epollpair(true); 559 + siocatmarkpair(true); 606 560 607 561 recvpair("o", 1, 1, 0); 608 562 epollpair(false); 563 + siocatmarkpair(false); 609 564 } 610 565 611 566 TEST_F(msg_oob, inline_oob_ahead_break) 612 567 { 613 568 sendpair("hello", 5, MSG_OOB); 614 569 epollpair(true); 570 + siocatmarkpair(false); 615 571 616 572 sendpair("world", 5, 0); 617 573 epollpair(true); 574 + siocatmarkpair(false); 618 575 619 576 recvpair("o", 1, 1, MSG_OOB); 620 577 epollpair(false); 578 + siocatmarkpair(false); 621 579 622 580 setinlinepair(); 623 581 624 582 recvpair("hell", 4, 9, 0); /* Break at OOB even with enough buffer. */ 625 583 epollpair(false); 584 + siocatmarkpair(true); 626 585 627 586 tcp_incompliant { 628 587 recvpair("world", 5, 6, 0); /* TCP recv()s "oworld", ... "o" ??? */ 629 588 } 630 589 631 590 epollpair(false); 591 + siocatmarkpair(false); 632 592 } 633 593 634 594 TEST_F(msg_oob, inline_ex_oob_break) 635 595 { 636 596 sendpair("hello", 5, MSG_OOB); 637 597 epollpair(true); 598 + siocatmarkpair(false); 638 599 639 600 sendpair("wor", 3, MSG_OOB); 640 601 epollpair(true); 602 + siocatmarkpair(false); 641 603 642 604 sendpair("ld", 2, 0); 643 605 epollpair(true); 606 + siocatmarkpair(false); 644 607 645 608 setinlinepair(); 646 609 647 610 recvpair("hellowo", 7, 10, 0); /* Break at OOB but not at ex-OOB. */ 648 611 epollpair(true); 612 + siocatmarkpair(true); 649 613 650 614 recvpair("rld", 3, 3, 0); 651 615 epollpair(false); 616 + siocatmarkpair(false); 652 617 } 653 618 654 619 TEST_F(msg_oob, inline_ex_oob_no_drop) 655 620 { 656 621 sendpair("x", 1, MSG_OOB); 657 622 epollpair(true); 623 + siocatmarkpair(true); 658 624 659 625 setinlinepair(); 660 626 661 627 sendpair("y", 1, MSG_OOB); /* TCP does NOT drops "x" at this moment. */ 662 628 epollpair(true); 629 + siocatmarkpair(false); 663 630 664 631 recvpair("x", 1, 1, 0); 665 632 epollpair(true); 633 + siocatmarkpair(true); 666 634 667 635 recvpair("y", 1, 1, 0); 668 636 epollpair(false); 637 + siocatmarkpair(false); 669 638 } 670 639 671 640 TEST_F(msg_oob, inline_ex_oob_drop) 672 641 { 673 642 sendpair("x", 1, MSG_OOB); 674 643 epollpair(true); 644 + siocatmarkpair(true); 675 645 676 646 sendpair("y", 1, MSG_OOB); /* TCP drops "x" at this moment. */ 677 647 epollpair(true); ··· 698 630 setinlinepair(); 699 631 700 632 tcp_incompliant { 633 + siocatmarkpair(false); 634 + 701 635 recvpair("x", 1, 1, 0); /* TCP recv()s "y". */ 702 636 epollpair(true); 637 + siocatmarkpair(true); 703 638 704 639 recvpair("y", 1, 1, 0); /* TCP returns -EAGAIN. */ 705 640 epollpair(false); 641 + siocatmarkpair(false); 706 642 } 707 643 } 708 644