Commit cecf7560 authored by Tom Rix's avatar Tom Rix Committed by Guenter Roeck
Browse files

hwmon: (applesmc) check status earlier.



clang static analysis reports this representative problem

applesmc.c:758:10: warning: 1st function call argument is an
  uninitialized value
        left = be16_to_cpu(*(__be16 *)(buffer + 6)) >> 2;
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

buffer is filled by the earlier call

	ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, ...

This problem is reported because a goto skips the status check.
Other similar problems use data from applesmc_read_key before checking
the status.  So move the checks to before the use.

Signed-off-by: default avatarTom Rix <trix@redhat.com>
Reviewed-by: default avatarHenrik Rydberg <rydberg@bitmath.org>
Link: https://lore.kernel.org/r/20200820131932.10590-1-trix@redhat.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 8aebbbb2
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -753,15 +753,18 @@ static ssize_t applesmc_light_show(struct device *dev,
	}

	ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, data_length);
	if (ret)
		goto out;
	/* newer macbooks report a single 10-bit bigendian value */
	if (data_length == 10) {
		left = be16_to_cpu(*(__be16 *)(buffer + 6)) >> 2;
		goto out;
	}
	left = buffer[2];

	ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, data_length);
	if (ret)
		goto out;
	ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, data_length);
	right = buffer[2];

out:
@@ -810,11 +813,10 @@ static ssize_t applesmc_show_fan_speed(struct device *dev,
		  to_index(attr));

	ret = applesmc_read_key(newkey, buffer, 2);
	speed = ((buffer[0] << 8 | buffer[1]) >> 2);

	if (ret)
		return ret;
	else

	speed = ((buffer[0] << 8 | buffer[1]) >> 2);
	return snprintf(sysfsbuf, PAGE_SIZE, "%u\n", speed);
}

@@ -851,11 +853,10 @@ static ssize_t applesmc_show_fan_manual(struct device *dev,
	u8 buffer[2];

	ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
	manual = ((buffer[0] << 8 | buffer[1]) >> to_index(attr)) & 0x01;

	if (ret)
		return ret;
	else

	manual = ((buffer[0] << 8 | buffer[1]) >> to_index(attr)) & 0x01;
	return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", manual);
}

@@ -872,10 +873,11 @@ static ssize_t applesmc_store_fan_manual(struct device *dev,
		return -EINVAL;

	ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
	val = (buffer[0] << 8 | buffer[1]);
	if (ret)
		goto out;

	val = (buffer[0] << 8 | buffer[1]);

	if (input)
		val = val | (0x01 << to_index(attr));
	else
@@ -951,12 +953,11 @@ static ssize_t applesmc_key_count_show(struct device *dev,
	u32 count;

	ret = applesmc_read_key(KEY_COUNT_KEY, buffer, 4);
	count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
						((u32)buffer[2]<<8) + buffer[3];

	if (ret)
		return ret;
	else

	count = ((u32)buffer[0]<<24) + ((u32)buffer[1]<<16) +
						((u32)buffer[2]<<8) + buffer[3];
	return snprintf(sysfsbuf, PAGE_SIZE, "%d\n", count);
}