Skip to content

Commit 809952d

Browse files
committed
mm/slab: make __free(kfree) accept error pointers
jira LE-3587 Rebuild_History Non-Buildable kernel-4.18.0-553.62.1.el8_10 commit-author Dan Carpenter <[email protected]> commit cd7eb8f Empty-Commit: Cherry-Pick Conflicts during history rebuild. Will be included in final tarball splat. Ref for failed cherry-pick at: ciq/ciq_backports/kernel-4.18.0-553.62.1.el8_10/cd7eb8f8.failed Currently, if an automatically freed allocation is an error pointer that will lead to a crash. An example of this is in wm831x_gpio_dbg_show(). 171 char *label __free(kfree) = gpiochip_dup_line_label(chip, i); 172 if (IS_ERR(label)) { 173 dev_err(wm831x->dev, "Failed to duplicate label\n"); 174 continue; 175 } The auto clean up function should check for error pointers as well, otherwise we're going to keep hitting issues like this. Fixes: 54da6a0 ("locking: Introduce __cleanup() based infrastructure") Cc: <[email protected]> Signed-off-by: Dan Carpenter <[email protected]> Acked-by: David Rientjes <[email protected]> Signed-off-by: Vlastimil Babka <[email protected]> (cherry picked from commit cd7eb8f) Signed-off-by: Jonathan Maple <[email protected]> # Conflicts: # include/linux/slab.h
1 parent 8aed90a commit 809952d

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
mm/slab: make __free(kfree) accept error pointers
2+
3+
jira LE-3587
4+
Rebuild_History Non-Buildable kernel-4.18.0-553.62.1.el8_10
5+
commit-author Dan Carpenter <[email protected]>
6+
commit cd7eb8f83fcf258f71e293f7fc52a70be8ed0128
7+
Empty-Commit: Cherry-Pick Conflicts during history rebuild.
8+
Will be included in final tarball splat. Ref for failed cherry-pick at:
9+
ciq/ciq_backports/kernel-4.18.0-553.62.1.el8_10/cd7eb8f8.failed
10+
11+
Currently, if an automatically freed allocation is an error pointer that
12+
will lead to a crash. An example of this is in wm831x_gpio_dbg_show().
13+
14+
171 char *label __free(kfree) = gpiochip_dup_line_label(chip, i);
15+
172 if (IS_ERR(label)) {
16+
173 dev_err(wm831x->dev, "Failed to duplicate label\n");
17+
174 continue;
18+
175 }
19+
20+
The auto clean up function should check for error pointers as well,
21+
otherwise we're going to keep hitting issues like this.
22+
23+
Fixes: 54da6a092431 ("locking: Introduce __cleanup() based infrastructure")
24+
25+
Signed-off-by: Dan Carpenter <[email protected]>
26+
Acked-by: David Rientjes <[email protected]>
27+
Signed-off-by: Vlastimil Babka <[email protected]>
28+
(cherry picked from commit cd7eb8f83fcf258f71e293f7fc52a70be8ed0128)
29+
Signed-off-by: Jonathan Maple <[email protected]>
30+
31+
# Conflicts:
32+
# include/linux/slab.h
33+
diff --cc include/linux/slab.h
34+
index 7cec7ba2bcd8,739b21262507..000000000000
35+
--- a/include/linux/slab.h
36+
+++ b/include/linux/slab.h
37+
@@@ -185,11 -261,12 +185,20 @@@ int kmem_cache_shrink(struct kmem_cach
38+
/*
39+
* Common kmalloc functions provided by all allocators
40+
*/
41+
++<<<<<<< HEAD
42+
+void * __must_check __krealloc(const void *, size_t, gfp_t);
43+
+void * __must_check krealloc(const void *, size_t, gfp_t);
44+
+void kfree(const void *);
45+
+void kfree_sensitive(const void *);
46+
+size_t __ksize(const void *);
47+
++=======
48+
+ void * __must_check krealloc(const void *objp, size_t new_size, gfp_t flags) __realloc_size(2);
49+
+ void kfree(const void *objp);
50+
+ void kfree_sensitive(const void *objp);
51+
+ size_t __ksize(const void *objp);
52+
+
53+
+ DEFINE_FREE(kfree, void *, if (!IS_ERR_OR_NULL(_T)) kfree(_T))
54+
++>>>>>>> cd7eb8f83fcf (mm/slab: make __free(kfree) accept error pointers)
55+
56+
/**
57+
* ksize - Report actual allocation size of associated object
58+
@@@ -772,9 -789,11 +781,14 @@@ static inline void *kvcalloc(size_t n,
59+
return kvmalloc_array(n, size, flags | __GFP_ZERO);
60+
}
61+
62+
-extern void *kvrealloc(const void *p, size_t oldsize, size_t newsize, gfp_t flags)
63+
- __realloc_size(3);
64+
+extern void *kvrealloc(const void *p, size_t oldsize, size_t newsize,
65+
+ gfp_t flags);
66+
extern void kvfree(const void *addr);
67+
++<<<<<<< HEAD
68+
++=======
69+
+ DEFINE_FREE(kvfree, void *, if (!IS_ERR_OR_NULL(_T)) kvfree(_T))
70+
+
71+
++>>>>>>> cd7eb8f83fcf (mm/slab: make __free(kfree) accept error pointers)
72+
extern void kvfree_sensitive(const void *addr, size_t len);
73+
74+
unsigned int kmem_cache_size(struct kmem_cache *s);
75+
* Unmerged path include/linux/slab.h

0 commit comments

Comments
 (0)