summaryrefslogtreecommitdiff
path: root/session.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2000-07-11 09:16:22 +1000
committerDamien Miller <djm@mindrot.org>2000-07-11 09:16:22 +1000
commit65964d60827c9927ab9569a8a4bcd61459651e3a (patch)
tree16b1b21635cf3267108d389eb81c7898be4a109f /session.c
parent39c0a1c4c2b6a6d03a28896db5e7ab0158ed5799 (diff)
- (djm) Fixup for AIX getuserattr() support from Tom Bertelson
<tbert@abac.com>
Diffstat (limited to 'session.c')
-rw-r--r--session.c48
1 files changed, 38 insertions, 10 deletions
diff --git a/session.c b/session.c
index 1f0d227d0..7fe2b47f4 100644
--- a/session.c
+++ b/session.c
@@ -799,24 +799,52 @@ void do_pam_environment(char ***env, int *envsize)
799void set_limit(char *user, char *soft, char *hard, int resource, int mult) 799void set_limit(char *user, char *soft, char *hard, int resource, int mult)
800{ 800{
801 struct rlimit rlim; 801 struct rlimit rlim;
802 rlim_t tlim; 802 int slim, hlim;
803 int mask;
804 803
805 getrlimit(resource, &rlim); 804 getrlimit(resource, &rlim);
806 805
807 tlim = (rlim_t) 0; 806 slim = 0;
808 if (getuserattr(user, soft, &tlim, SEC_INT) != -1 && tlim) 807 if (getuserattr(user, soft, &slim, SEC_INT) != -1) {
809 rlim.rlim_cur = tlim * mult; 808 if (slim < 0) {
809 rlim.rlim_cur = RLIM_INFINITY;
810 } else if (slim != 0) {
811 /* See the wackiness below */
812 if (rlim.rlim_cur == slim * mult)
813 slim = 0;
814 else
815 rlim.rlim_cur = slim * mult;
816 }
817 }
810 818
811 tlim = (rlim_t) 0; 819 hlim = 0;
812 if (getuserattr(user, hard, &tlim, SEC_INT) != -1 && tlim) 820 if (getuserattr(user, hard, &hlim, SEC_INT) != -1) {
813 rlim.rlim_max = tlim * mult; 821 if (hlim < 0) {
822 rlim.rlim_max = RLIM_INFINITY;
823 } else if (hlim != 0) {
824 rlim.rlim_max = hlim * mult;
825 }
826 }
814 827
815 if (rlim.rlim_cur > rlim.rlim_max) 828 /*
829 * XXX For cpu and fsize the soft limit is set to the hard limit
830 * if the hard limit is left at its default value and the soft limit
831 * is changed from its default value, either by requesting it
832 * (slim == 0) or by setting it to the current default. At least
833 * that's how rlogind does it. If you're confused you're not alone.
834 * Bug or feature? AIX 4.3.1.2
835 */
836 if ((!strcmp(soft, "fsize") || !strcmp(soft, "cpu"))
837 && hlim == 0 && slim != 0)
838 rlim.rlim_max = rlim.rlim_cur;
839 /* A specified hard limit limits the soft limit */
840 else if (hlim > 0 && rlim.rlim_cur > rlim.rlim_max)
841 rlim.rlim_cur = rlim.rlim_max;
842 /* A soft limit can increase a hard limit */
843 else if (rlim.rlim_cur > rlim.rlim_max)
816 rlim.rlim_max = rlim.rlim_cur; 844 rlim.rlim_max = rlim.rlim_cur;
817 845
818 if (setrlimit(resource, &rlim) != 0) 846 if (setrlimit(resource, &rlim) != 0)
819 error("setrlimit(%.10s) failed: %.100s", soft, strerror(errno)) 847 error("setrlimit(%.10s) failed: %.100s", soft, strerror(errno));
820} 848}
821 849
822void set_limits_from_userattr(char *user) 850void set_limits_from_userattr(char *user)