Synopsis: Insufficient checking of lengths passed from userland to kernel
NetBSD versions: 1.5, 1.5.1
Thanks to: Jaromir Dolecek
Reported in NetBSD Security Advisory: NetBSD-SA2001-015
Index: arch/amiga/dev/grf_cl.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/amiga/dev/grf_cl.c,v
retrieving revision 1.25
retrieving revision 1.25.12.1
diff -u -p -r1.25 -r1.25.12.1
--- grf_cl.c 1999/06/29 19:51:28 1.25
+++ grf_cl.c 2001/08/16 16:52:36 1.25.12.1
@@ -905,7 +905,7 @@ cl_setspriteinfo(gp, data)
if (data->set & GRFSPRSET_SHAPE) {
- short dsx, dsy, i;
+ unsigned short dsx, dsy, i;
unsigned long *di, *dm, *si, *sm;
unsigned long ssi[128], ssm[128];
struct grf_position gpos;
Index: arch/amiga/dev/grfioctl.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/amiga/dev/grfioctl.h,v
retrieving revision 1.13
retrieving revision 1.13.30.1
diff -u -p -r1.13 -r1.13.30.1
--- grfioctl.h 1997/07/29 17:54:11 1.13
+++ grfioctl.h 2001/08/16 16:52:37 1.13.30.1
@@ -147,8 +147,8 @@ struct grfvideo_mode {
* Maxium value of "index" can be deduced from grfinfo->gd_colors.
*/
struct grf_colormap {
- int index; /* start at red[index],green[index],blue[index] */
- int count; /* till < red[index+count],... */
+ unsigned int index; /* start at red[index],green[index],blue[index] */
+ unsigned int count; /* till < red[index+count],... */
u_char *red;
u_char *green;
u_char *blue;
Index: arch/hpcmips/dev/plumvideo.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/hpcmips/dev/plumvideo.c,v
retrieving revision 1.11.4.1
retrieving revision 1.11.4.2
diff -u -p -r1.11.4.1 -r1.11.4.2
--- plumvideo.c 2000/06/30 16:27:24 1.11.4.1
+++ plumvideo.c 2001/08/16 16:52:37 1.11.4.2
@@ -429,7 +429,8 @@ plumvideo_ioctl(v, cmd, data, flag, p)
struct wsdisplay_cmap *cmap;
u_int8_t *r, *g, *b;
u_int32_t *rgb;
- int idx, cnt, error;
+ int idx, error;
+ size_t cnt;
switch (cmd) {
case WSDISPLAYIO_GETCMAP:
Index: arch/macppc/dev/ofb.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/macppc/dev/ofb.c,v
retrieving revision 1.13.2.2
retrieving revision 1.13.2.3
diff -u -p -r1.13.2.2 -r1.13.2.3
--- ofb.c 2000/11/01 16:24:01 1.13.2.2
+++ ofb.c 2001/08/16 16:52:37 1.13.2.3
@@ -515,8 +515,8 @@ ofb_putcmap(sc, cm)
struct wsdisplay_cmap *cm;
{
struct ofb_devconfig *dc = sc->sc_dc;
- int index = cm->index;
- int count = cm->count;
+ u_int index = cm->index;
+ u_int count = cm->count;
int i;
u_char *r, *g, *b;
Index: arch/sparc/dev/cgtwo.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/dev/cgtwo.c,v
retrieving revision 1.31.4.1
retrieving revision 1.31.4.2
diff -u -p -r1.31.4.1 -r1.31.4.2
--- cgtwo.c 2000/06/30 16:27:38 1.31.4.1
+++ cgtwo.c 2001/08/16 16:52:37 1.31.4.2
@@ -365,7 +365,8 @@ cgtwoputcmap(sc, cmap)
register struct fbcmap *cmap;
{
u_char red[CG2_CMSIZE], green[CG2_CMSIZE], blue[CG2_CMSIZE];
- int error, start, count, ecount;
+ int error;
+ u_int start, count, ecount;
register u_int i;
register volatile u_short *p;
Index: arch/sun3/dev/cg2.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sun3/dev/cg2.c,v
retrieving revision 1.11.26.1
retrieving revision 1.11.26.2
diff -u -p -r1.11.26.1 -r1.11.26.2
--- cg2.c 2000/06/30 16:27:42 1.11.26.1
+++ cg2.c 2001/08/16 16:52:38 1.11.26.2
@@ -352,7 +352,8 @@ static int cg2putcmap(fb, data)
struct fbcmap *cmap = data;
struct cg2_softc *sc = fb->fb_private;
u_char red[CMSIZE], green[CMSIZE], blue[CMSIZE];
- int error, start, count, ecount;
+ int error;
+ u_int start, count, ecount;
register u_int i;
register u_short *p;
Index: arch/sparc/include/fbio.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc/include/Attic/fbio.h,v
retrieving revision 1.6
retrieving revision 1.6.12.1
diff -u -p -r1.6 -r1.6.12.1
--- fbio.h 1999/08/01 00:23:49 1.6
+++ fbio.h 2001/08/16 16:52:38 1.6.12.1
@@ -107,8 +107,8 @@ struct fbinfo {
* Color map I/O.
*/
struct fbcmap {
- int index; /* first element (0 origin) */
- int count; /* number of elements */
+ u_int index; /* first element (0 origin) */
+ u_int count; /* number of elements */
u_char *red; /* red color map elements */
u_char *green; /* green color map elements */
u_char *blue; /* blue color map elements */
Index: arch/sparc64/include/fbio.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/include/fbio.h,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.24.1
diff -u -p -r1.1.1.1 -r1.1.1.1.24.1
--- fbio.h 1998/06/20 04:58:51 1.1.1.1
+++ fbio.h 2001/08/16 16:52:38 1.1.1.1.24.1
@@ -106,8 +106,8 @@ struct fbinfo {
* Color map I/O.
*/
struct fbcmap {
- int index; /* first element (0 origin) */
- int count; /* number of elements */
+ u_int index; /* first element (0 origin) */
+ u_int count; /* number of elements */
u_char *red; /* red color map elements */
u_char *green; /* green color map elements */
u_char *blue; /* blue color map elements */
Index: arch/sun3/include/fbio.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sun3/include/fbio.h,v
retrieving revision 1.3
retrieving revision 1.3.46.1
diff -u -p -r1.3 -r1.3.46.1
--- fbio.h 1994/11/21 21:33:40 1.3
+++ fbio.h 2001/08/16 16:52:38 1.3.46.1
@@ -104,8 +104,8 @@ struct fbinfo {
* Color map I/O.
*/
struct fbcmap {
- int index; /* first element (0 origin) */
- int count; /* number of elements */
+ u_int index; /* first element (0 origin) */
+ u_int count; /* number of elements */
u_char *red; /* red color map elements */
u_char *green; /* green color map elements */
u_char *blue; /* blue color map elements */
Index: dev/pci/tga.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/pci/tga.c,v
retrieving revision 1.25.2.3
retrieving revision 1.25.2.4
diff -u -p -r1.25.2.3 -r1.25.2.4
--- tga.c 2001/06/25 16:27:54 1.25.2.3
+++ tga.c 2001/08/16 16:52:39 1.25.2.4
@@ -771,7 +771,8 @@ tga_builtin_set_cursor(dc, cursorp)
{
struct ramdac_funcs *dcrf = dc->dc_ramdac_funcs;
struct ramdac_cookie *dcrc = dc->dc_ramdac_cookie;
- int count, error, v;
+ u_int count, v;
+ int error;
v = cursorp->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: dev/tc/cfb.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/tc/cfb.c,v
retrieving revision 1.20.4.1
retrieving revision 1.20.4.2
diff -u -p -r1.20.4.1 -r1.20.4.2
--- cfb.c 2000/06/30 16:27:52 1.20.4.1
+++ cfb.c 2001/08/16 16:52:39 1.20.4.2
@@ -714,7 +714,7 @@ set_cursor(sc, p)
struct wsdisplay_cursor *p;
{
#define cc (&sc->sc_cursor)
- int v, index, count, icount;
+ u_int v, index, count, icount;
v = p->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: dev/tc/mfb.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/tc/mfb.c,v
retrieving revision 1.22.4.1
retrieving revision 1.22.4.2
diff -u -p -r1.22.4.1 -r1.22.4.2
--- mfb.c 2000/06/30 16:27:52 1.22.4.1
+++ mfb.c 2001/08/16 16:52:40 1.22.4.2
@@ -32,7 +32,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: SA2001-015-kernlen-1.5.patch,v 1.1 2001/08/23 21:02:14 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: SA2001-015-kernlen-1.5.patch,v 1.1 2001/08/23 21:02:14 jdolecek Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -615,7 +615,7 @@ set_cursor(sc, p)
struct wsdisplay_cursor *p;
{
#define cc (&sc->sc_cursor)
- int v, count, index;
+ u_int v, count, index;
v = p->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: dev/tc/sfb.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/tc/sfb.c,v
retrieving revision 1.35.4.1
retrieving revision 1.35.4.2
diff -u -p -r1.35.4.1 -r1.35.4.2
--- sfb.c 2000/06/30 16:27:52 1.35.4.1
+++ sfb.c 2001/08/16 16:52:40 1.35.4.2
@@ -32,7 +32,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: SA2001-015-kernlen-1.5.patch,v 1.1 2001/08/23 21:02:14 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: SA2001-015-kernlen-1.5.patch,v 1.1 2001/08/23 21:02:14 jdolecek Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -752,7 +752,7 @@ set_cursor(sc, p)
struct wsdisplay_cursor *p;
{
#define cc (&sc->sc_cursor)
- int v, index, count, icount;
+ u_int v, index, count, icount;
v = p->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: dev/tc/sfbplus.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/tc/sfbplus.c,v
retrieving revision 1.3.6.1
retrieving revision 1.3.6.2
diff -u -p -r1.3.6.1 -r1.3.6.2
--- sfbplus.c 2000/06/30 16:27:52 1.3.6.1
+++ sfbplus.c 2001/08/16 16:52:40 1.3.6.2
@@ -774,7 +774,8 @@ set_cursor(sc, p)
struct wsdisplay_cursor *p;
{
#define cc (&sc->sc_cursor)
- int v, index, count, icount, x, y;
+ u_int v, index, count, icount;
+ int x, y;
v = p->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: dev/tc/tfb.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/tc/tfb.c,v
retrieving revision 1.24.4.1
retrieving revision 1.24.4.2
diff -u -p -r1.24.4.1 -r1.24.4.2
--- tfb.c 2000/06/30 16:27:52 1.24.4.1
+++ tfb.c 2001/08/16 16:52:40 1.24.4.2
@@ -786,7 +786,7 @@ set_cursor(sc, p)
struct wsdisplay_cursor *p;
{
#define cc (&sc->sc_cursor)
- int v, index, count, icount;
+ u_int v, index, count, icount;
v = p->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: dev/tc/xcfb.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/tc/xcfb.c,v
retrieving revision 1.17.4.1
retrieving revision 1.17.4.2
diff -u -p -r1.17.4.1 -r1.17.4.2
--- xcfb.c 2000/06/30 16:27:52 1.17.4.1
+++ xcfb.c 2001/08/16 16:52:40 1.17.4.2
@@ -598,7 +598,7 @@ set_cursor(sc, p)
struct wsdisplay_cursor *p;
{
#define cc (&sc->sc_cursor)
- int v, index, count;
+ u_int v, index, count;
v = p->which;
if (v & WSDISPLAY_CURSOR_DOCMAP) {
Index: net/if_ppp.c
===================================================================
RCS file: /cvsroot/syssrc/sys/net/if_ppp.c,v
retrieving revision 1.58
retrieving revision 1.58.4.1
diff -u -p -r1.58 -r1.58.4.1
--- if_ppp.c 2000/03/30 09:45:36 1.58
+++ if_ppp.c 2001/08/16 16:52:39 1.58.4.1
@@ -350,7 +350,8 @@ pppioctl(sc, cmd, data, flag, p)
int flag;
struct proc *p;
{
- int s, error, flags, mru, nb, npx;
+ int s, error, flags, mru, npx;
+ u_int nb;
struct ppp_option_data *odp;
struct compressor **cp;
struct npioctl *npi;
Index: coda/coda_venus.c
===================================================================
RCS file: /cvsroot/syssrc/sys/coda/coda_venus.c,v
retrieving revision 1.7
retrieving revision 1.7.20.1
diff -u -p -r1.7 -r1.7.20.1
--- coda_venus.c 1998/11/18 03:09:20 1.7
+++ coda_venus.c 2001/08/16 15:22:33 1.7.20.1
@@ -265,6 +265,9 @@ venus_ioctl(void *mdp, ViceFid *fid,
inp->cmd = (com & ~(IOCPARM_MASK << 16));
tmp = ((com >> 16) & IOCPARM_MASK) - sizeof (char *) - sizeof (int);
inp->cmd |= (tmp & IOCPARM_MASK) << 16;
+
+ if (iap->vi.in_size < 0 || iap->vi.in_size > VC_MAXMSGSIZE)
+ return (EINVAL);
inp->rwflag = flag;
inp->len = iap->vi.in_size;
Index: dev/wscons/wsdisplay.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/wscons/wsdisplay.c,v
retrieving revision 1.37.4.2
retrieving revision 1.37.4.3
diff -u -p -r1.37.4.2 -r1.37.4.3
--- wsdisplay.c 2000/12/13 22:10:23 1.37.4.2
+++ wsdisplay.c 2001/08/16 16:19:12 1.37.4.3
@@ -1019,6 +1019,7 @@ wsdisplay_cfg_ioctl(sc, cmd, data, flag,
int error;
char *type, typebuf[16], *emul, emulbuf[16];
void *buf;
+ u_int fontsz;
#if defined(COMPAT_14) && NWSKBD > 0
struct wsmux_device wsmuxdata;
#endif
@@ -1061,10 +1062,12 @@ wsdisplay_cfg_ioctl(sc, cmd, data, flag,
d->name = typebuf;
} else
d->name = "loaded"; /* ??? */
- buf = malloc(d->fontheight * d->stride * d->numchars,
- M_DEVBUF, M_WAITOK);
- error = copyin(d->data, buf,
- d->fontheight * d->stride * d->numchars);
+ fontsz = d->fontheight * d->stride * d->numchars;
+ if (fontsz > WSDISPLAY_MAXFONTSZ)
+ return (EINVAL);
+
+ buf = malloc(fontsz, M_DEVBUF, M_WAITOK);
+ error = copyin(d->data, buf, fontsz);
if (error) {
free(buf, M_DEVBUF);
return (error);
Index: dev/wscons/wskbd.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/wscons/wskbd.c,v
retrieving revision 1.38
retrieving revision 1.38.4.1
diff -u -p -r1.38 -r1.38.4.1
--- wskbd.c 2000/03/23 07:01:47 1.38
+++ wskbd.c 2001/08/16 16:19:12 1.38.4.1
@@ -964,6 +964,9 @@ getkeyrepeat:
if ((flag & FWRITE) == 0)
return (EACCES);
umdp = (struct wskbd_map_data *)data;
+ if (umdp->maplen > WSKBDIO_MAXMAPLEN)
+ return (EINVAL);
+
len = umdp->maplen*sizeof(struct wscons_keymap);
buf = malloc(len, M_TEMP, M_WAITOK);
error = copyin(umdp->map, buf, len);
Index: dev/wscons/wsconsio.h
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/wscons/wsconsio.h,v
retrieving revision 1.31.2.1
retrieving revision 1.31.2.2
diff -u -p -r1.31.2.1 -r1.31.2.2
--- wsconsio.h 2000/07/07 09:49:17 1.31.2.1
+++ wsconsio.h 2001/08/16 16:19:13 1.31.2.2
@@ -135,6 +135,7 @@ struct wskbd_keyrepeat_data {
/* Manipulate keysym groups. */
struct wskbd_map_data {
u_int maplen; /* number of entries in map */
+#define WSKBDIO_MAXMAPLEN 65536
struct wscons_keymap *map; /* map to get or set */
};
#define WSKBDIO_GETMAP _IOWR('W', 13, struct wskbd_map_data)
@@ -302,7 +303,8 @@ struct wsdisplay_font {
#define WSDISPLAY_FONTENC_ISO 0
#define WSDISPLAY_FONTENC_IBM 1
#define WSDISPLAY_FONTENC_PCVT 2
- int fontwidth, fontheight, stride;
+ u_int fontwidth, fontheight, stride;
+#define WSDISPLAY_MAXFONTSZ (512*1024)
int bitorder, byteorder;
#define WSDISPLAY_FONTORDER_KNOWN 0 /* i.e, no need to convert */
#define WSDISPLAY_FONTORDER_L2R 1
Index: dev/ccd.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/ccd.c,v
retrieving revision 1.69.4.1
retrieving revision 1.69.4.2
diff -u -p -r1.69.4.1 -r1.69.4.2
--- ccd.c 2001/05/01 12:27:03 1.69.4.1
+++ ccd.c 2001/08/16 16:10:53 1.69.4.2
@@ -1017,6 +1017,11 @@ ccdioctl(dev, cmd, data, flag, p)
goto out;
}
+ if (ccio->ccio_ndisks > CCD_MAXNDISKS) {
+ error = EINVAL;
+ goto out;
+ }
+
/* Fill in some important bits. */
cs->sc_ileave = ccio->ccio_ileave;
cs->sc_nccdisks = ccio->ccio_ndisks;
Index: dev/ccdvar.h
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/ccdvar.h,v
retrieving revision 1.19
retrieving revision 1.19.12.1
diff -u -p -r1.19 -r1.19.12.1
--- ccdvar.h 1999/08/11 02:44:35 1.19
+++ ccdvar.h 2001/08/16 16:10:53 1.19.12.1
@@ -95,7 +95,7 @@
*/
struct ccd_ioctl {
char **ccio_disks; /* pointer to component paths */
- int ccio_ndisks; /* number of disks to concatenate */
+ u_int ccio_ndisks; /* number of disks to concatenate */
int ccio_ileave; /* interleave (DEV_BSIZE blocks) */
int ccio_flags; /* see sc_flags below */
int ccio_unit; /* unit number: use varies */
@@ -166,7 +166,8 @@ struct ccd_softc {
int sc_flags; /* flags */
size_t sc_size; /* size of ccd */
int sc_ileave; /* interleave */
- int sc_nccdisks; /* number of components */
+ u_int sc_nccdisks; /* number of components */
+#define CCD_MAXNDISKS 65536
struct ccdcinfo *sc_cinfo; /* component info */
struct ccdiinfo *sc_itable; /* interleave table */
struct ccdgeom sc_geom; /* pseudo geometry info */
Index: miscfs/umapfs/umap_vfsops.c
===================================================================
RCS file: /cvsroot/syssrc/sys/miscfs/umapfs/umap_vfsops.c,v
retrieving revision 1.25
retrieving revision 1.25.2.1
diff -u -p -r1.25 -r1.25.2.1
--- umap_vfsops.c 2000/06/10 18:27:04 1.25
+++ umap_vfsops.c 2001/08/16 16:03:44 1.25.2.1
@@ -146,6 +146,11 @@ umapfs_mount(mp, path, data, ndp, p)
/*
* Now copy in the number of entries and maps for umap mapping.
*/
+ if (args.nentries > MAPFILEENTRIES || args.gnentries > GMAPFILEENTRIES) {
+ vput(lowerrootvp);
+ return (error);
+ }
+
amp->info_nentries = args.nentries;
amp->info_gnentries = args.gnentries;
error = copyin(args.mapdata, (caddr_t)amp->info_mapdata,
Index: nfs/nfs.h
===================================================================
RCS file: /cvsroot/syssrc/sys/nfs/nfs.h,v
retrieving revision 1.22.2.2
retrieving revision 1.22.2.3
diff -u -p -r1.22.2.2 -r1.22.2.3
--- nfs.h 2001/04/06 00:37:13 1.22.2.2
+++ nfs.h 2001/08/16 16:03:46 1.22.2.3
@@ -193,9 +193,9 @@ struct nfsd_cargs {
char *ncd_dirp; /* Mount dir path */
uid_t ncd_authuid; /* Effective uid */
int ncd_authtype; /* Type of authenticator */
- int ncd_authlen; /* Length of authenticator string */
+ u_int ncd_authlen; /* Length of authenticator string */
u_char *ncd_authstr; /* Authenticator string */
- int ncd_verflen; /* and the verifier */
+ u_int ncd_verflen; /* and the verifier */
u_char *ncd_verfstr;
NFSKERBKEY_T ncd_key; /* Session key */
};
Index: kern/vfs_subr.c
===================================================================
RCS file: /cvsroot/syssrc/sys/kern/vfs_subr.c,v
retrieving revision 1.128.2.5
retrieving revision 1.128.2.6
diff -u -p -r1.128.2.5 -r1.128.2.6
--- vfs_subr.c 2000/12/14 23:36:02 1.128.2.5
+++ vfs_subr.c 2001/08/16 16:03:45 1.128.2.6
@@ -2012,6 +2012,10 @@ vfs_hang_addrlist(mp, nep, argp)
mp->mnt_flag |= MNT_DEFEXPORTED;
return (0);
}
+
+ if (argp->ex_addrlen > MLEN)
+ return (EINVAL);
+
i = sizeof(struct netcred) + argp->ex_addrlen + argp->ex_masklen;
np = (struct netcred *)malloc(i, M_NETADDR, M_WAITOK);
memset((caddr_t)np, 0, i);
Index: kern/sysv_sem.c
===================================================================
RCS file: /cvsroot/syssrc/sys/kern/sysv_sem.c,v
retrieving revision 1.38
retrieving revision 1.38.2.1
diff -u -p -r1.38 -r1.38.2.1
--- sysv_sem.c 2000/06/02 15:53:05 1.38
+++ sysv_sem.c 2001/08/16 13:53:08 1.38.2.1
@@ -571,7 +571,7 @@ sys_semop(p, v, retval)
syscallarg(size_t) nsops;
} */ *uap = v;
int semid = SCARG(uap, semid);
- int nsops = SCARG(uap, nsops);
+ size_t nsops = SCARG(uap, nsops);
struct sembuf sops[MAX_SOPS];
struct semid_ds *semaptr;
struct sembuf *sopptr = NULL;