diff --git a/src/libdraw/creadimage.c b/src/libdraw/creadimage.c
index 99c4275..16dcd1e 100644
--- a/src/libdraw/creadimage.c
+++ b/src/libdraw/creadimage.c
@@ -54,14 +54,20 @@
 		return nil;
 	}
 
-	if(dolock)
-		lockdisplay(d);
-	i = allocimage(d, r, chan, 0, 0);
-	if(dolock)
-		unlockdisplay(d);
-	if(i == nil)
-		return nil;
-	ncblock = _compblocksize(r, i->depth);
+	if(d){
+		if(dolock)
+			lockdisplay(d);
+		i = allocimage(d, r, chan, 0, 0);
+		if(dolock)
+			unlockdisplay(d);
+		if(i == nil)
+			return nil;
+	}else{
+		i = mallocz(sizeof(Image), 1);
+		if(i == nil)
+			return nil;
+	}
+	ncblock = _compblocksize(r, chantodepth(chan));
 	buf = malloc(ncblock);
 	if(buf == nil)
 		goto Errout;
@@ -90,22 +96,24 @@
 		}
 		if(readn(fd, buf, nb)!=nb)
 			goto Errout;
-		if(dolock)
-			lockdisplay(d);
-		a = bufimage(i->display, 21+nb);
-		if(a == nil)
-			goto Erroutlock;
-		a[0] = 'Y';
-		BPLONG(a+1, i->id);
-		BPLONG(a+5, r.min.x);
-		BPLONG(a+9, miny);
-		BPLONG(a+13, r.max.x);
-		BPLONG(a+17, maxy);
-		if(!new)	/* old image: flip the data bits */
-			_twiddlecompressed(buf, nb);
-		memmove(a+21, buf, nb);
-		if(dolock)
-			unlockdisplay(d);
+		if(d){
+			if(dolock)
+				lockdisplay(d);
+			a = bufimage(i->display, 21+nb);
+			if(a == nil)
+				goto Erroutlock;
+			a[0] = 'Y';
+			BPLONG(a+1, i->id);
+			BPLONG(a+5, r.min.x);
+			BPLONG(a+9, miny);
+			BPLONG(a+13, r.max.x);
+			BPLONG(a+17, maxy);
+			if(!new)	/* old image: flip the data bits */
+				_twiddlecompressed(buf, nb);
+			memmove(a+21, buf, nb);
+			if(dolock)
+				unlockdisplay(d);
+		}
 		miny = maxy;
 	}
 	free(buf);
diff --git a/src/libdraw/font.c b/src/libdraw/font.c
index 9feffa4..d7a9354 100644
--- a/src/libdraw/font.c
+++ b/src/libdraw/font.c
@@ -161,7 +161,8 @@
 		if(f->display){
 			if(f->display->screenimage)
 				depth = f->display->screenimage->depth;
-		}
+		}else
+			depth = 8;
 		name = subfontname(cf->name, f->name, depth);
 		if(name == nil)
 			return nil;
@@ -244,7 +245,7 @@
 	}
 
 	subf->cf = cf;
-	if(subf->f->ascent > f->ascent){
+	if(subf->f->ascent > f->ascent && f->display){
 		/* should print something? this is a mistake in the font file */
 		/* must prevent c->top from going negative when loading cache */
 		Image *b;
@@ -297,6 +298,8 @@
 	c->width = fi->width;
 	c->x = h*f->width;
 	c->left = fi->left;
+	if(f->display == nil)
+		return 1;
 	flushimage(f->display, 0);	/* flush any pending errors */
 	b = bufimage(f->display, 37);
 	if(b == 0)
@@ -355,10 +358,13 @@
 	Display *d;
 
 	ret = 0;
-	d = f->display;
 	if(depth <= 0)
 		depth = 1;
 
+	d = f->display;
+	if(d == nil)
+		goto Nodisplay;
+
 	new = allocimage(d, Rect(0, 0, ncache*wid, f->height), CHAN1(CGrey, depth), 0, 0);
 	if(new == nil){
 		fprint(2, "font cache resize failed: %r\n");
@@ -382,6 +388,7 @@
 	}
 	freeimage(f->cacheimage);
 	f->cacheimage = new;
+    Nodisplay:
 	f->width = wid;
 	f->maxdepth = depth;
 	ret = 1;
diff --git a/src/libdraw/getsubfont.c b/src/libdraw/getsubfont.c
index b7a8e44..2cbec81 100644
--- a/src/libdraw/getsubfont.c
+++ b/src/libdraw/getsubfont.c
@@ -24,10 +24,10 @@
 	 * _getsubfont is called only from string.c and stringwidth.c,
 	 * which are known to be safe to have this done.
 	 */
-	if(d->locking == 0)
+	if(d && d->locking == 0)
 		unlockdisplay(d);
-	f = readsubfont(d, name, fd, d->locking==0);
-	if(d->locking == 0)
+	f = readsubfont(d, name, fd, d && d->locking==0);
+	if(d && d->locking == 0)
 		lockdisplay(d);
 	if(f == 0)
 		fprint(2, "getsubfont: can't read %s: %r\n", name);
diff --git a/src/libdraw/readimage.c b/src/libdraw/readimage.c
index 1d2717b..8135c45 100644
--- a/src/libdraw/readimage.c
+++ b/src/libdraw/readimage.c
@@ -23,7 +23,10 @@
 		return creadimage(d, fd, dolock);
 	if(readn(fd, hdr+11, 5*12-11) != 5*12-11)
 		return nil;
-	chunk = d->bufsize - 32;	/* a little room for header */
+	if(d)
+		chunk = d->bufsize - 32;	/* a little room for header */
+	else
+		chunk = 8192;
 
 	/*
 	 * distinguish new channel descriptor from old ldepth.
@@ -69,13 +72,20 @@
 	maxy = r.max.y;
 
 	l = bytesperline(r, chantodepth(chan));
-	if(dolock)
-		lockdisplay(d);
-	i = allocimage(d, r, chan, 0, -1);
-	if(dolock)
-		unlockdisplay(d);
-	if(i == nil)
-		return nil;
+	if(d){
+		if(dolock)
+			lockdisplay(d);
+		i = allocimage(d, r, chan, 0, -1);
+		if(dolock)
+			unlockdisplay(d);
+		if(i == nil)
+			return nil;
+	}else{
+		i = mallocz(sizeof(Image), 1);
+		if(i == nil)
+			return nil;
+	}
+
 	tmp = malloc(chunk);
 	if(tmp == nil)
 		goto Err;
@@ -105,12 +115,14 @@
 			for(j=0; j<chunk; j++)
 				tmp[j] ^= 0xFF;
 
-		if(dolock)
-			lockdisplay(d);
-		if(loadimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), tmp, chunk) <= 0)
-			goto Err1;
-		if(dolock)
-			unlockdisplay(d);
+		if(d){
+			if(dolock)
+				lockdisplay(d);
+			if(loadimage(i, Rect(r.min.x, miny, r.max.x, miny+dy), tmp, chunk) <= 0)
+				goto Err1;
+			if(dolock)
+				unlockdisplay(d);
+		}
 		miny += dy;
 	}
 	free(tmp);
diff --git a/src/libdraw/readsubfont.c b/src/libdraw/readsubfont.c
index 0e587b4..0596264 100644
--- a/src/libdraw/readsubfont.c
+++ b/src/libdraw/readsubfont.c
@@ -27,10 +27,12 @@
 	n = atoi(hdr);
 	p = malloc(6*(n+1));
 	if(p == nil)
-		return nil;
+		goto Err;
 	if(read(fd, p, 6*(n+1)) != 6*(n+1)){
 		werrstr("rdsubfonfile: fontchar read error: %r");
     Err:
+		if(ai == nil)
+			freeimage(i);
 		free(p);
 		return nil;
 	}
diff --git a/src/libdraw/stringwidth.c b/src/libdraw/stringwidth.c
index f0d1372..8d8c6d0 100644
--- a/src/libdraw/stringwidth.c
+++ b/src/libdraw/stringwidth.c
@@ -25,7 +25,7 @@
 	}else
 		rptr = &r;
 	twid = 0;
-	while(len && (*s || *r)){
+	while(len>0 && (*s || *r)){
 		max = Max;
 		if(len < max)
 			max = len;
diff --git a/src/libdraw/subfontcache.c b/src/libdraw/subfontcache.c
index eb0bdba..2a7f489 100644
--- a/src/libdraw/subfontcache.c
+++ b/src/libdraw/subfontcache.c
@@ -12,9 +12,10 @@
 Subfont*
 lookupsubfont(Display *d, char *name)
 {
-	if(strcmp(name, "*default*") == 0)
+	if(d && strcmp(name, "*default*") == 0)
 		return d->defaultsubfont;
-	if(lastname && strcmp(name, lastname)==0 && d==lastsubfont->bits->display){
+	if(lastname && strcmp(name, lastname)==0)
+	if(d==lastsubfont->bits->display){
 		lastsubfont->ref++;
 		return lastsubfont;
 	}
