summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--include/version.h2
-rw-r--r--lib/emptydirs87
-rw-r--r--lib/proto/inferno7
-rw-r--r--libinterp/keyring.c157
-rw-r--r--mkfile13
6 files changed, 191 insertions, 78 deletions
diff --git a/CHANGES b/CHANGES
index 8c19d2a4..13279ed2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+20090805
+ further checking added to libinterp/keyring.c: rejects incorrect states and out of bounds values of f->n
+ add lib/emptydirs and mkdirs target to /mkfile (utils/mkdir needs to be changed for Windows use)
20090730
improve the error checking in strtosk and strtopk to help detect mangled or inappropriate keys
20090728
diff --git a/include/version.h b/include/version.h
index 23d57f5d..b50522e6 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define VERSION "Fourth Edition (20090730)"
+#define VERSION "Fourth Edition (20090805)"
diff --git a/lib/emptydirs b/lib/emptydirs
new file mode 100644
index 00000000..376b60b1
--- /dev/null
+++ b/lib/emptydirs
@@ -0,0 +1,87 @@
+FreeBSD/386/lib
+Hp
+Hp/s800
+Hp/s800/bin
+Hp/s800/include
+Hp/s800/lib
+Inferno/386/bin
+Inferno/arm/bin
+Inferno/mips/bin
+Inferno/mips/lib
+Inferno/power/bin
+Inferno/power/lib
+Inferno/sparc/bin
+Inferno/sparc/lib
+Inferno/thumb/bin
+Inferno/thumb/lib
+Irix/mips/lib
+Linux/386/lib
+Linux/arm/bin
+Linux/arm/lib
+MacOSX/386/lib
+MacOSX/power/lib
+NetBSD/386/lib
+Nt/386/lib
+OpenBSD/386/bin
+OpenBSD/386/lib
+OpenBSD/arm/bin
+OpenBSD/arm/lib
+Plan9/386/lib
+Plan9/mips/bin
+Plan9/mips/lib
+Plan9/power/bin
+Plan9/power/lib
+Plan9/sparc/bin
+Plan9/sparc/lib
+Solaris/sparc/lib
+keydb/countersigned
+keydb/countersigned
+keydb/signed
+keydb/signed
+mail
+man/lib/man
+man/lib/permind
+mnt
+mnt/9win
+mnt/acme
+mnt/arch
+mnt/diary
+mnt/factotum
+mnt/gossip
+mnt/icontact
+mnt/ilog
+mnt/incall
+mnt/isubs
+mnt/itrack
+mnt/keys
+mnt/keysrv
+mnt/quiz
+mnt/registry
+mnt/rstyxreg
+mnt/schedule
+mnt/vmail
+mnt/wm
+mnt/wrap
+mnt/wsys
+n
+n/cd
+n/client
+n/client/chan
+n/client/dev
+n/disk
+n/dist
+n/dump
+n/ftp
+n/gridfs
+n/kfs
+n/local
+n/rdbg
+n/registry
+n/remote
+services/logs
+services/ppp
+src
+tmp
+usr/inferno/charon
+usr/inferno/keyring
+usr/inferno/tmp
diff --git a/lib/proto/inferno b/lib/proto/inferno
index f020a7ec..6466a2e6 100644
--- a/lib/proto/inferno
+++ b/lib/proto/inferno
@@ -2042,21 +2042,20 @@ keydb
keys 600 inferno inferno /keydb/keys.dist
signed
lib
- legal
- *
acid
+
- brutus
- +
convcs
+
ebook
+
ebooks
+
+ emptydirs
games
+
keyboard
+ legal
+ *
lego
*
mashinit
diff --git a/libinterp/keyring.c b/libinterp/keyring.c
index 6b44c16d..56971cf4 100644
--- a/libinterp/keyring.c
+++ b/libinterp/keyring.c
@@ -11,11 +11,6 @@
#include "../libkeyring/keys.h"
-enum {
- PSEUDO=0,
- REALLY,
-};
-
Type *TSigAlg;
Type *TCertificate;
Type *TSK;
@@ -80,6 +75,7 @@ static char exBadBsize[] = "data not multiple of block size";
static char exBadKey[] = "bad encryption key";
static char exBadDigest[] = "bad digest value";
static char exBadIvec[] = "bad ivec";
+static char exBadState[] = "bad encryption state";
typedef struct XBFstate XBFstate;
@@ -591,10 +587,12 @@ Keyring_sktopk(void *fp)
PK *pk;
SigAlg *sa;
SK *sk;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
sk = checkSK(f->sk);
sa = checkSigAlg(sk->x.sa);
@@ -882,10 +880,12 @@ void
Keyring_strtocert(void *fp)
{
F_Keyring_strtocert *f;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
*f->ret = (Keyring_Certificate*)strtocert(string2c(f->s));
}
@@ -1170,6 +1170,23 @@ Keyring_verifym(void *fp)
acquire();
}
+static void*
+checktype(void *v, Type *t, char *name, int newref)
+{
+ Heap *h;
+
+ if(v == H || v == nil)
+ error(exNilref);
+ h = D2H(v);
+ if(h->t != t)
+ errorf("%s: %s", exType, name);
+ if(newref){
+ h->ref++;
+ Setmark(h);
+ }
+ return v;
+}
+
/*
* digests
*/
@@ -1178,7 +1195,7 @@ DigestState_copy(void *fp)
{
F_DigestState_copy *f;
Heap *h;
- XDigestState *ds;
+ XDigestState *ds, *ods;
void *r;
f = fp;
@@ -1187,9 +1204,10 @@ DigestState_copy(void *fp)
destroy(r);
if(f->d != H){
+ ods = checktype(f->d, TDigestState, "DigestState", 0);
h = heap(TDigestState);
ds = H2D(XDigestState*, h);
- memmove(&ds->state, &((XDigestState*)f->d)->state, sizeof(ds->state));
+ memmove(&ds->state, &ods->state, sizeof(ds->state));
*f->ret = (Keyring_DigestState*)ds;
}
}
@@ -1222,10 +1240,8 @@ keyring_digest_x(Array *buf, int n, Array *digest, int dlen, Keyring_DigestState
h = heap(TDigestState);
ds = H2D(XDigestState*, h);
memset(&ds->state, 0, sizeof(ds->state));
- } else {
- D2H(state)->ref++;
- ds = (XDigestState*)state;
- }
+ } else
+ ds = checktype(state, TDigestState, "DigestState", 1);
(*fn)(cbuf, n, cdigest, &ds->state);
@@ -1305,10 +1321,8 @@ keyring_hmac_x(Array *data, int n, Array *key, Array *digest, int dlen, Keyring_
h = heap(TDigestState);
ds = H2D(XDigestState*, h);
memset(&ds->state, 0, sizeof(ds->state));
- } else {
- D2H(state)->ref++;
- ds = (XDigestState*)state;
- }
+ } else
+ ds = checktype(state, TDigestState, "DigestState", 1);
(*fn)(cdata, n, key->data, key->len, cdigest, &ds->state);
@@ -1394,9 +1408,9 @@ Keyring_sendmsg(void *fp)
*f->ret = -1;
if(f->fd == H || f->buf == H || f->n < 0)
return;
- n = f->buf->len;
- if(n > f->n)
- n = f->n;
+ n = f->n;
+ if(n < 0 || n > f->buf->len)
+ error(exBounds);
*f->ret = sendmsg(f->fd->fd, f->buf->data, n);
}
@@ -1515,10 +1529,12 @@ Keyring_getmsg(void *fp)
F_Keyring_getmsg *f;
char *buf;
int n;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
if(f->fd == H){
kwerrstr("nil fd");
return;
@@ -1944,10 +1960,12 @@ Keyring_readauthinfo(void *fp)
SigAlg *sa;
Keyring_Authinfo *ai;
mpint *b;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
ok = 0;
@@ -2013,8 +2031,9 @@ Keyring_readauthinfo(void *fp)
ok = 1;
out:
if(!ok){
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
}
free(buf);
if(fd >= 0){
@@ -2239,8 +2258,8 @@ Keyring_putbytearray(void *fp)
if(f->fd == H || f->a == H)
return;
n = f->n;
- if(n > f->a->len)
- n = f->a->len;
+ if(n < 0 || n > f->a->len)
+ error(exBounds);
*f->ret = putbuf(f->fd->fd, f->a->data, n);
}
@@ -2251,10 +2270,12 @@ Keyring_dessetup(void *fp)
Heap *h;
XDESstate *ds;
uchar *ivec;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
if(f->key == H || f->key->len < 8)
error(exBadKey);
@@ -2279,20 +2300,17 @@ Keyring_desecb(void *fp)
XDESstate *ds;
int i;
uchar *p;
- /* uchar tmp[8]; */
f = fp;
- if(f->state == (Keyring_DESstate*)H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
if(f->n & 7)
error(exBadBsize);
- ds = (XDESstate*)f->state;
+ ds = checktype(f->state, TDESstate, exBadState, 0);
p = f->buf->data;
for(i = 8; i <= f->n; i += 8, p += 8)
@@ -2309,16 +2327,14 @@ Keyring_descbc(void *fp)
f = fp;
- if(f->state == H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
if(f->n & 7)
error(exBadBsize);
- ds = (XDESstate*)f->state;
+ ds = checktype(f->state, TDESstate, exBadState, 0);
p = f->buf->data;
if(f->direction == 0){
@@ -2351,10 +2367,12 @@ Keyring_ideasetup(void *fp)
Heap *h;
XIDEAstate *is;
uchar *ivec;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
if(f->key == H || f->key->len < 16)
error(exBadKey);
@@ -2380,20 +2398,17 @@ Keyring_ideaecb(void *fp)
XIDEAstate *is;
int i;
uchar *p;
- /* uchar tmp[8]; */
f = fp;
- if(f->state == H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
if(f->n & 7)
error(exBadBsize);
- is = (XIDEAstate*)f->state;
+ is = checktype(f->state, TIDEAstate, exBadState, 0);
p = f->buf->data;
for(i = 8; i <= f->n; i += 8, p += 8)
@@ -2410,16 +2425,14 @@ Keyring_ideacbc(void *fp)
f = fp;
- if(f->state == H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
if(f->n & 7)
error(exBadBsize);
- is = (XIDEAstate*)f->state;
+ is = checktype(f->state, TIDEAstate, exBadState, 0);
p = f->buf->data;
if(f->direction == 0){
@@ -2452,10 +2465,12 @@ Keyring_aessetup(void *fp)
Heap *h;
XAESstate *is;
uchar *ivec;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
if(f->key == H ||
f->key->len != 16 && f->key->len != 24 && f->key->len != 32)
@@ -2484,14 +2499,12 @@ Keyring_aescbc(void *fp)
f = fp;
- if(f->state == H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
- is = (XAESstate*)f->state;
+ is = checktype(f->state, TAESstate, exBadState, 0);
p = f->buf->data;
if(f->direction == 0)
@@ -2507,10 +2520,12 @@ Keyring_blowfishsetup(void *fp)
Heap *h;
XBFstate *is;
uchar *ivec;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
if(f->key == H || f->key->len <= 0)
error(exBadKey);
@@ -2538,14 +2553,14 @@ Keyring_blowfishcbc(void *fp)
f = fp;
- if(f->state == H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
+ if(f->n & 7)
+ error(exBadBsize);
- is = (XBFstate*)f->state;
+ is = checktype(f->state, TBFstate, exBadState, 0);
p = f->buf->data;
if(f->direction == 0)
@@ -2560,10 +2575,12 @@ Keyring_rc4setup(void *fp)
F_Keyring_rc4setup *f;
Heap *h;
XRC4state *is;
+ void *r;
f = fp;
- destroy(*f->ret);
+ r = *f->ret;
*f->ret = H;
+ destroy(r);
if(f->seed == H)
return;
@@ -2584,13 +2601,11 @@ Keyring_rc4(void *fp)
uchar *p;
f = fp;
- if(f->state == H)
- return;
if(f->buf == H)
return;
- if(f->buf->len < f->n)
- f->n = f->buf->len;
- is = (XRC4state*)f->state;
+ if(f->n < 0 || f->n > f->buf->len)
+ error(exBounds);
+ is = checktype(f->state, TRC4state, exBadState, 0);
p = f->buf->data;
rc4(&is->state, p, f->n);
}
@@ -2602,9 +2617,7 @@ Keyring_rc4skip(void *fp)
XRC4state *is;
f = fp;
- if(f->state == H)
- return;
- is = (XRC4state*)f->state;
+ is = checktype(f->state, TRC4state, exBadState, 0);
rc4skip(&is->state, f->n);
}
@@ -2615,9 +2628,7 @@ Keyring_rc4back(void *fp)
XRC4state *is;
f = fp;
- if(f->state == H)
- return;
- is = (XRC4state*)f->state;
+ is = checktype(f->state, TRC4state, exBadState, 0);
rc4back(&is->state, f->n);
}
diff --git a/mkfile b/mkfile
index f8bed896..62d928a9 100644
--- a/mkfile
+++ b/mkfile
@@ -172,3 +172,16 @@ Nt-% nt-% Win95-% win95-%:V:
Solaris-% solaris-%:V:
mk 'SYSHOST=Solaris' 'OBJTYPE=sparc' $stem
+
+mkdirs:V: mkdirs-$SHELLTYPE
+
+mkdirs-rc:V:
+ mkdir -p `{cat lib/emptydirs}
+ chmod 555 mnt/* n/client/* n/*
+
+mkdirs-sh:V:
+ mkdir -p `cat lib/emptydirs`
+ chmod 555 mnt/* n/client/* n/*
+
+mkdirs-rcsh:V:
+ mkdir -p `{cat lib/emptydirs}