svn commit: r279102 - user/dchagin/lemul/sys/compat/linprocfs
Dmitry Chagin
dchagin at FreeBSD.org
Sat Feb 21 10:10:27 UTC 2015
Author: dchagin
Date: Sat Feb 21 10:10:26 2015
New Revision: 279102
URL: https://svnweb.freebsd.org/changeset/base/279102
Log:
Add a resid bounds checking to doprocauxv() method.
Modified:
user/dchagin/lemul/sys/compat/linprocfs/linprocfs.c
Modified: user/dchagin/lemul/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- user/dchagin/lemul/sys/compat/linprocfs/linprocfs.c Sat Feb 21 09:25:53 2015 (r279101)
+++ user/dchagin/lemul/sys/compat/linprocfs/linprocfs.c Sat Feb 21 10:10:26 2015 (r279102)
@@ -1405,7 +1405,7 @@ static int
linprocfs_doauxv(PFS_FILL_ARGS)
{
struct sbuf *asb;
- off_t buflen;
+ off_t buflen, resid;
int error;
/*
@@ -1419,11 +1419,6 @@ linprocfs_doauxv(PFS_FILL_ARGS)
return (0);
if (uio->uio_offset < 0 || uio->uio_resid < 0)
return (EINVAL);
- buflen = uio->uio_resid;
- if (buflen > IOSIZE_MAX)
- return (EINVAL);
- if (buflen > MAXPHYS)
- buflen = MAXPHYS;
asb = sbuf_new_auto();
if (asb == NULL)
@@ -1431,6 +1426,19 @@ linprocfs_doauxv(PFS_FILL_ARGS)
error = proc_getauxv(td, p, asb);
if (error == 0)
error = sbuf_finish(asb);
+
+ resid = sbuf_len(asb) - uio->uio_offset;
+ if (resid > uio->uio_resid)
+ buflen = uio->uio_resid;
+ else
+ buflen = resid;
+ if (buflen > IOSIZE_MAX)
+ return (EINVAL);
+ if (buflen > MAXPHYS)
+ buflen = MAXPHYS;
+ if (resid <= 0)
+ return (0);
+
if (error == 0)
error = uiomove(sbuf_data(asb) + uio->uio_offset, buflen, uio);
sbuf_delete(asb);
More information about the svn-src-user
mailing list