am7xxx_get_device_info() was not covering the case of a non-NULL output
parameter on the very first invocation, this case would not usually
happen in normal operation, but the problem was there: in that case the
output device_info structure would have contained garbage, as spotted by
the static analyzer:
.../src/am7xxx.c:1279:21: warning: The right operand of '<=' is a garbage value
original_width <= device_info.native_width &&
^ ~~~~~~~~~~~~~~~~~~~~~~~~
.../src/am7xxx.c:1288:39: warning: The right operand of '/' is a garbage value
width_ratio = (float)original_width / device_info.native_width;
^ ~~~~~~~~~~~~~~~~~~~~~~~~
While at it also fix the symmetric case of a NULL output parameter on
subsequent invocation: check that the output argument is non-NULL before
memcpy-ing to it.
int ret;
struct am7xxx_header h;
int ret;
struct am7xxx_header h;
- if (dev->device_info) {
- memcpy(device_info, dev->device_info, sizeof(*device_info));
- return 0;
- }
+ /* if there is a cached copy of the device info, just return that */
+ if (dev->device_info)
+ goto return_value;
ret = send_command(dev, AM7XXX_PACKET_TYPE_DEVINFO);
if (ret < 0)
ret = send_command(dev, AM7XXX_PACKET_TYPE_DEVINFO);
if (ret < 0)
dev->device_info->unknown1 = h.header_data.devinfo.unknown1;
#endif
dev->device_info->unknown1 = h.header_data.devinfo.unknown1;
#endif
+return_value:
+ if (device_info)
+ memcpy(device_info, dev->device_info, sizeof(*device_info));