summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-06-06 20:27:14 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-06-06 20:27:14 -0400
commit285767604576148fc1be7fcd112e4a90eb0d6ad2 (patch)
treeb4c611689f95e1a2ba0fe7b6407e05469251fc2f /net
parent5eb6eed7e0fe880dc8de8da203cc888716bbf196 (diff)
parent0ed2dd03b94b7b7f66e23f25073b5385d0416589 (diff)
Merge tag 'overflow-v4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull overflow updates from Kees Cook: "This adds the new overflow checking helpers and adds them to the 2-factor argument allocators. And this adds the saturating size helpers and does a treewide replacement for the struct_size() usage. Additionally this adds the overflow testing modules to make sure everything works. I'm still working on the treewide replacements for allocators with "simple" multiplied arguments: *alloc(a * b, ...) -> *alloc_array(a, b, ...) and *zalloc(a * b, ...) -> *calloc(a, b, ...) as well as the more complex cases, but that's separable from this portion of the series. I expect to have the rest sent before -rc1 closes; there are a lot of messy cases to clean up. Summary: - Introduce arithmetic overflow test helper functions (Rasmus) - Use overflow helpers in 2-factor allocators (Kees, Rasmus) - Introduce overflow test module (Rasmus, Kees) - Introduce saturating size helper functions (Matthew, Kees) - Treewide use of struct_size() for allocators (Kees)" * tag 'overflow-v4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: treewide: Use struct_size() for devm_kmalloc() and friends treewide: Use struct_size() for vmalloc()-family treewide: Use struct_size() for kmalloc()-family device: Use overflow helpers for devm_kmalloc() mm: Use overflow helpers in kvmalloc() mm: Use overflow helpers in kmalloc_array*() test_overflow: Add memory allocation overflow tests overflow.h: Add allocation size calculation helpers test_overflow: Report test failures test_overflow: macrofy some more, do more tests for free lib: add runtime test of check_*_overflow functions compiler.h: enable builtin overflow checkers and add fallback code
Diffstat (limited to 'net')
-rw-r--r--net/ceph/mon_client.c5
-rw-r--r--net/ceph/osd_client.c3
-rw-r--r--net/netfilter/xt_recent.c3
-rw-r--r--net/sctp/endpointola.c4
4 files changed, 6 insertions, 9 deletions
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
index 21ac6e3b96bb..d7a7a2330ef7 100644
--- a/net/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -62,7 +62,7 @@ struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
62 62
63 if (num_mon > CEPH_MAX_MON) 63 if (num_mon > CEPH_MAX_MON)
64 goto bad; 64 goto bad;
65 m = kmalloc(sizeof(*m) + sizeof(m->mon_inst[0])*num_mon, GFP_NOFS); 65 m = kmalloc(struct_size(m, mon_inst, num_mon), GFP_NOFS);
66 if (m == NULL) 66 if (m == NULL)
67 return ERR_PTR(-ENOMEM); 67 return ERR_PTR(-ENOMEM);
68 m->fsid = fsid; 68 m->fsid = fsid;
@@ -1000,8 +1000,7 @@ static int build_initial_monmap(struct ceph_mon_client *monc)
1000 int i; 1000 int i;
1001 1001
1002 /* build initial monmap */ 1002 /* build initial monmap */
1003 monc->monmap = kzalloc(sizeof(*monc->monmap) + 1003 monc->monmap = kzalloc(struct_size(monc->monmap, mon_inst, num_mon),
1004 num_mon*sizeof(monc->monmap->mon_inst[0]),
1005 GFP_KERNEL); 1004 GFP_KERNEL);
1006 if (!monc->monmap) 1005 if (!monc->monmap)
1007 return -ENOMEM; 1006 return -ENOMEM;
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index d2667e5dddc3..69a2581ddbba 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -584,8 +584,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
584 req = kmem_cache_alloc(ceph_osd_request_cache, gfp_flags); 584 req = kmem_cache_alloc(ceph_osd_request_cache, gfp_flags);
585 } else { 585 } else {
586 BUG_ON(num_ops > CEPH_OSD_MAX_OPS); 586 BUG_ON(num_ops > CEPH_OSD_MAX_OPS);
587 req = kmalloc(sizeof(*req) + num_ops * sizeof(req->r_ops[0]), 587 req = kmalloc(struct_size(req, r_ops, num_ops), gfp_flags);
588 gfp_flags);
589 } 588 }
590 if (unlikely(!req)) 589 if (unlikely(!req))
591 return NULL; 590 return NULL;
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c
index 9bbfc17ce3ec..07085c22b19c 100644
--- a/net/netfilter/xt_recent.c
+++ b/net/netfilter/xt_recent.c
@@ -184,8 +184,7 @@ recent_entry_init(struct recent_table *t, const union nf_inet_addr *addr,
184 } 184 }
185 185
186 nstamps_max += 1; 186 nstamps_max += 1;
187 e = kmalloc(sizeof(*e) + sizeof(e->stamps[0]) * nstamps_max, 187 e = kmalloc(struct_size(e, stamps, nstamps_max), GFP_ATOMIC);
188 GFP_ATOMIC);
189 if (e == NULL) 188 if (e == NULL)
190 return NULL; 189 return NULL;
191 memcpy(&e->addr, addr, sizeof(e->addr)); 190 memcpy(&e->addr, addr, sizeof(e->addr));
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
index e2f5a3ee41a7..40c7eb941bc9 100644
--- a/net/sctp/endpointola.c
+++ b/net/sctp/endpointola.c
@@ -73,8 +73,8 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
73 * variables. There are arrays that we encode directly 73 * variables. There are arrays that we encode directly
74 * into parameters to make the rest of the operations easier. 74 * into parameters to make the rest of the operations easier.
75 */ 75 */
76 auth_hmacs = kzalloc(sizeof(*auth_hmacs) + 76 auth_hmacs = kzalloc(struct_size(auth_hmacs, hmac_ids,
77 sizeof(__u16) * SCTP_AUTH_NUM_HMACS, gfp); 77 SCTP_AUTH_NUM_HMACS), gfp);
78 if (!auth_hmacs) 78 if (!auth_hmacs)
79 goto nomem; 79 goto nomem;
80 80