mirror of
git://anongit.mindrot.org/openssh.git
synced 2024-12-27 12:22:09 +00:00
- (bal) Migrated AIX getuserattr and usrinfo code to
openbsd-compat/port-aix.[c] to improve readilbity of do_child() and simplify our diffs against upstream source.
This commit is contained in:
parent
f095a85882
commit
a9c039cf04
@ -43,8 +43,11 @@
|
||||
- deraadt@cvs.openbsd.org 2002/02/19 02:50:59
|
||||
[sshd_config]
|
||||
stategy is not an english word
|
||||
- (bal) Migrate IRIX jobs/projects/audit/etc code to
|
||||
- (bal) Migrated IRIX jobs/projects/audit/etc code to
|
||||
openbsd-compat/port-irix.[ch] to improve readiblity of do_child()
|
||||
- (bal) Migrated AIX getuserattr and usrinfo code to
|
||||
openbsd-compat/port-aix.[c] to improve readilbity of do_child() and
|
||||
simplify our diffs against upstream source.
|
||||
|
||||
20020218
|
||||
- (tim) newer config.guess from ftp://ftp.gnu.org/gnu/config/config.guess
|
||||
@ -7642,4 +7645,4 @@
|
||||
- Wrote replacements for strlcpy and mkdtemp
|
||||
- Released 1.0pre1
|
||||
|
||||
$Id: ChangeLog,v 1.1866 2002/02/19 20:02:48 mouring Exp $
|
||||
$Id: ChangeLog,v 1.1867 2002/02/19 20:27:55 mouring Exp $
|
||||
|
@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.in,v 1.20 2002/02/19 20:02:49 mouring Exp $
|
||||
# $Id: Makefile.in,v 1.21 2002/02/19 20:27:57 mouring Exp $
|
||||
|
||||
sysconfdir=@sysconfdir@
|
||||
piddir=@piddir@
|
||||
@ -20,7 +20,7 @@ OPENBSD=base64.o bindresvport.o daemon.o dirname.o getcwd.o getgrouplist.o getop
|
||||
|
||||
COMPAT=bsd-arc4random.o bsd-cray.o bsd-cygwin_util.o bsd-misc.o bsd-nextstep.o bsd-snprintf.o bsd-waitpid.o fake-getaddrinfo.o fake-getnameinfo.o
|
||||
|
||||
PORTS=port-irix.o
|
||||
PORTS=port-irix.o port-aix.o
|
||||
|
||||
.c.o:
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: openbsd-compat.h,v 1.15 2002/02/19 20:02:49 mouring Exp $ */
|
||||
/* $Id: openbsd-compat.h,v 1.16 2002/02/19 20:27:57 mouring Exp $ */
|
||||
|
||||
#ifndef _OPENBSD_H
|
||||
#define _OPENBSD_H
|
||||
@ -41,5 +41,6 @@
|
||||
/* Routines for a single OS platform */
|
||||
#include "bsd-cray.h"
|
||||
#include "port-irix.h"
|
||||
#include "port-aix.h"
|
||||
|
||||
#endif /* _OPENBSD_H */
|
||||
|
122
openbsd-compat/port-aix.c
Normal file
122
openbsd-compat/port-aix.c
Normal file
@ -0,0 +1,122 @@
|
||||
#include "includes.h"
|
||||
|
||||
#ifdef _AIX
|
||||
|
||||
#include <uinfo.h>
|
||||
|
||||
/* AIX limits */
|
||||
#if defined(HAVE_GETUSERATTR) && !defined(S_UFSIZE_HARD) && defined(S_UFSIZE)
|
||||
# define S_UFSIZE_HARD S_UFSIZE "_hard"
|
||||
# define S_UCPU_HARD S_UCPU "_hard"
|
||||
# define S_UDATA_HARD S_UDATA "_hard"
|
||||
# define S_USTACK_HARD S_USTACK "_hard"
|
||||
# define S_URSS_HARD S_URSS "_hard"
|
||||
# define S_UCORE_HARD S_UCORE "_hard"
|
||||
# define S_UNOFILE_HARD S_UNOFILE "_hard"
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_GETUSERATTR)
|
||||
/*
|
||||
* AIX-specific login initialisation
|
||||
*/
|
||||
void
|
||||
set_limit(char *user, char *soft, char *hard, int resource, int mult)
|
||||
{
|
||||
struct rlimit rlim;
|
||||
int slim, hlim;
|
||||
|
||||
getrlimit(resource, &rlim);
|
||||
|
||||
slim = 0;
|
||||
if (getuserattr(user, soft, &slim, SEC_INT) != -1) {
|
||||
if (slim < 0) {
|
||||
rlim.rlim_cur = RLIM_INFINITY;
|
||||
} else if (slim != 0) {
|
||||
/* See the wackiness below */
|
||||
if (rlim.rlim_cur == slim * mult)
|
||||
slim = 0;
|
||||
else
|
||||
rlim.rlim_cur = slim * mult;
|
||||
}
|
||||
}
|
||||
hlim = 0;
|
||||
if (getuserattr(user, hard, &hlim, SEC_INT) != -1) {
|
||||
if (hlim < 0) {
|
||||
rlim.rlim_max = RLIM_INFINITY;
|
||||
} else if (hlim != 0) {
|
||||
rlim.rlim_max = hlim * mult;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX For cpu and fsize the soft limit is set to the hard limit
|
||||
* if the hard limit is left at its default value and the soft limit
|
||||
* is changed from its default value, either by requesting it
|
||||
* (slim == 0) or by setting it to the current default. At least
|
||||
* that's how rlogind does it. If you're confused you're not alone.
|
||||
* Bug or feature? AIX 4.3.1.2
|
||||
*/
|
||||
if ((!strcmp(soft, "fsize") || !strcmp(soft, "cpu"))
|
||||
&& hlim == 0 && slim != 0)
|
||||
rlim.rlim_max = rlim.rlim_cur;
|
||||
/* A specified hard limit limits the soft limit */
|
||||
else if (hlim > 0 && rlim.rlim_cur > rlim.rlim_max)
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
/* A soft limit can increase a hard limit */
|
||||
else if (rlim.rlim_cur > rlim.rlim_max)
|
||||
rlim.rlim_max = rlim.rlim_cur;
|
||||
|
||||
if (setrlimit(resource, &rlim) != 0)
|
||||
error("setrlimit(%.10s) failed: %.100s", soft, strerror(errno));
|
||||
}
|
||||
|
||||
void
|
||||
set_limits_from_userattr(char *user)
|
||||
{
|
||||
int mask;
|
||||
char buf[16];
|
||||
|
||||
set_limit(user, S_UFSIZE, S_UFSIZE_HARD, RLIMIT_FSIZE, 512);
|
||||
set_limit(user, S_UCPU, S_UCPU_HARD, RLIMIT_CPU, 1);
|
||||
set_limit(user, S_UDATA, S_UDATA_HARD, RLIMIT_DATA, 512);
|
||||
set_limit(user, S_USTACK, S_USTACK_HARD, RLIMIT_STACK, 512);
|
||||
set_limit(user, S_URSS, S_URSS_HARD, RLIMIT_RSS, 512);
|
||||
set_limit(user, S_UCORE, S_UCORE_HARD, RLIMIT_CORE, 512);
|
||||
#if defined(S_UNOFILE)
|
||||
set_limit(user, S_UNOFILE, S_UNOFILE_HARD, RLIMIT_NOFILE, 1);
|
||||
#endif
|
||||
|
||||
if (getuserattr(user, S_UMASK, &mask, SEC_INT) != -1) {
|
||||
/* Convert decimal to octal */
|
||||
(void) snprintf(buf, sizeof(buf), "%d", mask);
|
||||
if (sscanf(buf, "%o", &mask) == 1)
|
||||
umask(mask);
|
||||
}
|
||||
}
|
||||
#endif /* defined(HAVE_GETUSERATTR) */
|
||||
|
||||
/*
|
||||
* AIX has a "usrinfo" area where logname and
|
||||
* other stuff is stored - a few applications
|
||||
* actually use this and die if it's not set
|
||||
*/
|
||||
void
|
||||
aix_usrinfo(Session *s)
|
||||
{
|
||||
struct passwd *pw = s->pw;
|
||||
u_int i;
|
||||
const char *cp=NULL;
|
||||
|
||||
if (s->ttyfd == -1)
|
||||
s->tty[0] = '\0';
|
||||
cp = xmalloc(22 + strlen(s->tty) + 2 * strlen(pw->pw_name));
|
||||
i = sprintf(cp, "LOGNAME=%s%cNAME=%s%cTTY=%s%c%c", pw->pw_name, 0,
|
||||
pw->pw_name, 0, s->tty, 0, 0);
|
||||
if (usrinfo(SETUINFO, cp, i) == -1)
|
||||
fatal("Couldn't set usrinfo: %s", strerror(errno));
|
||||
debug3("AIX/UsrInfo: set len %d", i);
|
||||
xfree(cp);
|
||||
}
|
||||
|
||||
#endif /* _AIX */
|
||||
|
10
openbsd-compat/port-aix.h
Normal file
10
openbsd-compat/port-aix.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifdef _AIX
|
||||
|
||||
#ifdef HAVE_GETUSERATTR
|
||||
void set_limit(char *user, char *soft, char *hard, int resource, int mult);
|
||||
void set_limits_from_userattr(char *user);
|
||||
#endif /* HAVE_GETUSERATTR */
|
||||
|
||||
void aix_usrinfo(Session *s);
|
||||
|
||||
#endif /* _AIX */
|
111
session.c
111
session.c
@ -67,21 +67,6 @@ RCSID("$OpenBSD: session.c,v 1.126 2002/02/14 23:28:00 markus Exp $");
|
||||
#define is_winnt (GetVersion() < 0x80000000)
|
||||
#endif
|
||||
|
||||
/* AIX limits */
|
||||
#if defined(HAVE_GETUSERATTR) && !defined(S_UFSIZE_HARD) && defined(S_UFSIZE)
|
||||
# define S_UFSIZE_HARD S_UFSIZE "_hard"
|
||||
# define S_UCPU_HARD S_UCPU "_hard"
|
||||
# define S_UDATA_HARD S_UDATA "_hard"
|
||||
# define S_USTACK_HARD S_USTACK "_hard"
|
||||
# define S_URSS_HARD S_URSS "_hard"
|
||||
# define S_UCORE_HARD S_UCORE "_hard"
|
||||
# define S_UNOFILE_HARD S_UNOFILE "_hard"
|
||||
#endif
|
||||
|
||||
#ifdef _AIX
|
||||
# include <uinfo.h>
|
||||
#endif
|
||||
|
||||
/* types */
|
||||
|
||||
#define TTYSZ 64
|
||||
@ -898,85 +883,6 @@ void copy_environment(char **source, char ***env, u_int *envsize)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HAVE_GETUSERATTR)
|
||||
/*
|
||||
* AIX-specific login initialisation
|
||||
*/
|
||||
void set_limit(char *user, char *soft, char *hard, int resource, int mult)
|
||||
{
|
||||
struct rlimit rlim;
|
||||
int slim, hlim;
|
||||
|
||||
getrlimit(resource, &rlim);
|
||||
|
||||
slim = 0;
|
||||
if (getuserattr(user, soft, &slim, SEC_INT) != -1) {
|
||||
if (slim < 0) {
|
||||
rlim.rlim_cur = RLIM_INFINITY;
|
||||
} else if (slim != 0) {
|
||||
/* See the wackiness below */
|
||||
if (rlim.rlim_cur == slim * mult)
|
||||
slim = 0;
|
||||
else
|
||||
rlim.rlim_cur = slim * mult;
|
||||
}
|
||||
}
|
||||
|
||||
hlim = 0;
|
||||
if (getuserattr(user, hard, &hlim, SEC_INT) != -1) {
|
||||
if (hlim < 0) {
|
||||
rlim.rlim_max = RLIM_INFINITY;
|
||||
} else if (hlim != 0) {
|
||||
rlim.rlim_max = hlim * mult;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX For cpu and fsize the soft limit is set to the hard limit
|
||||
* if the hard limit is left at its default value and the soft limit
|
||||
* is changed from its default value, either by requesting it
|
||||
* (slim == 0) or by setting it to the current default. At least
|
||||
* that's how rlogind does it. If you're confused you're not alone.
|
||||
* Bug or feature? AIX 4.3.1.2
|
||||
*/
|
||||
if ((!strcmp(soft, "fsize") || !strcmp(soft, "cpu"))
|
||||
&& hlim == 0 && slim != 0)
|
||||
rlim.rlim_max = rlim.rlim_cur;
|
||||
/* A specified hard limit limits the soft limit */
|
||||
else if (hlim > 0 && rlim.rlim_cur > rlim.rlim_max)
|
||||
rlim.rlim_cur = rlim.rlim_max;
|
||||
/* A soft limit can increase a hard limit */
|
||||
else if (rlim.rlim_cur > rlim.rlim_max)
|
||||
rlim.rlim_max = rlim.rlim_cur;
|
||||
|
||||
if (setrlimit(resource, &rlim) != 0)
|
||||
error("setrlimit(%.10s) failed: %.100s", soft, strerror(errno));
|
||||
}
|
||||
|
||||
void set_limits_from_userattr(char *user)
|
||||
{
|
||||
int mask;
|
||||
char buf[16];
|
||||
|
||||
set_limit(user, S_UFSIZE, S_UFSIZE_HARD, RLIMIT_FSIZE, 512);
|
||||
set_limit(user, S_UCPU, S_UCPU_HARD, RLIMIT_CPU, 1);
|
||||
set_limit(user, S_UDATA, S_UDATA_HARD, RLIMIT_DATA, 512);
|
||||
set_limit(user, S_USTACK, S_USTACK_HARD, RLIMIT_STACK, 512);
|
||||
set_limit(user, S_URSS, S_URSS_HARD, RLIMIT_RSS, 512);
|
||||
set_limit(user, S_UCORE, S_UCORE_HARD, RLIMIT_CORE, 512);
|
||||
#if defined(S_UNOFILE)
|
||||
set_limit(user, S_UNOFILE, S_UNOFILE_HARD, RLIMIT_NOFILE, 1);
|
||||
#endif
|
||||
|
||||
if (getuserattr(user, S_UMASK, &mask, SEC_INT) != -1) {
|
||||
/* Convert decimal to octal */
|
||||
(void) snprintf(buf, sizeof(buf), "%d", mask);
|
||||
if (sscanf(buf, "%o", &mask) == 1)
|
||||
umask(mask);
|
||||
}
|
||||
}
|
||||
#endif /* defined(HAVE_GETUSERATTR) */
|
||||
|
||||
/*
|
||||
* Performs common processing for the child, such as setting up the
|
||||
* environment, closing extra file descriptors, setting the user and group
|
||||
@ -1082,22 +988,7 @@ do_child(Session *s, const char *command)
|
||||
irix_setusercontext(pw);
|
||||
# endif /* defined(WITH_IRIX_PROJECT) || defined(WITH_IRIX_JOBS) || defined(WITH_IRIX_ARRAY) */
|
||||
#ifdef _AIX
|
||||
/*
|
||||
* AIX has a "usrinfo" area where logname and
|
||||
* other stuff is stored - a few applications
|
||||
* actually use this and die if it's not set
|
||||
*/
|
||||
if (s->ttyfd == -1)
|
||||
s->tty[0] = '\0';
|
||||
cp = xmalloc(22 + strlen(s->tty) +
|
||||
2 * strlen(pw->pw_name));
|
||||
i = sprintf(cp, "LOGNAME=%s%cNAME=%s%cTTY=%s%c%c",
|
||||
pw->pw_name, 0, pw->pw_name, 0, s->tty, 0, 0);
|
||||
if (usrinfo(SETUINFO, cp, i) == -1)
|
||||
fatal("Couldn't set usrinfo: %s",
|
||||
strerror(errno));
|
||||
debug3("AIX/UsrInfo: set len %d", i);
|
||||
xfree(cp);
|
||||
aix_usrinfo(s)
|
||||
#endif
|
||||
|
||||
/* Permanently switch to the desired uid. */
|
||||
|
Loading…
Reference in New Issue
Block a user