Hi Rasmus, On Thu, Sep 27, 2018 at 12:55 PM Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> wrote: > On 2018-09-27 01:13, Kees Cook wrote: > > On Mon, Sep 24, 2018 at 3:11 AM, Bartosz Golaszewski <brgl@xxxxxxxx> wrote: > >> Provide a resource managed version of kstrdup_const(). This variant > >> internally calls devm_kstrdup() on pointers that are outside of > >> .rodata section and returns the string as is otherwise. > >> > >> Also provide a corresponding version of devm_kfree(). > >> > >> +/** > >> + * devm_kfree_const - Resource managed conditional kfree > >> + * @dev: device this memory belongs to > >> + * @p: memory to free > >> + * > >> + * Function calls devm_kfree only if @p is not in .rodata section. > >> + */ > >> +void devm_kfree_const(struct device *dev, const void *p) > >> +{ > >> + if (!is_kernel_rodata((unsigned long)p)) > >> + devm_kfree(dev, p); > >> +} > >> +EXPORT_SYMBOL(devm_kfree_const); > >> + > >> /** > >> * devm_kmemdup - Resource-managed kmemdup > >> * @dev: Device this memory belongs to > >> diff --git a/include/linux/device.h b/include/linux/device.h > >> index 33f7cb271fbb..79ccc6eb0975 100644 > >> --- a/include/linux/device.h > >> +++ b/include/linux/device.h > >> @@ -693,7 +693,10 @@ static inline void *devm_kcalloc(struct device *dev, > >> return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO); > >> } > >> extern void devm_kfree(struct device *dev, const void *p); > >> +extern void devm_kfree_const(struct device *dev, const void *p); > > > > With devm_kfree and devm_kfree_const both taking "const", how are > > devm_kstrdup_const() and devm_kfree_const() going to be correctly > > paired at compile time? (i.e. I wasn't expecting the prototype change > > to devm_kfree()) > > Just drop devm_kfree_const and teach devm_kfree to ignore > is_kernel_rodata(). That avoids the 50-100 bytes of overhead for adding > yet another EXPORT_SYMBOL and makes it easier to port drivers to > devm_kstrdup_const (and avoids the bugs Kees is worried about). devm > managed resources are almost never freed explicitly, so that single > extra comparison in devm_kfree shouldn't matter for performance. I guess we can also teach kfree() to ignore is_kernel_rodata(), and drop kfree_const()? Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds