summaryrefslogtreecommitdiff
path: root/emu
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2007-01-23 09:36:04 +0000
committerCharles.Forsyth <devnull@localhost>2007-01-23 09:36:04 +0000
commit95028768b488f6878c9f26978d56aeb54fb5cf1e (patch)
treeb7ba04789e06dfa15a72fa59029c0c9fe6422d72 /emu
parented8b7fd462e0202888a27ee1972409c52dec7d01 (diff)
check length in devenv.c
Diffstat (limited to 'emu')
-rw-r--r--emu/port/devenv.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/emu/port/devenv.c b/emu/port/devenv.c
index 104d6344..9f56ce7d 100644
--- a/emu/port/devenv.c
+++ b/emu/port/devenv.c
@@ -5,6 +5,12 @@
#include "fns.h"
#include "error.h"
+enum
+{
+ Maxenvlen= 16*1024-1,
+};
+
+
static void envremove(Chan*);
static int
@@ -168,12 +174,15 @@ static long
envwrite(Chan *c, void *a, long n, vlong offset)
{
char *s;
- int ve;
+ ulong ve;
Egrp *eg;
Evalue *e;
if(n <= 0)
return 0;
+ ve = offset+n;
+ if(ve > Maxenvlen)
+ error(Etoobig);
eg = up->env->egrp;
qlock(&eg->l);
for(e = eg->entries; e != nil; e = e->next)
@@ -183,7 +192,6 @@ envwrite(Chan *c, void *a, long n, vlong offset)
qunlock(&eg->l);
error(Enonexist);
}
- ve = offset+n;
if(ve > e->len) {
s = smalloc(ve);
memmove(s, e->val, e->len);