null-deref-close-during-select.cpp 766 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * Copyright (c) 2018-2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <pthread.h>
  7. #include <stdio.h>
  8. #include <sys/select.h>
  9. #include <unistd.h>
  10. int pipefds[2];
  11. int main(int, char**)
  12. {
  13. pipe(pipefds);
  14. pthread_t tid;
  15. pthread_create(
  16. &tid, nullptr, [](void*) -> void* {
  17. sleep(1);
  18. printf("ST: close()\n");
  19. close(pipefds[1]);
  20. pthread_exit(nullptr);
  21. },
  22. nullptr);
  23. fd_set rfds;
  24. FD_ZERO(&rfds);
  25. FD_SET(pipefds[1], &rfds);
  26. printf("MT: select()\n");
  27. int rc = select(pipefds[1] + 1, &rfds, nullptr, nullptr, nullptr);
  28. if (rc < 0) {
  29. perror("select");
  30. return 1;
  31. }
  32. printf("ok\n");
  33. return 0;
  34. }