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;