summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/ksh/emacs.c8
-rw-r--r--bin/ksh/eval.c34
-rw-r--r--bin/ksh/misc.c4
-rw-r--r--bin/ksh/proto.h4
-rw-r--r--bin/ksh/var.c7
5 files changed, 32 insertions, 25 deletions
diff --git a/bin/ksh/emacs.c b/bin/ksh/emacs.c
index feaeb7f9159..392b0246fe1 100644
--- a/bin/ksh/emacs.c
+++ b/bin/ksh/emacs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: emacs.c,v 1.18 2003/02/28 09:45:09 jmc Exp $ */
+/* $OpenBSD: emacs.c,v 1.19 2003/04/16 23:11:52 tdeval Exp $ */
/*
* Emacs-like command line editing and history
@@ -886,9 +886,9 @@ x_load_hist(hp)
}
x_histp = hp;
oldsize = x_size_str(xbuf);
- (void)strcpy(xbuf, *hp);
+ strlcpy(xbuf, *hp, xend - xbuf);
xbp = xbuf;
- xep = xcp = xbuf + strlen(*hp);
+ xep = xcp = xbuf + strlen(xbuf);
xlp_valid = FALSE;
if (xep > x_lastcp())
x_goto(xep);
@@ -1022,7 +1022,7 @@ x_del_line(c)
int i, j;
*xep = 0;
- i = xep- xbuf;
+ i = xep - xbuf;
j = x_size_str(xbuf);
xcp = xbuf;
x_push(i);
diff --git a/bin/ksh/eval.c b/bin/ksh/eval.c
index 2a0990ae26e..8f998cf2283 100644
--- a/bin/ksh/eval.c
+++ b/bin/ksh/eval.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eval.c,v 1.12 2003/03/10 03:48:16 david Exp $ */
+/* $OpenBSD: eval.c,v 1.13 2003/04/16 23:11:52 tdeval Exp $ */
/*
* Expansion - quoting, separation, substitution, globbing
@@ -175,6 +175,7 @@ expand(cp, wp, f)
int UNINITIALIZED(newlines); /* For trailing newlines in COMSUB */
int saw_eq, tilde_ok;
int make_magic;
+ size_t len;
if (cp == NULL)
internal_errorf(1, "expand(NULL)");
@@ -415,10 +416,11 @@ expand(cp, wp, f)
* fatal for special builtins (setstr
* does readonly check).
*/
- setstr(st->var, debunk(
- (char *) alloc(strlen(dp) + 1,
- ATEMP), dp),
- KSH_UNWIND_ERROR);
+ len = strlen(dp) + 1;
+ setstr(st->var,
+ debunk((char *) alloc(len, ATEMP),
+ dp, len),
+ KSH_UNWIND_ERROR);
x.str = str_val(st->var);
type = XSUB;
if (f&DOBLANK)
@@ -432,7 +434,7 @@ expand(cp, wp, f)
errorf("%s: %s", st->var->name,
dp == s ?
"parameter null or not set"
- : (debunk(s, s), s));
+ : (debunk(s, s, strlen(s) + 1), s));
}
}
st = st->prev;
@@ -576,7 +578,7 @@ expand(cp, wp, f)
else if ((f & DOPAT) || !(fdo & DOMAGIC_))
XPput(*wp, p);
else
- XPput(*wp, debunk(p, p));
+ XPput(*wp, debunk(p, p, strlen(p) + 1));
fdo = 0;
saw_eq = 0;
tilde_ok = (f & (DOTILDE|DOASNTILDE)) ? 1 : 0;
@@ -950,7 +952,7 @@ glob(cp, wp, markdirs)
int oldsize = XPsize(*wp);
if (glob_str(cp, wp, markdirs) == 0)
- XPput(*wp, debunk(cp, cp));
+ XPput(*wp, debunk(cp, cp, strlen(cp) + 1));
else
qsortp(XPptrv(*wp) + oldsize, (size_t)(XPsize(*wp) - oldsize),
xstrcmp);
@@ -1085,7 +1087,7 @@ globit(xs, xpp, sp, wp, check)
*/
if (!has_globbing(sp, se)) {
XcheckN(*xs, xp, se - sp + 1);
- debunk(xp, sp);
+ debunk(xp, sp, Xnleft(*xs, xp));
xp += strlen(xp);
*xpp = xp;
globit(xs, xpp, np, wp, check);
@@ -1174,15 +1176,18 @@ copy_non_glob(xs, xpp, p)
/* remove MAGIC from string */
char *
-debunk(dp, sp)
+debunk(dp, sp, dlen)
char *dp;
const char *sp;
+ size_t dlen;
{
char *d, *s;
if ((s = strchr(sp, MAGIC))) {
+ if (s - sp >= dlen)
+ return dp;
memcpy(dp, sp, s - sp);
- for (d = dp + (s - sp); *s; s++)
+ for (d = dp + (s - sp); *s && (d - dp < dlen); s++)
if (!ISMAGIC(*s) || !(*++s & 0x80)
|| !strchr("*+?@! ", *s & 0x7f))
*d++ = *s;
@@ -1190,11 +1195,12 @@ debunk(dp, sp)
/* extended pattern operators: *+?@! */
if ((*s & 0x7f) != ' ')
*d++ = *s & 0x7f;
- *d++ = '(';
+ if (d - dp < dlen)
+ *d++ = '(';
}
*d = '\0';
} else if (dp != sp)
- strcpy(dp, sp);
+ strlcpy(dp, sp, dlen);
return dp;
}
@@ -1337,7 +1343,7 @@ alt_expand(wp, start, exp_start, end, fdo)
if (fdo & DOGLOB)
glob(start, wp, fdo & DOMARKDIRS);
else
- XPput(*wp, debunk(start, start));
+ XPput(*wp, debunk(start, start, end - start));
return;
}
brace_end = p;
diff --git a/bin/ksh/misc.c b/bin/ksh/misc.c
index bf0149591bf..dbbc22268e0 100644
--- a/bin/ksh/misc.c
+++ b/bin/ksh/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.15 2003/04/04 23:12:02 deraadt Exp $ */
+/* $OpenBSD: misc.c,v 1.16 2003/04/16 23:11:52 tdeval Exp $ */
/*
* Miscellaneous functions
@@ -542,7 +542,7 @@ gmatch(s, p, isfile)
char tbuf[64];
char *t = len <= sizeof(tbuf) ? tbuf
: (char *) alloc(len, ATEMP);
- debunk(t, p);
+ debunk(t, p, len);
return !strcmp(t, s);
}
return do_gmatch((const unsigned char *) s, (const unsigned char *) se,
diff --git a/bin/ksh/proto.h b/bin/ksh/proto.h
index 7a7c9a80dcb..42a0427aa50 100644
--- a/bin/ksh/proto.h
+++ b/bin/ksh/proto.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: proto.h,v 1.9 2001/02/19 09:49:54 camield Exp $ */
+/* $OpenBSD: proto.h,v 1.10 2003/04/16 23:11:52 tdeval Exp $ */
/*
* prototypes for PD-KSH
@@ -62,7 +62,7 @@ char * substitute ARGS((const char *cp, int f));
char ** eval ARGS((char **ap, int f));
char * evalstr ARGS((char *cp, int f));
char * evalonestr ARGS((char *cp, int f));
-char *debunk ARGS((char *dp, const char *sp));
+char *debunk ARGS((char *dp, const char *sp, size_t dlen));
void expand ARGS((char *cp, XPtrV *wp, int f));
int glob_str ARGS((char *cp, XPtrV *wp, int markdirs));
/* exec.c */
diff --git a/bin/ksh/var.c b/bin/ksh/var.c
index 98faa2cacc4..b6ee7ebf009 100644
--- a/bin/ksh/var.c
+++ b/bin/ksh/var.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: var.c,v 1.13 2003/03/13 09:03:07 deraadt Exp $ */
+/* $OpenBSD: var.c,v 1.14 2003/04/16 23:11:52 tdeval Exp $ */
#include "sh.h"
#include "ksh_time.h"
@@ -1132,6 +1132,7 @@ arraysearch(vp, val)
int val;
{
struct tbl *prev, *curr, *new;
+ size_t namelen = strlen(vp->name) + 1;
vp->flag |= ARRAY|DEFINED;
@@ -1152,9 +1153,9 @@ arraysearch(vp, val)
else
new = curr;
} else
- new = (struct tbl *)alloc(sizeof(struct tbl)+strlen(vp->name)+1,
+ new = (struct tbl *)alloc(sizeof(struct tbl) + namelen,
vp->areap);
- strcpy(new->name, vp->name);
+ strlcpy(new->name, vp->name, namelen);
new->flag = vp->flag & ~(ALLOC|DEFINED|ISSET|SPECIAL);
new->type = vp->type;
new->areap = vp->areap;