Commit 1c832674 authored by Alban Bedel's avatar Alban Bedel Committed by Greg Kroah-Hartman
Browse files

nvmem: core: Fix cell lookup when no cell is found



If the cell list is not empty and nvmem_find_cell_by_node/name() is
called for a cell that is not present in the list they will return an
invalid pointer instead of NULL. This happen because
list_for_each_entry() stop once it reach the list head again, but as
the list head is not contained in a struct nvmem_cell the iteration
variable then contains an invalid value.

This is easily solved by using a variable to iterate over the list and
one to return the cell found.

Signed-off-by: default avatarAlban Bedel <albeu@free.fr>
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5087cc19
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -525,13 +525,15 @@ static int nvmem_add_cells_from_table(struct nvmem_device *nvmem)
static struct nvmem_cell *
nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id)
{
	struct nvmem_cell *cell = NULL;
	struct nvmem_cell *iter, *cell = NULL;

	mutex_lock(&nvmem_mutex);
	list_for_each_entry(cell, &nvmem->cells, node) {
		if (strcmp(cell_id, cell->name) == 0)
	list_for_each_entry(iter, &nvmem->cells, node) {
		if (strcmp(cell_id, iter->name) == 0) {
			cell = iter;
			break;
		}
	}
	mutex_unlock(&nvmem_mutex);

	return cell;
@@ -994,13 +996,15 @@ nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
static struct nvmem_cell *
nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np)
{
	struct nvmem_cell *cell = NULL;
	struct nvmem_cell *iter, *cell = NULL;

	mutex_lock(&nvmem_mutex);
	list_for_each_entry(cell, &nvmem->cells, node) {
		if (np == cell->np)
	list_for_each_entry(iter, &nvmem->cells, node) {
		if (np == iter->np) {
			cell = iter;
			break;
		}
	}
	mutex_unlock(&nvmem_mutex);

	return cell;