projects
/
visomat-utils.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
visomat-data-downloader: more precise data validation in decode_eeprom()
[visomat-utils.git]
/
src
/
visomat-data-downloader.c
diff --git
a/src/visomat-data-downloader.c
b/src/visomat-data-downloader.c
index
b0a8007
..
a53f72c
100644
(file)
--- a/
src/visomat-data-downloader.c
+++ b/
src/visomat-data-downloader.c
@@
-71,7
+71,7
@@
struct pressure {
unsigned int pulses;
};
unsigned int pulses;
};
-static inline int extract_datetime(u
nsigned char
*buffer, struct datetime *d)
+static inline int extract_datetime(u
int8_t
*buffer, struct datetime *d)
{
int ret;
{
int ret;
@@
-120,7
+120,7
@@
static void print_record_csv_compat(struct datetime *d, struct pressure *p)
}
/* TODO: it would be better to separate decoding data from printing it */
}
/* TODO: it would be better to separate decoding data from printing it */
-static int decode_eeprom(u
nsigned char
*buffer,
+static int decode_eeprom(u
int8_t
*buffer,
unsigned int len,
unsigned int user_mask)
{
unsigned int len,
unsigned int user_mask)
{
@@
-133,8
+133,15
@@
static int decode_eeprom(unsigned char *buffer,
struct datetime d;
struct pressure p;
struct datetime d;
struct pressure p;
- if (buffer[0] != STX || buffer[1] != 'M' || buffer[len - 1] != ETX)
+ if (buffer[0] != STX || buffer[1] != 'M') {
+ fprintf(stderr, "Usupported data.\n");
return -EINVAL;
return -EINVAL;
+ }
+
+ if (buffer[len - 1] != ETX) {
+ fprintf(stderr, "Bad terminator in data. Buffer too small?\n");
+ return -EINVAL;
+ }
/* skip the initial STX */
i = 1;
/* skip the initial STX */
i = 1;
@@
-196,12
+203,12
@@
static int decode_eeprom(unsigned char *buffer,
return 0;
}
return 0;
}
-static int decode_datetime(u
nsigned char
*buffer, unsigned int len)
+static int decode_datetime(u
int8_t
*buffer, unsigned int len)
{
int ret;
{
int ret;
- u
nsigned char
code[4] = { 0 };
+ u
int8_t
code[4] = { 0 };
struct datetime d;
struct datetime d;
- u
nsigned char
*pbuffer = buffer;
+ u
int8_t
*pbuffer = buffer;
if (len != 15)
return -EINVAL;
if (len != 15)
return -EINVAL;
@@
-224,7
+231,7
@@
static int send_command(libusb_device_handle *dev, visomat_command cmd)
{
int ret;
int transferred;
{
int ret;
int transferred;
- u
nsigned char
request[5];
+ u
int8_t
request[5];
request[0] = STX;
request[1] = command_codes[cmd][0];
request[0] = STX;
request[1] = command_codes[cmd][0];
@@
-243,12
+250,12
@@
static int send_command(libusb_device_handle *dev, visomat_command cmd)
}
static int get_response(libusb_device_handle *dev,
}
static int get_response(libusb_device_handle *dev,
- u
nsigned char
*buffer,
+ u
int8_t
*buffer,
unsigned int len)
{
int ret;
int transferred;
unsigned int len)
{
int ret;
int transferred;
- u
nsigned char
response[64] = { 0 };
+ u
int8_t
response[64] = { 0 };
unsigned int i;
i = 0;
unsigned int i;
i = 0;
@@
-282,7
+289,7
@@
static int get_response(libusb_device_handle *dev,
static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
{
/* Assuming an EEPROM of 1 KiB */
static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
{
/* Assuming an EEPROM of 1 KiB */
- u
nsigned char
buffer[1024] = { 0 };
+ u
int8_t
buffer[1024] = { 0 };
int ret;
ret = send_command(dev, VISOMAT_CMD_DUMP_EEPROM);
int ret;
ret = send_command(dev, VISOMAT_CMD_DUMP_EEPROM);
@@
-302,7
+309,7
@@
static int visomat_dump_eeprom(visomat_device *dev, unsigned int user_mask)
static int visomat_get_datetime(visomat_device *dev)
{
static int visomat_get_datetime(visomat_device *dev)
{
- u
nsigned char
buffer[255] = { 0 };
+ u
int8_t
buffer[255] = { 0 };
int ret;
ret = send_command(dev, VISOMAT_CMD_GET_DATETIME);
int ret;
ret = send_command(dev, VISOMAT_CMD_GET_DATETIME);
@@
-386,7
+393,7
@@
int main(void)
}
if (current_configuration != VISOMAT_CONFIGURATION) {
}
if (current_configuration != VISOMAT_CONFIGURATION) {
- fprintf(stderr, "libusb configuration changed (expected: %d, current: %d\n",
+ fprintf(stderr, "libusb configuration changed (expected: %d, current: %d
)
\n",
VISOMAT_CONFIGURATION, current_configuration);
ret = -EINVAL;
goto out_libusb_release_interface;
VISOMAT_CONFIGURATION, current_configuration);
ret = -EINVAL;
goto out_libusb_release_interface;