t_setreuid.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:3k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2. **  This program checks to see if your version of setreuid works.
  3. **  Compile it, make it setuid root, and run it as yourself (NOT as
  4. **  root).  If it won't compile or outputs any MAYDAY messages, don't
  5. **  define HASSETREUID in conf.h.
  6. **
  7. **  Compilation is trivial -- just "cc t_setreuid.c".  Make it setuid,
  8. **  root and then execute it as a non-root user.
  9. */
  10. #include <sys/types.h>
  11. #include <unistd.h>
  12. #include <stdio.h>
  13. #ifndef lint
  14. static char id[] = "@(#)$Id: t_setreuid.c,v 8.4 1999/08/28 00:25:28 gshapiro Exp $";
  15. #endif /* ! lint */
  16. #ifdef __hpux
  17. # define setreuid(r, e) setresuid(r, e, -1)
  18. #endif /* __hpux */
  19. static void
  20. printuids(str, r, e)
  21. char *str;
  22. int r, e;
  23. {
  24. printf("%s (should be %d/%d): r/euid=%d/%dn", str, r, e,
  25. getuid(), geteuid());
  26. }
  27. int
  28. main(argc, argv)
  29. int argc;
  30. char **argv;
  31. {
  32. int fail = 0;
  33. uid_t realuid = getuid();
  34. printuids("initial uids", realuid, 0);
  35. if (geteuid() != 0)
  36. {
  37. printf("SETUP ERROR: re-run setuid rootn");
  38. exit(1);
  39. }
  40. if (getuid() == 0)
  41. {
  42. printf("SETUP ERROR: must be run by a non-root usern");
  43. exit(1);
  44. }
  45. if (setreuid(0, 1) < 0)
  46. {
  47. fail++;
  48. printf("setreuid(0, 1) failuren");
  49. }
  50. printuids("after setreuid(0, 1)", 0, 1);
  51. if (geteuid() != 1)
  52. {
  53. fail++;
  54. printf("MAYDAY!  Wrong effective uidn");
  55. }
  56. /* do activity here */
  57. if (setreuid(-1, 0) < 0)
  58. {
  59. fail++;
  60. printf("setreuid(-1, 0) failuren");
  61. }
  62. printuids("after setreuid(-1, 0)", 0, 0);
  63. if (setreuid(realuid, 0) < 0)
  64. {
  65. fail++;
  66. printf("setreuid(%d, 0) failuren", realuid);
  67. }
  68. printuids("after setreuid(realuid, 0)", realuid, 0);
  69. if (geteuid() != 0)
  70. {
  71. fail++;
  72. printf("MAYDAY!  Wrong effective uidn");
  73. }
  74. if (getuid() != realuid)
  75. {
  76. fail++;
  77. printf("MAYDAY!  Wrong real uidn");
  78. }
  79. printf("n");
  80. if (setreuid(0, 2) < 0)
  81. {
  82. fail++;
  83. printf("setreuid(0, 2) failuren");
  84. }
  85. printuids("after setreuid(0, 2)", 0, 2);
  86. if (geteuid() != 2)
  87. {
  88. fail++;
  89. printf("MAYDAY!  Wrong effective uidn");
  90. }
  91. /* do activity here */
  92. if (setreuid(-1, 0) < 0)
  93. {
  94. fail++;
  95. printf("setreuid(-1, 0) failuren");
  96. }
  97. printuids("after setreuid(-1, 0)", 0, 0);
  98. if (setreuid(realuid, 0) < 0)
  99. {
  100. fail++;
  101. printf("setreuid(%d, 0) failuren", realuid);
  102. }
  103. printuids("after setreuid(realuid, 0)", realuid, 0);
  104. if (geteuid() != 0)
  105. {
  106. fail++;
  107. printf("MAYDAY!  Wrong effective uidn");
  108. }
  109. if (getuid() != realuid)
  110. {
  111. fail++;
  112. printf("MAYDAY!  Wrong real uidn");
  113. }
  114. if (fail)
  115. {
  116. printf("nThis system cannot use setreuidn");
  117. exit(1);
  118. }
  119. printf("nIt is safe to define HASSETREUID on this systemn");
  120. exit(0);
  121. }