diff options
author | Rong Chang <rongchang@chromium.org> | 2012-04-26 18:22:00 +0800 |
---|---|---|
committer | Rong Chang <rongchang@chromium.org> | 2012-04-27 16:06:49 +0800 |
commit | 6eafff7ed3978e300666d57e1cb1a55939569966 (patch) | |
tree | 149089435daa911d67466363bfd8de172a04e6e4 /util | |
parent | 31190cf21594f4ada3558693dab50ec6abb0d6b4 (diff) | |
download | chrome-ec-6eafff7ed3978e300666d57e1cb1a55939569966.tar.gz |
Fix ectool battery command corrupts characters
Signed-off-by: Rong Chang <rongchang@chromium.org>
BUG=chrome-os-partner:9152
TEST=manual
run latest ectool with old EC image
Change-Id: I09d4f6e8fcc131da227fc5a9c48291b08dfb6d19
Diffstat (limited to 'util')
-rw-r--r-- | util/ectool.c | 83 |
1 files changed, 66 insertions, 17 deletions
diff --git a/util/ectool.c b/util/ectool.c index 8b3b000fa5..bf4b20a030 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include <ctype.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> @@ -263,6 +264,25 @@ int read_mapped_string(uint8_t offset, char *buf) } +int is_string_printable(const char *buf) +{ + while (*buf) { + if (isprint(*buf)) + return 0; + buf++; + } + + return 1; +} + + +/* Check SBS numerical value range */ +int is_battery_range(int val) +{ + return (val >= 0 && val <= 65535) ? 1 : 0; +} + + void print_help(const char *prog) { printf("Usage: %s <command> [params]\n\n", prog); @@ -1312,41 +1332,70 @@ int cmd_switches(int argc, char *argv[]) int cmd_battery(int argc, char *argv[]) { char batt_text[EC_LPC_MEMMAP_TEXT_MAX]; - int rv; + int rv, val; printf("Battery info:\n"); rv = read_mapped_string(EC_LPC_MEMMAP_BATT_MFGR, batt_text); - if (rv) + if (rv) { + if (!is_string_printable(batt_text)) + goto cmd_error; printf(" OEM name: %s\n", batt_text); + } rv = read_mapped_string(EC_LPC_MEMMAP_BATT_MODEL, batt_text); - if (rv) + if (rv) { + if (!is_string_printable(batt_text)) + goto cmd_error; printf(" Model number: %s\n", batt_text); + } rv = read_mapped_string(EC_LPC_MEMMAP_BATT_TYPE, batt_text); - if (rv) + if (rv) { + if (!is_string_printable(batt_text)) + goto cmd_error; printf(" Chemistry : %s\n", batt_text); + } rv = read_mapped_string(EC_LPC_MEMMAP_BATT_SERIAL, batt_text); - if (rv) + if (rv) { + if (!is_string_printable(batt_text)) + goto cmd_error; printf(" Serial number: %s\n", batt_text); + } + + val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP); + if (!is_battery_range(val)) + goto cmd_error; + printf(" Design capacity: %u mAh\n", val); + + val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_LFCC); + if (!is_battery_range(val)) + goto cmd_error; + printf(" Last full charge: %u mAh\n", val); - printf(" Design capacity: %u mAh\n", - read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP)); - printf(" Last full charge: %u mAh\n", - read_mapped_mem32(EC_LPC_MEMMAP_BATT_LFCC)); - printf(" Design output voltage %u mV\n", - read_mapped_mem32(EC_LPC_MEMMAP_BATT_DVLT)); + val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_DVLT); + if (!is_battery_range(val)) + goto cmd_error; + printf(" Design output voltage %u mV\n", val); + + val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP); + if (!is_battery_range(val)) + goto cmd_error; printf(" Design capacity warning %u mAh\n", - read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP) * - BATTERY_LEVEL_WARNING / 100); + val * BATTERY_LEVEL_WARNING / 100); printf(" Design capacity low %u mAh\n", - read_mapped_mem32(EC_LPC_MEMMAP_BATT_DCAP) * - BATTERY_LEVEL_LOW / 100); - printf(" Cycle count %u\n", - read_mapped_mem32(EC_LPC_MEMMAP_BATT_CCNT)); + val * BATTERY_LEVEL_LOW / 100); + + val = read_mapped_mem32(EC_LPC_MEMMAP_BATT_CCNT); + if (!is_battery_range(val)) + goto cmd_error; + printf(" Cycle count %u\n", val); + return 0; +cmd_error: + fprintf(stderr, "Bad battery info value. Check protocol version."); + return -1; } int cmd_chipinfo(int argc, char *argv[]) |