* [PATCH v3 0/2] nvmem: Add support for write-only instances, and clean-up @ 2020-03-09 17:49 Nicholas Johnson 2020-03-09 17:49 ` [PATCH v3 1/2] nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition Nicholas Johnson 2020-03-09 17:50 ` [PATCH v3 2/2] nvmem: Add support for write-only instances Nicholas Johnson 0 siblings, 2 replies; 6+ messages in thread From: Nicholas Johnson @ 2020-03-09 17:49 UTC (permalink / raw) To: linux-kernel; +Cc: Mika Westerberg, Srinivas Kandagatla, Nicholas Johnson Hello all, Previous version: https://lkml.org/lkml/2020/3/2/693 Changed since previous version: - Fixed memory leak when returning from nvmem_register(). - The patch 2/3 from last time was applied by Srinivas, so dropping it: https://lkml.org/lkml/2020/3/5/616 - I split the patches into two as I said I would. - Mika Westerberg asked me to send patch 3/3 to him again after v5.7-rc1 is released, so drop it for now: https://lore.kernel.org/lkml/20200306053455.GY2540@lahna.fi.intel.com/ - Removed comment from last return in nvmem_sysfs_get_groups() to avoid confusion. Nicholas Johnson (2): nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition nvmem: Add support for write-only instances drivers/nvmem/core.c | 4 +++ drivers/nvmem/nvmem-sysfs.c | 56 +++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 8 deletions(-) -- 2.25.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 1/2] nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition 2020-03-09 17:49 [PATCH v3 0/2] nvmem: Add support for write-only instances, and clean-up Nicholas Johnson @ 2020-03-09 17:49 ` Nicholas Johnson 2020-03-10 13:10 ` Srinivas Kandagatla 2020-03-09 17:50 ` [PATCH v3 2/2] nvmem: Add support for write-only instances Nicholas Johnson 1 sibling, 1 reply; 6+ messages in thread From: Nicholas Johnson @ 2020-03-09 17:49 UTC (permalink / raw) To: linux-kernel; +Cc: Mika Westerberg, Srinivas Kandagatla, Nicholas Johnson Currently, nvmem_register() does not check for NULL return from nvmem_sysfs_get_groups(), and hence nvmem_sysfs_get_groups() has to always return a valid group, even if it is given invalid inputs. Add check in nvmem_register() to return an error if NULL group is given. Signed-off-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> --- drivers/nvmem/core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index ef326f243..f6cd8a56a 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -388,6 +388,10 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) config->read_only || !nvmem->reg_write; nvmem->dev.groups = nvmem_sysfs_get_groups(nvmem, config); + if (!nvmem->dev.groups) { + kfree(nvmem); + return ERR_PTR(-EPERM); + } device_initialize(&nvmem->dev); -- 2.25.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 1/2] nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition 2020-03-09 17:49 ` [PATCH v3 1/2] nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition Nicholas Johnson @ 2020-03-10 13:10 ` Srinivas Kandagatla 0 siblings, 0 replies; 6+ messages in thread From: Srinivas Kandagatla @ 2020-03-10 13:10 UTC (permalink / raw) To: Nicholas Johnson, linux-kernel; +Cc: Mika Westerberg On 09/03/2020 17:49, Nicholas Johnson wrote: > Currently, nvmem_register() does not check for NULL return from > nvmem_sysfs_get_groups(), and hence nvmem_sysfs_get_groups() has to > always return a valid group, even if it is given invalid inputs. > > Add check in nvmem_register() to return an error if NULL group is given. > > Signed-off-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> > --- > drivers/nvmem/core.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c > index ef326f243..f6cd8a56a 100644 > --- a/drivers/nvmem/core.c > +++ b/drivers/nvmem/core.c > @@ -388,6 +388,10 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) > config->read_only || !nvmem->reg_write; > > nvmem->dev.groups = nvmem_sysfs_get_groups(nvmem, config); Code as it today will never return null so this patch belongs to the next patch where its possible to return null. > + if (!nvmem->dev.groups) { > + kfree(nvmem); This is still leaking few more things here! > + return ERR_PTR(-EPERM); Error code hear does not really reflect why it failed, we should return -EINVAL indicating that its invalid configuration. --srini > + } > > device_initialize(&nvmem->dev); > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3 2/2] nvmem: Add support for write-only instances 2020-03-09 17:49 [PATCH v3 0/2] nvmem: Add support for write-only instances, and clean-up Nicholas Johnson 2020-03-09 17:49 ` [PATCH v3 1/2] nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition Nicholas Johnson @ 2020-03-09 17:50 ` Nicholas Johnson 2020-03-10 1:10 ` Nicholas Johnson 2020-03-10 2:45 ` Nicholas Johnson 1 sibling, 2 replies; 6+ messages in thread From: Nicholas Johnson @ 2020-03-09 17:50 UTC (permalink / raw) To: linux-kernel; +Cc: Mika Westerberg, Srinivas Kandagatla, Nicholas Johnson There is at least one real-world use-case for write-only nvmem instances. Refer to 03cd45d2e219 ("thunderbolt: Prevent crash if non-active NVMem file is read"). Add support for write-only nvmem instances by adding attrs for 0200. Change nvmem_register() to abort if NULL group is returned from nvmem_sysfs_get_groups(). Return NULL from nvmem_sysfs_get_groups() in invalid cases. Signed-off-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> --- drivers/nvmem/nvmem-sysfs.c | 56 +++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c index 9e0c429cd..846112786 100644 --- a/drivers/nvmem/nvmem-sysfs.c +++ b/drivers/nvmem/nvmem-sysfs.c @@ -196,16 +196,49 @@ static const struct attribute_group *nvmem_ro_root_dev_groups[] = { NULL, }; +/* write only permission, root only */ +static struct bin_attribute bin_attr_wo_root_nvmem = { + .attr = { + .name = "nvmem", + .mode = 0200, + }, + .write = bin_attr_nvmem_write, +}; + +static struct bin_attribute *nvmem_bin_wo_root_attributes[] = { + &bin_attr_wo_root_nvmem, + NULL, +}; + +static const struct attribute_group nvmem_bin_wo_root_group = { + .bin_attrs = nvmem_bin_wo_root_attributes, + .attrs = nvmem_attrs, +}; + +static const struct attribute_group *nvmem_wo_root_dev_groups[] = { + &nvmem_bin_wo_root_group, + NULL, +}; + const struct attribute_group **nvmem_sysfs_get_groups( struct nvmem_device *nvmem, const struct nvmem_config *config) { - if (config->root_only) - return nvmem->read_only ? - nvmem_ro_root_dev_groups : - nvmem_rw_root_dev_groups; + /* Read-only */ + if (nvmem->reg_read && (!nvmem->reg_write || nvmem->read_only)) + return config->root_only ? + nvmem_ro_root_dev_groups : nvmem_ro_dev_groups; + + /* Read-write */ + if (nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) + return config->root_only ? + nvmem_rw_root_dev_groups : nvmem_rw_dev_groups; - return nvmem->read_only ? nvmem_ro_dev_groups : nvmem_rw_dev_groups; + /* Write-only, do not honour request for global writable entry */ + if (!nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) + return config->root_only ? nvmem_wo_root_dev_groups : NULL; + + return NULL; } /* @@ -224,17 +257,24 @@ int nvmem_sysfs_setup_compat(struct nvmem_device *nvmem, if (!config->base_dev) return -EINVAL; - if (nvmem->read_only) { + if (nvmem->reg_read && (!nvmem->reg_write || nvmem->read_only)) { if (config->root_only) nvmem->eeprom = bin_attr_ro_root_nvmem; else nvmem->eeprom = bin_attr_ro_nvmem; - } else { + } else if (!nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) { + if (config->root_only) + nvmem->eeprom = bin_attr_wo_root_nvmem; + else + return -EPERM; + } else if (nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) { if (config->root_only) nvmem->eeprom = bin_attr_rw_root_nvmem; else nvmem->eeprom = bin_attr_rw_nvmem; - } + } else + return -EPERM; + nvmem->eeprom.attr.name = "eeprom"; nvmem->eeprom.size = nvmem->size; #ifdef CONFIG_DEBUG_LOCK_ALLOC -- 2.25.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/2] nvmem: Add support for write-only instances 2020-03-09 17:50 ` [PATCH v3 2/2] nvmem: Add support for write-only instances Nicholas Johnson @ 2020-03-10 1:10 ` Nicholas Johnson 2020-03-10 2:45 ` Nicholas Johnson 1 sibling, 0 replies; 6+ messages in thread From: Nicholas Johnson @ 2020-03-10 1:10 UTC (permalink / raw) To: linux-kernel; +Cc: Mika Westerberg, Srinivas Kandagatla On Mon, Mar 09, 2020 at 05:50:17PM +0000, Nicholas Johnson wrote: > There is at least one real-world use-case for write-only nvmem > instances. Refer to 03cd45d2e219 ("thunderbolt: Prevent crash if > non-active NVMem file is read"). > > Add support for write-only nvmem instances by adding attrs for 0200. > > Change nvmem_register() to abort if NULL group is returned from > nvmem_sysfs_get_groups(). > > Return NULL from nvmem_sysfs_get_groups() in invalid cases. Oops, late night. Please drop the above line if you accept this. This above line applies to patch 1/2 now. > > Signed-off-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> > --- > drivers/nvmem/nvmem-sysfs.c | 56 +++++++++++++++++++++++++++++++------ > 1 file changed, 48 insertions(+), 8 deletions(-) > > diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c > index 9e0c429cd..846112786 100644 > --- a/drivers/nvmem/nvmem-sysfs.c > +++ b/drivers/nvmem/nvmem-sysfs.c > @@ -196,16 +196,49 @@ static const struct attribute_group *nvmem_ro_root_dev_groups[] = { > NULL, > }; > > +/* write only permission, root only */ > +static struct bin_attribute bin_attr_wo_root_nvmem = { > + .attr = { > + .name = "nvmem", > + .mode = 0200, > + }, > + .write = bin_attr_nvmem_write, > +}; > + > +static struct bin_attribute *nvmem_bin_wo_root_attributes[] = { > + &bin_attr_wo_root_nvmem, > + NULL, > +}; > + > +static const struct attribute_group nvmem_bin_wo_root_group = { > + .bin_attrs = nvmem_bin_wo_root_attributes, > + .attrs = nvmem_attrs, > +}; > + > +static const struct attribute_group *nvmem_wo_root_dev_groups[] = { > + &nvmem_bin_wo_root_group, > + NULL, > +}; > + > const struct attribute_group **nvmem_sysfs_get_groups( > struct nvmem_device *nvmem, > const struct nvmem_config *config) > { > - if (config->root_only) > - return nvmem->read_only ? > - nvmem_ro_root_dev_groups : > - nvmem_rw_root_dev_groups; > + /* Read-only */ > + if (nvmem->reg_read && (!nvmem->reg_write || nvmem->read_only)) > + return config->root_only ? > + nvmem_ro_root_dev_groups : nvmem_ro_dev_groups; > + > + /* Read-write */ > + if (nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) > + return config->root_only ? > + nvmem_rw_root_dev_groups : nvmem_rw_dev_groups; > > - return nvmem->read_only ? nvmem_ro_dev_groups : nvmem_rw_dev_groups; > + /* Write-only, do not honour request for global writable entry */ > + if (!nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) > + return config->root_only ? nvmem_wo_root_dev_groups : NULL; > + > + return NULL; > } > > /* > @@ -224,17 +257,24 @@ int nvmem_sysfs_setup_compat(struct nvmem_device *nvmem, > if (!config->base_dev) > return -EINVAL; > > - if (nvmem->read_only) { > + if (nvmem->reg_read && (!nvmem->reg_write || nvmem->read_only)) { > if (config->root_only) > nvmem->eeprom = bin_attr_ro_root_nvmem; > else > nvmem->eeprom = bin_attr_ro_nvmem; > - } else { > + } else if (!nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) { > + if (config->root_only) > + nvmem->eeprom = bin_attr_wo_root_nvmem; > + else > + return -EPERM; > + } else if (nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) { > if (config->root_only) > nvmem->eeprom = bin_attr_rw_root_nvmem; > else > nvmem->eeprom = bin_attr_rw_nvmem; > - } > + } else > + return -EPERM; > + > nvmem->eeprom.attr.name = "eeprom"; > nvmem->eeprom.size = nvmem->size; > #ifdef CONFIG_DEBUG_LOCK_ALLOC > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3 2/2] nvmem: Add support for write-only instances 2020-03-09 17:50 ` [PATCH v3 2/2] nvmem: Add support for write-only instances Nicholas Johnson 2020-03-10 1:10 ` Nicholas Johnson @ 2020-03-10 2:45 ` Nicholas Johnson 1 sibling, 0 replies; 6+ messages in thread From: Nicholas Johnson @ 2020-03-10 2:45 UTC (permalink / raw) To: linux-kernel; +Cc: Mika Westerberg, Srinivas Kandagatla On Mon, Mar 09, 2020 at 05:50:17PM +0000, Nicholas Johnson wrote: > There is at least one real-world use-case for write-only nvmem > instances. Refer to 03cd45d2e219 ("thunderbolt: Prevent crash if > non-active NVMem file is read"). > > Add support for write-only nvmem instances by adding attrs for 0200. > > Change nvmem_register() to abort if NULL group is returned from > nvmem_sysfs_get_groups(). Sorry, this is the comment to remove which only applies to patch 1/2. Disregard the past message. I will try to get more sleep. > > Return NULL from nvmem_sysfs_get_groups() in invalid cases. Keep this one. Cheers > > Signed-off-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> > --- > drivers/nvmem/nvmem-sysfs.c | 56 +++++++++++++++++++++++++++++++------ > 1 file changed, 48 insertions(+), 8 deletions(-) > > diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c > index 9e0c429cd..846112786 100644 > --- a/drivers/nvmem/nvmem-sysfs.c > +++ b/drivers/nvmem/nvmem-sysfs.c > @@ -196,16 +196,49 @@ static const struct attribute_group *nvmem_ro_root_dev_groups[] = { > NULL, > }; > > +/* write only permission, root only */ > +static struct bin_attribute bin_attr_wo_root_nvmem = { > + .attr = { > + .name = "nvmem", > + .mode = 0200, > + }, > + .write = bin_attr_nvmem_write, > +}; > + > +static struct bin_attribute *nvmem_bin_wo_root_attributes[] = { > + &bin_attr_wo_root_nvmem, > + NULL, > +}; > + > +static const struct attribute_group nvmem_bin_wo_root_group = { > + .bin_attrs = nvmem_bin_wo_root_attributes, > + .attrs = nvmem_attrs, > +}; > + > +static const struct attribute_group *nvmem_wo_root_dev_groups[] = { > + &nvmem_bin_wo_root_group, > + NULL, > +}; > + > const struct attribute_group **nvmem_sysfs_get_groups( > struct nvmem_device *nvmem, > const struct nvmem_config *config) > { > - if (config->root_only) > - return nvmem->read_only ? > - nvmem_ro_root_dev_groups : > - nvmem_rw_root_dev_groups; > + /* Read-only */ > + if (nvmem->reg_read && (!nvmem->reg_write || nvmem->read_only)) > + return config->root_only ? > + nvmem_ro_root_dev_groups : nvmem_ro_dev_groups; > + > + /* Read-write */ > + if (nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) > + return config->root_only ? > + nvmem_rw_root_dev_groups : nvmem_rw_dev_groups; > > - return nvmem->read_only ? nvmem_ro_dev_groups : nvmem_rw_dev_groups; > + /* Write-only, do not honour request for global writable entry */ > + if (!nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) > + return config->root_only ? nvmem_wo_root_dev_groups : NULL; > + > + return NULL; > } > > /* > @@ -224,17 +257,24 @@ int nvmem_sysfs_setup_compat(struct nvmem_device *nvmem, > if (!config->base_dev) > return -EINVAL; > > - if (nvmem->read_only) { > + if (nvmem->reg_read && (!nvmem->reg_write || nvmem->read_only)) { > if (config->root_only) > nvmem->eeprom = bin_attr_ro_root_nvmem; > else > nvmem->eeprom = bin_attr_ro_nvmem; > - } else { > + } else if (!nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) { > + if (config->root_only) > + nvmem->eeprom = bin_attr_wo_root_nvmem; > + else > + return -EPERM; > + } else if (nvmem->reg_read && nvmem->reg_write && !nvmem->read_only) { > if (config->root_only) > nvmem->eeprom = bin_attr_rw_root_nvmem; > else > nvmem->eeprom = bin_attr_rw_nvmem; > - } > + } else > + return -EPERM; > + > nvmem->eeprom.attr.name = "eeprom"; > nvmem->eeprom.size = nvmem->size; > #ifdef CONFIG_DEBUG_LOCK_ALLOC > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-03-10 13:10 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-03-09 17:49 [PATCH v3 0/2] nvmem: Add support for write-only instances, and clean-up Nicholas Johnson 2020-03-09 17:49 ` [PATCH v3 1/2] nvmem: Allow nvmem_sysfs_get_groups() to return NULL as error condition Nicholas Johnson 2020-03-10 13:10 ` Srinivas Kandagatla 2020-03-09 17:50 ` [PATCH v3 2/2] nvmem: Add support for write-only instances Nicholas Johnson 2020-03-10 1:10 ` Nicholas Johnson 2020-03-10 2:45 ` Nicholas Johnson
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.