Deleted Added
full compact
openpam_borrow_cred.c (107937) openpam_borrow_cred.c (110503)
1/*-
2 * Copyright (c) 2002 Networks Associates Technology, Inc.
3 * All rights reserved.
4 *
5 * This software was developed for the FreeBSD Project by ThinkSec AS and
6 * Network Associates Laboratories, the Security Research Division of
7 * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
8 * ("CBOSS"), as part of the DARPA CHATS research program.

--- 17 unchanged lines hidden (view full) ---

26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
1/*-
2 * Copyright (c) 2002 Networks Associates Technology, Inc.
3 * All rights reserved.
4 *
5 * This software was developed for the FreeBSD Project by ThinkSec AS and
6 * Network Associates Laboratories, the Security Research Division of
7 * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
8 * ("CBOSS"), as part of the DARPA CHATS research program.

--- 17 unchanged lines hidden (view full) ---

26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 * $P4: //depot/projects/openpam/lib/openpam_borrow_cred.c#3 $
34 * $P4: //depot/projects/openpam/lib/openpam_borrow_cred.c#4 $
35 */
36
37#include <sys/param.h>
38
39#include <pwd.h>
40#include <stdlib.h>
41#include <unistd.h>
42

--- 9 unchanged lines hidden (view full) ---

52
53int
54openpam_borrow_cred(pam_handle_t *pamh,
55 const struct passwd *pwd)
56{
57 struct pam_saved_cred *scred;
58 int r;
59
35 */
36
37#include <sys/param.h>
38
39#include <pwd.h>
40#include <stdlib.h>
41#include <unistd.h>
42

--- 9 unchanged lines hidden (view full) ---

52
53int
54openpam_borrow_cred(pam_handle_t *pamh,
55 const struct passwd *pwd)
56{
57 struct pam_saved_cred *scred;
58 int r;
59
60 ENTER();
61 if (geteuid() != 0)
60 ENTERI(pwd->pw_uid);
61 r = pam_get_data(pamh, PAM_SAVED_CRED, (const void **)&scred);
62 if (r == PAM_SUCCESS && scred != NULL) {
63 openpam_log(PAM_LOG_DEBUG,
64 "already operating under borrowed credentials");
65 RETURNC(PAM_SYSTEM_ERR);
66 }
67 if (geteuid() != 0 && geteuid() != pwd->pw_uid) {
68 openpam_log(PAM_LOG_DEBUG, "called with non-zero euid: %d",
69 (int)geteuid());
62 RETURNC(PAM_PERM_DENIED);
70 RETURNC(PAM_PERM_DENIED);
71 }
63 scred = calloc(1, sizeof *scred);
64 if (scred == NULL)
65 RETURNC(PAM_BUF_ERR);
66 scred->euid = geteuid();
67 scred->egid = getegid();
68 r = getgroups(NGROUPS_MAX, scred->groups);
69 if (r == -1) {
70 free(scred);
71 RETURNC(PAM_SYSTEM_ERR);
72 }
73 scred->ngroups = r;
74 r = pam_set_data(pamh, PAM_SAVED_CRED, scred, &openpam_free_data);
75 if (r != PAM_SUCCESS) {
76 free(scred);
77 RETURNC(r);
78 }
72 scred = calloc(1, sizeof *scred);
73 if (scred == NULL)
74 RETURNC(PAM_BUF_ERR);
75 scred->euid = geteuid();
76 scred->egid = getegid();
77 r = getgroups(NGROUPS_MAX, scred->groups);
78 if (r == -1) {
79 free(scred);
80 RETURNC(PAM_SYSTEM_ERR);
81 }
82 scred->ngroups = r;
83 r = pam_set_data(pamh, PAM_SAVED_CRED, scred, &openpam_free_data);
84 if (r != PAM_SUCCESS) {
85 free(scred);
86 RETURNC(r);
87 }
88 if (geteuid() == pwd->pw_uid)
89 RETURNC(PAM_SUCCESS);
79 if (initgroups(pwd->pw_name, pwd->pw_gid) == -1 ||
80 setegid(pwd->pw_gid) == -1 || seteuid(pwd->pw_uid) == -1) {
81 openpam_restore_cred(pamh);
82 RETURNC(PAM_SYSTEM_ERR);
83 }
84 RETURNC(PAM_SUCCESS);
85}
86

--- 20 unchanged lines hidden ---
90 if (initgroups(pwd->pw_name, pwd->pw_gid) == -1 ||
91 setegid(pwd->pw_gid) == -1 || seteuid(pwd->pw_uid) == -1) {
92 openpam_restore_cred(pamh);
93 RETURNC(PAM_SYSTEM_ERR);
94 }
95 RETURNC(PAM_SUCCESS);
96}
97

--- 20 unchanged lines hidden ---