| ##***************************************************************************** | |
| # AUTHOR: | |
| # Tim Wickberg <tim@schedmd.com> | |
| # | |
| # SYNOPSIS: | |
| # X_AC_UID_GID_SIZE_CHECK | |
| # | |
| # DESCRIPTION: | |
| # Slurm assumes sizeof(uid_t) == sizeof(gid_t) == sizeof(uint32_t). | |
| # Enforce that at compile time to prevent potential security problems. | |
| # | |
| # sizeof(uid) > sizeof(uint64_t) leads to potential truncation problems. | |
| # | |
| # sizeof(gid) < sizeof(uint64_t) is less obvious, but a worse security risk. | |
| # Internally, arrays of gid_t are serialized as uint32_t. | |
| # If sizeof(gid_t) == sizeof(uint16_t), Slurm would call setgroups() with | |
| # with every other element of the array being interpretted as zero, a.k.a. | |
| # the group id for root. | |
| ##***************************************************************************** | |
| AC_DEFUN([X_AC_UID_GID_SIZE_CHECK], [ | |
| AC_MSG_CHECKING([for uid_t and gid_t data sizes)]) | |
| AC_RUN_IFELSE([AC_LANG_SOURCE([ | |
| #include <inttypes.h> | |
| #include <sys/types.h> | |
| int main(int argc, char **argv) | |
| { | |
| if (sizeof(uid_t) != sizeof(uint32_t) || | |
| sizeof(gid_t) != sizeof(uint32_t)) | |
| return -1; | |
| return 0; | |
| } | |
| ])], | |
| uid_t_size_ok=yes, | |
| uid_t_size_ok=no, | |
| uid_t_size_ok=yes) | |
| if test "$uid_t_size_ok" = "no"; then | |
| AC_MSG_ERROR([unexpected size for uid_t or gid_t]) | |
| else | |
| AC_MSG_RESULT([yes]) | |
| fi | |
| ]) |