diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-06 20:27:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-06 20:27:14 -0400 |
commit | 285767604576148fc1be7fcd112e4a90eb0d6ad2 (patch) | |
tree | b4c611689f95e1a2ba0fe7b6407e05469251fc2f /net | |
parent | 5eb6eed7e0fe880dc8de8da203cc888716bbf196 (diff) | |
parent | 0ed2dd03b94b7b7f66e23f25073b5385d0416589 (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.c | 5 | ||||
-rw-r--r-- | net/ceph/osd_client.c | 3 | ||||
-rw-r--r-- | net/netfilter/xt_recent.c | 3 | ||||
-rw-r--r-- | net/sctp/endpointola.c | 4 |
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 | ||