summaryrefslogtreecommitdiff
path: root/sys/arch/i386
diff options
context:
space:
mode:
authorStefan Kempf <stefan@cvs.openbsd.org>2016-01-08 08:00:13 +0000
committerStefan Kempf <stefan@cvs.openbsd.org>2016-01-08 08:00:13 +0000
commit6d3f829cc0c2784a6c1e092a773078f06d936481 (patch)
tree65efa1c823e818aca5618f749ee3080b7bf420a4 /sys/arch/i386
parentdb255e00710b296c43af670524843adaaa586977 (diff)
Use off_t to store the offset we want to access the NVRAM at
and check that is valid. Ensures that NVRAM is accessed at sensible offsets. Convert i386/nvram.c to uiomove() while there. Diff from Martin Natano, thanks! ok kettenis@, deraadt@
Diffstat (limited to 'sys/arch/i386')
-rw-r--r--sys/arch/i386/i386/nvram.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/arch/i386/i386/nvram.c b/sys/arch/i386/i386/nvram.c
index 1061e50ecd3..f9b43486b87 100644
--- a/sys/arch/i386/i386/nvram.c
+++ b/sys/arch/i386/i386/nvram.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nvram.c,v 1.4 2015/02/10 21:56:09 miod Exp $ */
+/* $OpenBSD: nvram.c,v 1.5 2016/01/08 08:00:12 stefan Exp $ */
/*
* Copyright (c) 2004 Joshua Stein <jcs@openbsd.org>
@@ -93,29 +93,32 @@ int
nvramread(dev_t dev, struct uio *uio, int flags)
{
u_char buf[NVRAM_SIZE];
- u_int pos = uio->uio_offset;
+ off_t pos = uio->uio_offset;
u_char *tmp;
- int count = min(sizeof(buf), uio->uio_resid);
+ size_t count = ulmin(sizeof(buf), uio->uio_resid);
int ret;
if (!nvram_initialized)
return (ENXIO);
+ if (uio->uio_offset < 0)
+ return (EINVAL);
+
if (uio->uio_resid == 0)
return (0);
#ifdef NVRAM_DEBUG
- printf("attempting to read %d bytes at offset %d\n", count, pos);
+ printf("attempting to read %zu bytes at offset %lld\n", count, pos);
#endif
for (tmp = buf; count-- > 0 && pos < NVRAM_SIZE; ++pos, ++tmp)
*tmp = nvram_get_byte(pos);
#ifdef NVRAM_DEBUG
- printf("nvramread read %d bytes (%s)\n", (tmp - buf), tmp);
+ printf("nvramread read %td bytes (%s)\n", (tmp - buf), tmp);
#endif
- ret = uiomovei((caddr_t)buf, (tmp - buf), uio);
+ ret = uiomove(buf, (tmp - buf), uio);
uio->uio_offset += uio->uio_resid;