If a set of saved credentials already exists when we are called, log
a debugging message and fail. If the effective uid is non-zero but identical to the target uid, save the current credentials and return without doing anything else. git-svn-id: svn+ssh://svn.openpam.org/svn/openpam/trunk@201 185d5e19-27fe-0310-9dcf-9bff6b9f3609
This commit is contained in:
parent
a657d3746c
commit
4ad428dc12
|
@ -31,7 +31,7 @@
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $P4: //depot/projects/openpam/lib/openpam_borrow_cred.c#3 $
|
* $P4: //depot/projects/openpam/lib/openpam_borrow_cred.c#4 $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
@ -57,9 +57,18 @@ openpam_borrow_cred(pam_handle_t *pamh,
|
||||||
struct pam_saved_cred *scred;
|
struct pam_saved_cred *scred;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
ENTER();
|
ENTERI(pwd->pw_uid);
|
||||||
if (geteuid() != 0)
|
r = pam_get_data(pamh, PAM_SAVED_CRED, (const void **)&scred);
|
||||||
|
if (r == PAM_SUCCESS && scred != NULL) {
|
||||||
|
openpam_log(PAM_LOG_DEBUG,
|
||||||
|
"already operating under borrowed credentials");
|
||||||
|
RETURNC(PAM_SYSTEM_ERR);
|
||||||
|
}
|
||||||
|
if (geteuid() != 0 && geteuid() != pwd->pw_uid) {
|
||||||
|
openpam_log(PAM_LOG_DEBUG, "called with non-zero euid: %d",
|
||||||
|
(int)geteuid());
|
||||||
RETURNC(PAM_PERM_DENIED);
|
RETURNC(PAM_PERM_DENIED);
|
||||||
|
}
|
||||||
scred = calloc(1, sizeof *scred);
|
scred = calloc(1, sizeof *scred);
|
||||||
if (scred == NULL)
|
if (scred == NULL)
|
||||||
RETURNC(PAM_BUF_ERR);
|
RETURNC(PAM_BUF_ERR);
|
||||||
|
@ -76,6 +85,8 @@ openpam_borrow_cred(pam_handle_t *pamh,
|
||||||
free(scred);
|
free(scred);
|
||||||
RETURNC(r);
|
RETURNC(r);
|
||||||
}
|
}
|
||||||
|
if (geteuid() == pwd->pw_uid)
|
||||||
|
RETURNC(PAM_SUCCESS);
|
||||||
if (initgroups(pwd->pw_name, pwd->pw_gid) == -1 ||
|
if (initgroups(pwd->pw_name, pwd->pw_gid) == -1 ||
|
||||||
setegid(pwd->pw_gid) == -1 || seteuid(pwd->pw_uid) == -1) {
|
setegid(pwd->pw_gid) == -1 || seteuid(pwd->pw_uid) == -1) {
|
||||||
openpam_restore_cred(pamh);
|
openpam_restore_cred(pamh);
|
||||||
|
|
Loading…
Reference in New Issue