hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/net/xdp/xdp_umem.c
....@@ -153,10 +153,11 @@
153153
154154 static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
155155 {
156
- u32 npgs_rem, chunk_size = mr->chunk_size, headroom = mr->headroom;
157156 bool unaligned_chunks = mr->flags & XDP_UMEM_UNALIGNED_CHUNK_FLAG;
158
- u64 npgs, addr = mr->addr, size = mr->len;
159
- unsigned int chunks, chunks_rem;
157
+ u32 chunk_size = mr->chunk_size, headroom = mr->headroom;
158
+ u64 addr = mr->addr, size = mr->len;
159
+ u32 chunks_rem, npgs_rem;
160
+ u64 chunks, npgs;
160161 int err;
161162
162163 if (chunk_size < XDP_UMEM_MIN_CHUNK_SIZE || chunk_size > PAGE_SIZE) {
....@@ -191,8 +192,8 @@
191192 if (npgs > U32_MAX)
192193 return -EINVAL;
193194
194
- chunks = (unsigned int)div_u64_rem(size, chunk_size, &chunks_rem);
195
- if (chunks == 0)
195
+ chunks = div_u64_rem(size, chunk_size, &chunks_rem);
196
+ if (!chunks || chunks > U32_MAX)
196197 return -EINVAL;
197198
198199 if (!unaligned_chunks && chunks_rem)
....@@ -205,7 +206,7 @@
205206 umem->headroom = headroom;
206207 umem->chunk_size = chunk_size;
207208 umem->chunks = chunks;
208
- umem->npgs = (u32)npgs;
209
+ umem->npgs = npgs;
209210 umem->pgs = NULL;
210211 umem->user = NULL;
211212 umem->flags = mr->flags;