# Return 0 in case of success, and a non-Zero value otherwise.
get_min_ulimit_v_()
{
- local vm
+ local v
+ local page_size
+
+ # Increase result by this amount to avoid alignment issues
+ page_size=$(getconf PAGESIZE || echo 4096)
+ page_size=$(($page_size / 1024))
+
for v in $( seq 5000 5000 50000 ); do
if ( ulimit -v $v && "$@" ) >/dev/null; then
- local vm_prev
+ local prev_v
prev_v=$v
for v in $( seq $(($prev_v-1000)) -1000 1000 ); do
- ( ulimit -v $v && "$@" ) >/dev/null \
- || { echo $prev_v; return 0; }
+ ( ulimit -v $v && "$@" ) >/dev/null || \
+ {
+ ret_v=$((prev_v + $page_size))
+ echo $ret_v
+ return 0
+ }
prev_v=$v
done
fi
# From coreutils-8.10 through 8.20, this would make cut try to allocate
# a 256MiB bit vector.
-(ulimit -v $vm && : | cut -b$CUT_MAX- > err 2>&1) || fail=1
+(ulimit -v $vm && cut -b$CUT_MAX- /dev/null > err 2>&1) || fail=1
# Up to and including coreutils-8.21, cut would allocate possibly needed
# memory upfront. Subsequently extra memory is no longer needed.
-(ulimit -v $vm && : | cut -b1-$CUT_MAX >> err 2>&1) || fail=1
+(ulimit -v $vm && cut -b1-$CUT_MAX /dev/null >> err 2>&1) || fail=1
# Explicitly disallow values above CUT_MAX
-(ulimit -v $vm && : | returns_ 1 cut -b$SIZE_MAX 2>/dev/null) || fail=1
-(ulimit -v $vm && : | returns_ 1 cut -b$SIZE_OFLOW 2>/dev/null) || fail=1
+(ulimit -v $vm && returns_ 1 cut -b$SIZE_MAX /dev/null 2>/dev/null) || fail=1
+(ulimit -v $vm && returns_ 1 cut -b$SIZE_OFLOW /dev/null 2>/dev/null) || fail=1
compare /dev/null err || fail=1