1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-01-20 11:51:24 +01:00

27566: add ulimit -c hard and immediate return on argument error

This commit is contained in:
Peter Stephenson 2010-01-05 16:29:35 +00:00
parent de4dac8874
commit f80bc2b5f6
3 changed files with 35 additions and 14 deletions

View file

@ -1,5 +1,8 @@
2010-01-05 Peter Stephenson <pws@csr.com>
* 27566: Src/Builtins/rlimits.c: add ulimit -c hard and immediate
return on argument error
* 27565: Src/Builtins/rlimits.c: ulimit didn't sanity check
numeric arguments.
@ -12542,5 +12545,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.4853 $
* $Revision: 1.4854 $
*****************************************************

View file

@ -1710,13 +1710,18 @@ cindex(limits, resource)
item(tt(ulimit) [ [ tt(-SHacdfilmnpqstvx) | tt(-N) var(resource) [ var(limit) ] ... ])(
Set or display resource limits of the shell and the processes started by
the shell. The value of var(limit) can be a number in the unit specified
below or the value `tt(unlimited)'. By default, only soft limits are
manipulated. If the tt(-H) flag is given use
hard limits instead of soft limits. If the tt(-S) flag is given
together with the tt(-H) flag set both hard and soft limits. If no
options are used, the file size limit (tt(-f)) is assumed. If
var(limit) is omitted the current value of the specified resources are
printed. When more than one resource values are printed the limit name and
below or one of the values `tt(unlimited)', which removes the limit on the
resource, or `tt(hard)', which uses the current value of the hard limit on
the resource.
By default, only soft limits are manipulated. If the tt(-H) flag
is given use hard limits instead of soft limits. If the tt(-S) flag is given
together with the tt(-H) flag set both hard and soft limits.
If no options are used, the file size limit (tt(-f)) is assumed.
If var(limit) is omitted the current value of the specified resources are
printed. When more than one resource value is printed, the limit name and
unit is printed before each value.
When looping over multiple resources, the shell will abort immediately if

View file

@ -836,11 +836,24 @@ bin_ulimit(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
/* set limit to specified value */
rlim_t limit;
if (!strcmp(*argv, "hard")) {
struct rlimit vals;
if (getrlimit(res, &vals) < 0)
{
zwarnnam(name, "can't read limit: %e", errno);
return 1;
}
else
{
limit = vals.rlim_max;
}
} else {
limit = zstrtorlimt(*argv, &eptr, 10);
if (*eptr) {
zwarnnam(name, "invalid number: %s", *argv);
ret++;
} else {
return 1;
}
/* scale appropriately */
switch (res) {
case RLIMIT_FSIZE:
@ -870,9 +883,9 @@ bin_ulimit(char *name, char **argv, UNUSED(Options ops), UNUSED(int func))
limit *= 1024;
break;
}
}
if (do_limit(name, res, limit, hard, soft, 1))
ret++;
}
} else {
if (do_unlimit(name, res, hard, soft, 1, geteuid()))
ret++;