The following diff prevents integer truncation of uio_resid
by using ulmin() instead of min() and calls uiomove() instead
of the legacy uiomove().
That's straightforward because the m_len mbuf field is unsigned.
mlen can be turned to a size_t because it's set to MLEN or MCLBYTES,
which is > 0.
I plan to commit this in a few days unless there are objections.
Index: if_pppx.c
===================================================================
RCS file: /cvs/src/sys/net/if_pppx.c,v
retrieving revision 1.49
diff -u -p -r1.49 if_pppx.c
--- if_pppx.c 14 Jan 2016 09:20:31 -0000 1.49
+++ if_pppx.c 22 Jan 2016 18:23:04 -0000
@@ -273,7 +273,8 @@ pppxread(dev_t dev, struct uio *uio, int
struct pppx_dev *pxd = pppx_dev2pxd(dev);
struct mbuf *m, *m0;
int error = 0;
- int len, s;
+ int s;
+ size_t len;
if (!pxd)
return (ENXIO);
@@ -292,9 +293,9 @@ pppxread(dev_t dev, struct uio *uio, int
}
while (m0 != NULL && uio->uio_resid > 0 && error == 0) {
- len = min(uio->uio_resid, m0->m_len);
+ len = ulmin(uio->uio_resid, m0->m_len);
if (len != 0)
- error = uiomovei(mtod(m0, caddr_t), len, uio);
+ error = uiomove(mtod(m0, caddr_t), len, uio);
m = m_free(m0);
m0 = m;
}
@@ -313,8 +314,9 @@ pppxwrite(dev_t dev, struct uio *uio, in
uint32_t proto;
struct mbuf *top, **mp, *m;
struct niqueue *ifq;
- int tlen, mlen;
+ int tlen;
int error = 0;
+ size_t mlen;
#if NBPFILTER > 0
int s;
#endif
@@ -342,8 +344,8 @@ pppxwrite(dev_t dev, struct uio *uio, in
mp = ⊤
while (error == 0 && uio->uio_resid > 0) {
- m->m_len = min(mlen, uio->uio_resid);
- error = uiomovei(mtod (m, caddr_t), m->m_len, uio);
+ m->m_len = ulmin(mlen, uio->uio_resid);
+ error = uiomove(mtod (m, caddr_t), m->m_len, uio);
*mp = m;
mp = &m->m_next;
if (error == 0 && uio->uio_resid > 0) {
Index: if_tun.c
===================================================================
RCS file: /cvs/src/sys/net/if_tun.c,v
retrieving revision 1.165
diff -u -p -r1.165 if_tun.c
--- if_tun.c 7 Jan 2016 05:31:17 -0000 1.165
+++ if_tun.c 22 Jan 2016 18:23:05 -0000
@@ -764,7 +764,8 @@ tun_dev_read(struct tun_softc *tp, struc
struct ifnet *ifp = &tp->tun_if;
struct mbuf *m, *m0;
unsigned int ifidx;
- int error = 0, len, s;
+ int error = 0, s;
+ size_t len;
if ((tp->tun_flags & TUN_READY) != TUN_READY)
return (EHOSTDOWN);
@@ -825,9 +826,9 @@ tun_dev_read(struct tun_softc *tp, struc
}
while (m0 != NULL && uio->uio_resid > 0 && error == 0) {
- len = min(uio->uio_resid, m0->m_len);
+ len = ulmin(uio->uio_resid, m0->m_len);
if (len != 0)
- error = uiomovei(mtod(m0, caddr_t), len, uio);
+ error = uiomove(mtod(m0, caddr_t), len, uio);
m = m_free(m0);
m0 = m;
}
@@ -872,7 +873,8 @@ tun_dev_write(struct tun_softc *tp, stru
struct niqueue *ifq;
u_int32_t *th;
struct mbuf *top, **mp, *m;
- int error=0, tlen, mlen;
+ int error = 0, tlen;
+ size_t mlen;
#if NBPFILTER > 0
int s;
#endif
@@ -911,8 +913,8 @@ tun_dev_write(struct tun_softc *tp, stru
m->m_data += ETHER_ALIGN;
}
while (error == 0 && uio->uio_resid > 0) {
- m->m_len = min(mlen, uio->uio_resid);
- error = uiomovei(mtod (m, caddr_t), m->m_len, uio);
+ m->m_len = ulmin(mlen, uio->uio_resid);
+ error = uiomove(mtod (m, caddr_t), m->m_len, uio);
*mp = m;
mp = &m->m_next;
if (error == 0 && uio->uio_resid > 0) {