1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
* Apply patches from PLD distribution (pdksh-5.2.14-23.src.rpm)
+ pdksh-eval-segv.patch, fixes one more segfault bug
+ pdksh-rlimit_locks.patch, adds flocks support to ulimit.
* c_ulimit.c: enclose all uses of RLIMIT_LOCKS with appropriate #ifdefs
(closes: #307323).
Index: pdksh-5.2.14/c_sh.c
===================================================================
--- pdksh-5.2.14.orig/c_sh.c 2008-04-15 20:49:47.000000000 +0200
+++ pdksh-5.2.14/c_sh.c 2008-04-15 20:50:48.000000000 +0200
@@ -422,7 +422,8 @@
c_eval(wp)
char **wp;
{
- register struct source *s;
+ register struct source *s,*olds=source;
+ int retval;
if (ksh_getopt(wp, &builtin_opt, null) == '?')
return 1;
@@ -456,7 +457,9 @@
exstat = subst_exstat;
}
- return shell(s, FALSE);
+ retval=shell(s, FALSE);
+ source=olds;
+ return retval;
}
int
Index: pdksh-5.2.14/c_ulimit.c
===================================================================
--- pdksh-5.2.14.orig/c_ulimit.c 2008-04-15 20:46:56.000000000 +0200
+++ pdksh-5.2.14/c_ulimit.c 2008-04-15 20:50:48.000000000 +0200
@@ -111,6 +111,9 @@
#ifdef RLIMIT_SWAP
{ "swap(kbytes)", RLIMIT_SWAP, RLIMIT_SWAP, 1024, 'w' },
#endif
+#ifdef RLIMIT_LOCKS
+ { "flocks", RLIMIT, RLIMIT_LOCKS, RLIMIT_LOCKS, -1, 'L' },
+#endif
{ (char *) 0 }
};
static char options[3 + NELEM(limits)];
@@ -189,7 +192,18 @@
for (l = limits; l->name; l++) {
#ifdef HAVE_SETRLIMIT
if (l->which == RLIMIT) {
- getrlimit(l->gcmd, &limit);
+ int getreturn;
+
+ getreturn=getrlimit(l->gcmd, &limit);
+#ifdef RLIMIT_LOCKS
+ if ( getreturn < 0 ) {
+ if ( ( errno == EINVAL ) &&
+ ( l->gcmd == RLIMIT_LOCKS ) ) {
+ limit.rlim_cur = RLIM_INFINITY;
+ limit.rlim_max = RLIM_INFINITY;
+ }
+ }
+#endif
if (how & SOFT)
val = limit.rlim_cur;
else if (how & HARD)
@@ -225,11 +239,17 @@
if (how & HARD)
limit.rlim_max = val;
if (setrlimit(l->scmd, &limit) < 0) {
- if (errno == EPERM)
+ if (errno == EPERM) {
bi_errorf("exceeds allowable limit");
- else
+#ifdef RLIMIT_LOCKS
+ } else if ( ( errno == EINVAL ) &&
+ ( l->scmd == RLIMIT_LOCKS ) ) {
+ bi_errorf("unable to set it on the current kernel");
+#endif
+ } else {
bi_errorf("bad limit: %s",
strerror(errno));
+ }
return 1;
}
} else {
|