summaryrefslogtreecommitdiff
path: root/system/pdksh/patches/113_OpenBSD-memory.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/pdksh/patches/113_OpenBSD-memory.patch')
-rw-r--r--system/pdksh/patches/113_OpenBSD-memory.patch148
1 files changed, 148 insertions, 0 deletions
diff --git a/system/pdksh/patches/113_OpenBSD-memory.patch b/system/pdksh/patches/113_OpenBSD-memory.patch
new file mode 100644
index 0000000000..79e7b59833
--- /dev/null
+++ b/system/pdksh/patches/113_OpenBSD-memory.patch
@@ -0,0 +1,148 @@
+From OpenBSD:
+
+2009-04-19 22:34 sthen
+
+ * misc.c (1.37): don't print extraneous padding characters when
+ tab-completion file/command lists encounter a name too long for
+ the width of the terminal.
+
+ from Matthew Haub, no objections krw@.
+
+2008-08-11 23:50 jaredy
+
+ * tree.c (1.19): plug a memleak when freeing io redirection in
+ commands. the leaked memory is actually reclaimed when the
+ command finishes but may grow until that happens, e.g. during
+ command execution.
+
+ ok phessler@. testing sobrado@ jmc@ oga@.
+
+2008-07-23 18:34 jaredy
+
+ * c_sh.c (1.38), syn.c (1.28): fix stack abuse in the `time'
+ commmand, using alloc()'d memory instead.
+
+ reported by Thorsten Glaser, thanks.
+
+ ok millert@, earlier version miod@
+
+2008-07-21 19:30 millert
+
+ * alloc.c (1.8): Extra sanity checking for afree(); OK deraadt@
+ and pvalchev@
+
+2008-07-12 14:33 miod
+
+ * misc.c (1.34): Fix a strlcpy() bound.
+
+
+
+Index: pdksh-5.2.14/tree.c
+===================================================================
+--- pdksh-5.2.14.orig/tree.c 2009-09-19 11:22:37.000000000 +0200
++++ pdksh-5.2.14/tree.c 2009-09-19 12:06:43.000000000 +0200
+@@ -755,4 +755,5 @@
+ afree((void*)p->heredoc, ap);
+ afree((void*)p, ap);
+ }
++ afree(iow, ap);
+ }
+Index: pdksh-5.2.14/syn.c
+===================================================================
+--- pdksh-5.2.14.orig/syn.c 2009-09-19 11:22:37.000000000 +0200
++++ pdksh-5.2.14/syn.c 2009-09-19 12:06:43.000000000 +0200
+@@ -375,6 +375,11 @@
+ case TIME:
+ syniocf &= ~(KEYWORD|ALIAS);
+ t = pipeline(0);
++ if (t) {
++ t->str = alloc(2, ATEMP);
++ t->str[0] = '\0'; /* TF_* flags */
++ t->str[1] = '\0';
++ }
+ t = block(TTIME, t, NOBLOCK, NOWORDS);
+ break;
+
+Index: pdksh-5.2.14/alloc.c
+===================================================================
+--- pdksh-5.2.14.orig/alloc.c 2009-09-19 11:22:37.000000000 +0200
++++ pdksh-5.2.14/alloc.c 2009-09-19 12:06:43.000000000 +0200
+@@ -894,13 +894,20 @@
+ void
+ afree(void *ptr, Area *ap)
+ {
+- struct link *l;
++ struct link *l, *l2;
+
+ if (!ptr)
+ return;
+
+ l = P2L(ptr);
+
++ for (l2 = ap->freelist; l2 != NULL; l2 = l2->next) {
++ if (l == l2)
++ break;
++ }
++ if (l2 == NULL)
++ internal_errorf(1, "afree: %p not present in area %p", ptr, ap);
++
+ if (l->prev)
+ l->prev->next = l->next;
+ else
+Index: pdksh-5.2.14/c_sh.c
+===================================================================
+--- pdksh-5.2.14.orig/c_sh.c 2009-09-19 11:55:01.000000000 +0200
++++ pdksh-5.2.14/c_sh.c 2009-09-19 12:06:43.000000000 +0200
+@@ -738,7 +738,6 @@
+ clock_t t0t, t1t = 0;
+ int tf = 0;
+ extern clock_t j_usrtime, j_systime; /* computed by j_wait */
+- char opts[1];
+
+ t0t = ksh_times(&t0);
+ if (t->left) {
+@@ -751,11 +750,9 @@
+ * really work as it only counts the last job).
+ */
+ j_usrtime = j_systime = 0;
+- if (t->left->type == TCOM)
+- t->left->str = opts;
+- opts[0] = 0;
+ rv = execute(t->left, f | XTIME, xerrok);
+- tf |= opts[0];
++ if (t->left->type == TCOM)
++ tf |= t->left->str[0];
+ t1t = ksh_times(&t1);
+ } else
+ tf = TF_NOARGS;
+Index: pdksh-5.2.14/misc.c
+===================================================================
+--- pdksh-5.2.14.orig/misc.c 2009-09-19 11:22:37.000000000 +0200
++++ pdksh-5.2.14/misc.c 2009-09-19 12:06:43.000000000 +0200
+@@ -1123,6 +1123,7 @@
+ int r, c;
+ int rows, cols;
+ int nspace;
++ int col_width;
+
+ /* max_width + 1 for the space. Note that no space
+ * is printed after the last column to avoid problems
+@@ -1141,6 +1142,9 @@
+ rows = n;
+ }
+
++ col_width = max_width;
++ if (cols == 1)
++ col_width = 0; /* Don't pad entries in single column output. */
+ nspace = (x_cols - max_width * cols) / cols;
+ if (nspace <= 0)
+ nspace = 1;
+@@ -1149,7 +1153,7 @@
+ i = c * rows + r;
+ if (i < n) {
+ shf_fprintf(shf, "%-*s",
+- max_width,
++ col_width,
+ (*func)(arg, i, str, max_width + 1));
+ if (c + 1 < cols)
+ shf_fprintf(shf, "%*s", nspace, null);