]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream commit
authordtucker@openbsd.org <dtucker@openbsd.org>
Mon, 22 Jun 2015 12:29:57 +0000 (12:29 +0000)
committerDamien Miller <djm@mindrot.org>
Tue, 23 Jun 2015 00:34:46 +0000 (10:34 +1000)
Don't call setgroups if we have zero groups; there's no
 guarantee that it won't try to deref the pointer.  Based on a patch from mail
 at quitesimple.org, ok djm deraadt

Upstream-ID: 2fff85e11d7a9a387ef7fddf41fbfaf566708ab1

uidswap.c

index f2713fdba15f267e230aa161561484e7291db0f7..27a2faa6279d26f123aa327c3840be9685d83253 100644 (file)
--- a/uidswap.c
+++ b/uidswap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uidswap.c,v 1.37 2015/01/16 06:40:12 deraadt Exp $ */
+/* $OpenBSD: uidswap.c,v 1.38 2015/06/22 12:29:57 dtucker Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -113,7 +113,7 @@ temporarily_use_uid(struct passwd *pw)
                }
        }
        /* Set the effective uid to the given (unprivileged) uid. */
-       if (setgroups(user_groupslen, user_groups) < 0)
+       if (user_groupslen > 0 && setgroups(user_groupslen, user_groups) < 0)
                fatal("setgroups: %.100s", strerror(errno));
 #ifndef SAVED_IDS_WORK_WITH_SETEUID
        /* Propagate the privileged gid to all of our gids. */
@@ -187,7 +187,8 @@ restore_uid(void)
        setgid(getgid());
 #endif /* SAVED_IDS_WORK_WITH_SETEUID */
 
-       if (setgroups(saved_egroupslen, saved_egroups) < 0)
+       if (saved_egroupslen > 0 &&
+           setgroups(saved_egroupslen, saved_egroups) < 0)
                fatal("setgroups: %.100s", strerror(errno));
        temporarily_use_uid_effective = 0;
 }