#include <sys/thread2.h>
#include <machine/atomic.h>
+#include <machine/limits.h>
#include <vm/vm.h>
#include <vm/vm_kern.h>
struct mbuf *m; /* current working mbuf */
struct mbuf *head = NULL; /* result mbuf chain */
struct mbuf **mp = &head;
- int resid = uio->uio_resid, nsize, flags = M_PKTHDR, error;
+ int flags = M_PKTHDR;
+ int nsize;
+ int error;
+ int resid;
do {
+ if (uio->uio_resid > INT_MAX)
+ resid = INT_MAX;
+ else
+ resid = (int)uio->uio_resid;
m = m_getl(resid, MB_WAIT, MT_DATA, flags, &nsize);
if (flags) {
m->m_pkthdr.len = 0;
MH_ALIGN(m, resid);
flags = 0;
}
- m->m_len = min(nsize, resid);
+ m->m_len = imin(nsize, resid);
error = uiomove(mtod(m, caddr_t), m->m_len, uio);
if (error) {
m_free(m);
*mp = m;
mp = &m->m_next;
head->m_pkthdr.len += m->m_len;
- resid -= m->m_len;
- } while (resid > 0);
+ } while (uio->uio_resid > 0);
return (head);