restrict-access.c revision 5137c64be6bca222026a4aa9d8b0d71a5becb25e
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenvoid restrict_access_set_env(const char *user, uid_t uid, gid_t gid,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strconcat("RESTRICT_USER=", user, NULL));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (chroot_dir != NULL && *chroot_dir != '\0')
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strconcat("RESTRICT_CHROOT=", chroot_dir, NULL));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strdup_printf("RESTRICT_SETUID=%s", dec2str(uid)));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strdup_printf("RESTRICT_SETGID=%s", dec2str(gid)));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if (extra_groups != NULL && *extra_groups != '\0') {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strconcat("RESTRICT_SETEXTRAGROUPS=",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strdup_printf("RESTRICT_GID_FIRST=%s",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen env_put(t_strdup_printf("RESTRICT_GID_LAST=%s",
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic gid_t *get_groups_list(unsigned int *gid_count_r)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* @UNSAFE */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen if ((ret = getgroups(gid_count, gid_list)) < 0)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic bool drop_restricted_groups(gid_t *gid_list, unsigned int *gid_count,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* @UNSAFE */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const char *env;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen unsigned int i, used;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen first_valid = env == NULL ? 0 : (gid_t)strtoul(env, NULL, 10);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen last_valid = env == NULL ? (gid_t)-1 : (gid_t)strtoul(env, NULL, 10);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen (last_valid == (gid_t)-1 || gid_list[i] <= last_valid)) {
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen i_fatal("unknown group name in extra_groups: %s", name);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void fix_groups_list(const char *extra_groups,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen bool preserve_existing, bool *have_root_group)
if (preserve_existing) {
have_root_group) &&
gid_count = 0;
i_unreached();
const char *env;
if (is_root) {
time_t t = 0;
(void)localtime(&t);
if (uid != 0) {
if (setuid(0) == 0) {
if (uid == 0)
if (gid == 0)