proc-self-map-files-001.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright © 2018 Alexey Dobriyan <adobriyan@gmail.com>
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /* Test readlink /proc/self/map_files/... */
  17. #include <errno.h>
  18. #include <sys/types.h>
  19. #include <sys/stat.h>
  20. #include <fcntl.h>
  21. #include <stdio.h>
  22. #include <unistd.h>
  23. #include <sys/mman.h>
  24. #include <stdlib.h>
  25. static void pass(const char *fmt, unsigned long a, unsigned long b)
  26. {
  27. char name[64];
  28. char buf[64];
  29. snprintf(name, sizeof(name), fmt, a, b);
  30. if (readlink(name, buf, sizeof(buf)) == -1)
  31. exit(1);
  32. }
  33. static void fail(const char *fmt, unsigned long a, unsigned long b)
  34. {
  35. char name[64];
  36. char buf[64];
  37. snprintf(name, sizeof(name), fmt, a, b);
  38. if (readlink(name, buf, sizeof(buf)) == -1 && errno == ENOENT)
  39. return;
  40. exit(1);
  41. }
  42. int main(void)
  43. {
  44. const unsigned int PAGE_SIZE = sysconf(_SC_PAGESIZE);
  45. void *p;
  46. int fd;
  47. unsigned long a, b;
  48. fd = open("/dev/zero", O_RDONLY);
  49. if (fd == -1)
  50. return 1;
  51. p = mmap(NULL, PAGE_SIZE, PROT_NONE, MAP_PRIVATE|MAP_FILE, fd, 0);
  52. if (p == MAP_FAILED)
  53. return 1;
  54. a = (unsigned long)p;
  55. b = (unsigned long)p + PAGE_SIZE;
  56. pass("/proc/self/map_files/%lx-%lx", a, b);
  57. fail("/proc/self/map_files/ %lx-%lx", a, b);
  58. fail("/proc/self/map_files/%lx -%lx", a, b);
  59. fail("/proc/self/map_files/%lx- %lx", a, b);
  60. fail("/proc/self/map_files/%lx-%lx ", a, b);
  61. fail("/proc/self/map_files/0%lx-%lx", a, b);
  62. fail("/proc/self/map_files/%lx-0%lx", a, b);
  63. if (sizeof(long) == 4) {
  64. fail("/proc/self/map_files/100000000%lx-%lx", a, b);
  65. fail("/proc/self/map_files/%lx-100000000%lx", a, b);
  66. } else if (sizeof(long) == 8) {
  67. fail("/proc/self/map_files/10000000000000000%lx-%lx", a, b);
  68. fail("/proc/self/map_files/%lx-10000000000000000%lx", a, b);
  69. } else
  70. return 1;
  71. return 0;
  72. }