summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Zieba <robertzieba@google.com>2023-01-18 23:09:59 +0000
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-01-19 18:04:39 +0000
commita8a41843c7950657f4674e7cfa110d36bec5e48a (patch)
tree5eac9c2c7bc7c4468c9990acb70df9803dc114f5
parente35e2da998fbff3693229d62cacd41c77507a58a (diff)
downloadchrome-ec-a8a41843c7950657f4674e7cfa110d36bec5e48a.tar.gz
zephyr/shim/led_driver: Add EC_LED_COLOR_INVALID enum value
The ARM EABI uses `-fshort-enums` by default. This causes `enum ec_led_colors` to be represented as a `uint8_t`. This can cause issues with the off LED state which is supposed to use -1 for its color. However, its color ends up as 255 instead. This can cause buffer overflows in the LED code. Add `EC_LED_COLOR_INVALID` to cause the enum to be represented as a signed integer and update existing code to use this value instead of a plain -1. BRANCH=none BUG=b:260547985 TEST=Successfully ran LED factory test Change-Id: Ibc5fd1d46ad408b6e94dc1c3a9b01f269ac8ba7e Signed-off-by: Robert Zieba <robertzieba@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4179359 Tested-by: Elthan Huang <elthan_huang@compal.corp-partner.google.com> Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r--include/ec_commands.h1
-rw-r--r--zephyr/shim/src/led_driver/led_gpio.c5
-rw-r--r--zephyr/shim/src/led_driver/led_pwm.c5
3 files changed, 7 insertions, 4 deletions
diff --git a/include/ec_commands.h b/include/ec_commands.h
index 737bcbb77a..66192d8e9f 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -2471,6 +2471,7 @@ enum ec_led_id {
#define EC_LED_FLAGS_AUTO BIT(1) /* Switch LED back to automatic control */
enum ec_led_colors {
+ EC_LED_COLOR_INVALID = -1,
EC_LED_COLOR_RED = 0,
EC_LED_COLOR_GREEN,
EC_LED_COLOR_BLUE,
diff --git a/zephyr/shim/src/led_driver/led_gpio.c b/zephyr/shim/src/led_driver/led_gpio.c
index d6af1772c2..485383402c 100644
--- a/zephyr/shim/src/led_driver/led_gpio.c
+++ b/zephyr/shim/src/led_driver/led_gpio.c
@@ -85,7 +85,7 @@ void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
for (int i = 0; i < ARRAY_SIZE(pins_node); i++) {
int br_color = pins_node[i]->br_color;
- if (br_color != -1)
+ if (br_color != EC_LED_COLOR_INVALID)
brightness_range[br_color] = 1;
}
}
@@ -97,7 +97,8 @@ int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
for (int i = 0; i < ARRAY_SIZE(pins_node); i++) {
int br_color = pins_node[i]->br_color;
- if ((br_color != -1) && (brightness[br_color] != 0)) {
+ if (br_color != EC_LED_COLOR_INVALID &&
+ brightness[br_color] != 0) {
color_set = true;
led_set_color(pins_node[i]->led_color, led_id);
}
diff --git a/zephyr/shim/src/led_driver/led_pwm.c b/zephyr/shim/src/led_driver/led_pwm.c
index 9fcafeea53..db6310ca22 100644
--- a/zephyr/shim/src/led_driver/led_pwm.c
+++ b/zephyr/shim/src/led_driver/led_pwm.c
@@ -107,7 +107,7 @@ void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range)
continue;
}
- if (br_color != -1) {
+ if (br_color != EC_LED_COLOR_INVALID) {
brightness_range[br_color] = 100;
}
}
@@ -124,7 +124,8 @@ int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness)
continue;
}
- if ((br_color != -1) && (brightness[br_color] != 0)) {
+ if (br_color != EC_LED_COLOR_INVALID &&
+ brightness[br_color] != 0) {
color_set = true;
led_set_color(pins_node[i]->led_color, led_id);
}