svr4_misc.c (124802) | svr4_misc.c (125454) |
---|---|
1/* 2 * Copyright (c) 1998 Mark Newton 3 * Copyright (c) 1994 Christos Zoulas 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 19 unchanged lines hidden (view full) --- 28/* 29 * SVR4 compatibility module. 30 * 31 * SVR4 system calls that are implemented differently in BSD are 32 * handled here. 33 */ 34 35#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 1998 Mark Newton 3 * Copyright (c) 1994 Christos Zoulas 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 19 unchanged lines hidden (view full) --- 28/* 29 * SVR4 compatibility module. 30 * 31 * SVR4 system calls that are implemented differently in BSD are 32 * handled here. 33 */ 34 35#include <sys/cdefs.h> |
36__FBSDID("$FreeBSD: head/sys/compat/svr4/svr4_misc.c 124802 2004-01-21 17:10:47Z rwatson $"); | 36__FBSDID("$FreeBSD: head/sys/compat/svr4/svr4_misc.c 125454 2004-02-04 21:52:57Z jhb $"); |
37 38#include "opt_mac.h" 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/dirent.h> 43#include <sys/fcntl.h> 44#include <sys/filedesc.h> --- 770 unchanged lines hidden (view full) --- 815 struct proc *p = td->td_proc; 816 struct vmspace *vm = p->p_vmspace; 817 vm_offset_t new, old, base, ns; 818 int rv; 819 820 base = round_page((vm_offset_t) vm->vm_daddr); 821 ns = (vm_offset_t)uap->nsize; 822 new = round_page(ns); | 37 38#include "opt_mac.h" 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/dirent.h> 43#include <sys/fcntl.h> 44#include <sys/filedesc.h> --- 770 unchanged lines hidden (view full) --- 815 struct proc *p = td->td_proc; 816 struct vmspace *vm = p->p_vmspace; 817 vm_offset_t new, old, base, ns; 818 int rv; 819 820 base = round_page((vm_offset_t) vm->vm_daddr); 821 ns = (vm_offset_t)uap->nsize; 822 new = round_page(ns); |
823 /* For p_rlimit. */ 824 mtx_assert(&Giant, MA_OWNED); | |
825 if (new > base) { | 823 if (new > base) { |
826 if ((new - base) > (unsigned) td->td_proc->p_rlimit[RLIMIT_DATA].rlim_cur) { | 824 PROC_LOCK(p); 825 if ((new - base) > (unsigned)lim_cur(p, RLIMIT_DATA)) { 826 PROC_UNLOCK(p); |
827 return ENOMEM; | 827 return ENOMEM; |
828 } 829 if (new >= VM_MAXUSER_ADDRESS) { 830 return (ENOMEM); 831 } | 828 } 829 PROC_UNLOCK(p); 830 if (new >= VM_MAXUSER_ADDRESS) 831 return (ENOMEM); |
832 } else if (new < base) { 833 /* 834 * This is simply an invalid value. If someone wants to 835 * do fancy address space manipulations, mmap and munmap 836 * can do most of what the user would want. 837 */ 838 return EINVAL; 839 } 840 841 old = base + ctob(vm->vm_dsize); 842 843 if (new > old) { 844 vm_size_t diff; 845 diff = new - old; | 832 } else if (new < base) { 833 /* 834 * This is simply an invalid value. If someone wants to 835 * do fancy address space manipulations, mmap and munmap 836 * can do most of what the user would want. 837 */ 838 return EINVAL; 839 } 840 841 old = base + ctob(vm->vm_dsize); 842 843 if (new > old) { 844 vm_size_t diff; 845 diff = new - old; |
846 if (vm->vm_map.size + diff > p->p_rlimit[RLIMIT_VMEM].rlim_cur) | 846 PROC_LOCK(p); 847 if (vm->vm_map.size + diff > lim_cur(p, RLIMIT_VMEM)) { 848 PROC_UNLOCK(p); |
847 return(ENOMEM); | 849 return(ENOMEM); |
850 } 851 PROC_UNLOCK(p); |
|
848 rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE, 849 VM_PROT_ALL, VM_PROT_ALL, 0); 850 if (rv != KERN_SUCCESS) { 851 return (ENOMEM); 852 } 853 vm->vm_dsize += btoc(diff); 854 } else if (new < old) { 855 rv = vm_map_remove(&vm->vm_map, new, old); --- 61 unchanged lines hidden (view full) --- 917 918 919int 920svr4_sys_ulimit(td, uap) 921 struct thread *td; 922 struct svr4_sys_ulimit_args *uap; 923{ 924 int *retval = td->td_retval; | 852 rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE, 853 VM_PROT_ALL, VM_PROT_ALL, 0); 854 if (rv != KERN_SUCCESS) { 855 return (ENOMEM); 856 } 857 vm->vm_dsize += btoc(diff); 858 } else if (new < old) { 859 rv = vm_map_remove(&vm->vm_map, new, old); --- 61 unchanged lines hidden (view full) --- 921 922 923int 924svr4_sys_ulimit(td, uap) 925 struct thread *td; 926 struct svr4_sys_ulimit_args *uap; 927{ 928 int *retval = td->td_retval; |
929 int error; |
|
925 926 switch (uap->cmd) { 927 case SVR4_GFILLIM: | 930 931 switch (uap->cmd) { 932 case SVR4_GFILLIM: |
928 /* For p_rlimit below. */ 929 mtx_assert(&Giant, MA_OWNED); 930 *retval = td->td_proc->p_rlimit[RLIMIT_FSIZE].rlim_cur / 512; | 933 PROC_LOCK(td->td_proc); 934 *retval = lim_cur(td->td_proc, RLIMIT_FSIZE) / 512; 935 PROC_UNLOCK(td->td_proc); |
931 if (*retval == -1) 932 *retval = 0x7fffffff; 933 return 0; 934 935 case SVR4_SFILLIM: 936 { | 936 if (*retval == -1) 937 *retval = 0x7fffffff; 938 return 0; 939 940 case SVR4_SFILLIM: 941 { |
937 int error; 938 struct __setrlimit_args srl; | |
939 struct rlimit krl; | 942 struct rlimit krl; |
940 caddr_t sg = stackgap_init(); 941 struct rlimit *url = (struct rlimit *) 942 stackgap_alloc(&sg, sizeof *url); | |
943 944 krl.rlim_cur = uap->newlimit * 512; | 943 944 krl.rlim_cur = uap->newlimit * 512; |
945 mtx_assert(&Giant, MA_OWNED); 946 krl.rlim_max = td->td_proc->p_rlimit[RLIMIT_FSIZE].rlim_max; | 945 PROC_LOCK(td->td_proc); 946 krl.rlim_max = lim_max(td->td_proc, RLIMIT_FSIZE); 947 PROC_UNLOCK(td->td_proc); |
947 | 948 |
948 error = copyout(&krl, url, sizeof(*url)); | 949 error = kern_setrlimit(td, RLIMIT_FSIZE, &krl); |
949 if (error) 950 return error; 951 | 950 if (error) 951 return error; 952 |
952 srl.which = RLIMIT_FSIZE; 953 srl.rlp = url; 954 955 error = setrlimit(td, &srl); 956 if (error) 957 return error; 958 959 mtx_assert(&Giant, MA_OWNED); 960 *retval = td->td_proc->p_rlimit[RLIMIT_FSIZE].rlim_cur; | 953 PROC_LOCK(td->td_proc); 954 *retval = lim_cur(td->td_proc, RLIMIT_FSIZE); 955 PROC_UNLOCK(td->td_proc); |
961 if (*retval == -1) 962 *retval = 0x7fffffff; 963 return 0; 964 } 965 966 case SVR4_GMEMLIM: 967 { 968 struct vmspace *vm = td->td_proc->p_vmspace; 969 register_t r; 970 | 956 if (*retval == -1) 957 *retval = 0x7fffffff; 958 return 0; 959 } 960 961 case SVR4_GMEMLIM: 962 { 963 struct vmspace *vm = td->td_proc->p_vmspace; 964 register_t r; 965 |
971 mtx_assert(&Giant, MA_OWNED); 972 r = td->td_proc->p_rlimit[RLIMIT_DATA].rlim_cur; | 966 PROC_LOCK(td->td_proc); 967 r = lim_cur(td->td_proc, RLIMIT_DATA); 968 PROC_UNLOCK(td->td_proc); |
973 974 if (r == -1) 975 r = 0x7fffffff; | 969 970 if (r == -1) 971 r = 0x7fffffff; |
972 mtx_lock(&Giant); /* XXX */ |
|
976 r += (long) vm->vm_daddr; | 973 r += (long) vm->vm_daddr; |
974 mtx_unlock(&Giant); |
|
977 if (r < 0) 978 r = 0x7fffffff; 979 *retval = r; 980 return 0; 981 } 982 983 case SVR4_GDESLIM: | 975 if (r < 0) 976 r = 0x7fffffff; 977 *retval = r; 978 return 0; 979 } 980 981 case SVR4_GDESLIM: |
984 mtx_assert(&Giant, MA_OWNED); 985 *retval = td->td_proc->p_rlimit[RLIMIT_NOFILE].rlim_cur; | 982 PROC_LOCK(td->td_proc); 983 *retval = lim_cur(td->td_proc, RLIMIT_NOFILE); 984 PROC_UNLOCK(td->td_proc); |
986 if (*retval == -1) 987 *retval = 0x7fffffff; 988 return 0; 989 990 default: 991 return EINVAL; 992 } 993} --- 757 unchanged lines hidden --- | 985 if (*retval == -1) 986 *retval = 0x7fffffff; 987 return 0; 988 989 default: 990 return EINVAL; 991 } 992} --- 757 unchanged lines hidden --- |