summaryrefslogtreecommitdiff
path: root/system/pdksh/patches/020_PLD-patches.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/pdksh/patches/020_PLD-patches.patch')
-rw-r--r--system/pdksh/patches/020_PLD-patches.patch84
1 files changed, 84 insertions, 0 deletions
diff --git a/system/pdksh/patches/020_PLD-patches.patch b/system/pdksh/patches/020_PLD-patches.patch
new file mode 100644
index 0000000000..81c189f243
--- /dev/null
+++ b/system/pdksh/patches/020_PLD-patches.patch
@@ -0,0 +1,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 {