gatt-service/bas_server: validate input params

This commit is contained in:
Milanka Ringwald 2024-09-25 17:45:38 +02:00 committed by Matthias Ringwald
parent e24f316c1b
commit de4a918b3a
2 changed files with 101 additions and 17 deletions

View File

@ -598,7 +598,6 @@ uint8_t battery_service_v1_server_set_battery_level(battery_service_v1_t * servi
if (battery_level > 100){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
if (service->battery_level != battery_level){
service->battery_level = battery_level;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_LEVEL);
@ -610,12 +609,11 @@ uint8_t battery_service_v1_server_set_battery_level_status(battery_service_v1_t
btstack_assert(service != NULL);
btstack_assert(battery_level_status != NULL);
if (battery_level_status->flags >= BATTERY_LEVEL_STATUS_BITMASK_RFU){
if ((battery_level_status->flags & BATTERY_LEVEL_STATUS_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
if ((battery_level_status->flags & BATTERY_LEVEL_STATUS_BITMASK_ADDITIONAL_STATUS_PRESENT) > 0u){
if (battery_level_status->additional_status_flags >= BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_RFU){
if ((battery_level_status->additional_status_flags & BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
@ -627,7 +625,11 @@ uint8_t battery_service_v1_server_set_battery_level_status(battery_service_v1_t
uint8_t battery_service_v1_server_set_estimated_service_date_days(battery_service_v1_t * service, uint32_t estimated_service_date_days){
btstack_assert(service != NULL);
if (estimated_service_date_days > 0xFFFFFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
service->estimated_service_date_days = estimated_service_date_days;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_ESTIMATED_SERVICE_DATE);
return ERROR_CODE_SUCCESS;
@ -636,6 +638,10 @@ uint8_t battery_service_v1_server_set_estimated_service_date_days(battery_servic
uint8_t battery_service_v1_server_set_critcal_status_flags(battery_service_v1_t * service, uint8_t critcal_status_flags){
btstack_assert(service != NULL);
if ((critcal_status_flags & BATTERY_CRITCAL_STATUS_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
service->critcal_status_flags = critcal_status_flags;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_CRITCAL_STATUS);
return ERROR_CODE_SUCCESS;
@ -645,6 +651,10 @@ uint8_t battery_service_v1_server_set_energy_status(battery_service_v1_t * servi
btstack_assert(service != NULL);
btstack_assert(energy_status != NULL);
if ((energy_status->flags & BATTERY_ENERGY_STATUS_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
service->energy_status = energy_status;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_ENERGY_STATUS);
return ERROR_CODE_SUCCESS;
@ -654,6 +664,23 @@ uint8_t battery_service_v1_server_set_time_status(battery_service_v1_t * service
btstack_assert(service != NULL);
btstack_assert(time_status != NULL);
if ((time_status->flags & BATTERY_TIME_STATUS_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
if (time_status->time_until_discharged_minutes > 0xFFFFFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
if ((time_status->flags & BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_DISCHARGED_ON_STANDBY_PRESENT) > 0u){
if (time_status->time_until_discharged_on_standby_minutes > 0xFFFFFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
if ((time_status->flags & BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_RECHARGED_PRESENT) > 0u){
if (time_status->time_until_recharged_minutes > 0xFFFFFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
service->time_status = time_status;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_TIME_STATUS);
return ERROR_CODE_SUCCESS;
@ -663,6 +690,15 @@ uint8_t battery_service_v1_server_set_health_status(battery_service_v1_t * servi
btstack_assert(service != NULL);
btstack_assert(health_status != NULL);
if ((health_status->flags & BATTERY_HEALTH_STATUS_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
if ((health_status->flags & BATTERY_HEALTH_STATUS_BITMASK_HEALTH_SUMMARY_PRESENT) > 0u){
if (health_status->summary > 100){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
service->health_status = health_status;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_HEALTH_STATUS);
return ERROR_CODE_SUCCESS;
@ -672,6 +708,10 @@ uint8_t battery_service_v1_server_set_health_information(battery_service_v1_t *
btstack_assert(service != NULL);
btstack_assert(health_information != NULL);
if ((health_information->flags & BATTERY_HEALTH_INFORMATION_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
service->health_information = health_information;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_HEALTH_INFORMATION);
return ERROR_CODE_SUCCESS;
@ -681,6 +721,30 @@ uint8_t battery_service_v1_server_set_information(battery_service_v1_t * service
btstack_assert(service != NULL);
btstack_assert(information != NULL);
if ((information->flags & BATTERY_HEALTH_INFORMATION_BITMASK_RFU) != 0u){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
if ((information->flags & BATTERY_INFORMATION_BITMASK_MANUFACTURE_DATE_PRESENT) > 0u){
if (information->manufacture_date_days > 0xFFFFFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
if ((information->flags & BATTERY_INFORMATION_BITMASK_EXPIRATION_DATE_PRESENT) > 0u){
if (information->expiration_date_days > 0xFFFFFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
if ((information->flags & BATTERY_INFORMATION_BITMASK_CHEMISTRY_PRESENT) > 0u){
if (information->chemistry >= BATTERY_CHEMISTRY_RFU_START || information->chemistry <= BATTERY_CHEMISTRY_RFU_END){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
if ((information->flags & BATTERY_INFORMATION_BITMASK_AGGREGATION_GROUP_PRESENT) > 0u){
if (information->aggregation_group == 0xFF){
return ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE;
}
}
service->information = information;
bas_server_set_callback(service, BAS_CHARACTERISTIC_INDEX_BATTERY_INFORMATION);
return ERROR_CODE_SUCCESS;

View File

@ -83,16 +83,16 @@ typedef enum {
#define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_BATTERY_CAPACITY_PRESENT 0x08
#define BATTERY_ENERGY_STATUS_BITMASK_CHARGE_RATE_PRESENT 0x10
#define BATTERY_ENERGY_STATUS_BITMASK_AVAILABLE_ENERGY_AT_LAST_CHARGE_PRESENT 0x20
#define BATTERY_ENERGY_STATUS_BITMASK_RFU 0x40
#define BATTERY_ENERGY_STATUS_BITMASK_RFU 0xC0
#define BATTERY_LEVEL_STATUS_BITMASK_IDENTIFIER_PRESENT 0x01
#define BATTERY_LEVEL_STATUS_BITMASK_BATTERY_LEVEL_PRESENT 0x02
#define BATTERY_LEVEL_STATUS_BITMASK_ADDITIONAL_STATUS_PRESENT 0x04
#define BATTERY_LEVEL_STATUS_BITMASK_RFU 0x08
#define BATTERY_LEVEL_STATUS_BITMASK_RFU 0xF8
#define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_SERVICE_REQUIRED 0x01 // 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU
#define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_BATTERY_FAULT 0x02 // 0 = No or Unknown, 1 = Yes
#define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_RFU 0x04
#define BATTERY_LEVEL_ADDITIONAL_STATUS_BITMASK_RFU 0xFC
#define BATTERY_LEVEL_POWER_STATE_BITMASK_EXTERNAL_BATTERY_PRESENT 0x0001 // 0 = No, 1 = Yes
#define BATTERY_LEVEL_POWER_STATE_BITMASK_WIRED_EXTERNAL_POWER_SOURCE_CONNECTED 0x0004 // 0 = No, 1 = Yes, 2 = Unknown, 3 = RFU
@ -101,25 +101,25 @@ typedef enum {
#define BATTERY_LEVEL_POWER_STATE_BITMASK_BATTERY_CHARGE_LEVEL 0x0100 // 0 = Unknown, 1 = Good, 2 = Low, 3 = Critical
#define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_TYPE 0x0400 // 0 = Unknown or Not Charging 1 = Constant Current, 2 = Constant Voltage, 3 = Trickle, 4 = Float, 57 = RFU
#define BATTERY_LEVEL_POWER_STATE_BITMASK_CHARGING_FAULT_REASON 0x2000 // Bit 12: Battery, Bit 13: External Power source, Bit 14: Other
#define BATTERY_LEVEL_POWER_STATE_BITMASK_RFU 0x4000
#define BATTERY_LEVEL_POWER_STATE_BITMASK_RFU 0xC000
#define BATTERY_CRITCAL_STATUS_BITMASK_CRITICAL_POWER_STATE 0x01
#define BATTERY_CRITCAL_STATUS_BITMASK_IMMEDIATE_SERVICE_REQUIRED 0x02
#define BATTERY_CRITCAL_STATUS_BITMASK_RFU 0x04
#define BATTERY_CRITCAL_STATUS_BITMASK_RFU 0xFC
#define BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_DISCHARGED_ON_STANDBY_PRESENT 0x01
#define BATTERY_TIME_STATUS_BITMASK_TIME_UNTIL_RECHARGED_PRESENT 0x02
#define BATTERY_TIME_STATUS_BITMASK_RFU 0x04
#define BATTERY_TIME_STATUS_BITMASK_RFU 0xFC
#define BATTERY_HEALTH_STATUS_BITMASK_HEALTH_SUMMARY_PRESENT 0x01
#define BATTERY_HEALTH_STATUS_BITMASK_CYCLE_COUNT_PRESENT 0x02
#define BATTERY_HEALTH_STATUS_BITMASK_CURRENT_TEMPERATURE_PRESENT 0x04
#define BATTERY_HEALTH_STATUS_BITMASK_DEEP_DISCHARGE_COUNT_PRESENT 0x08
#define BATTERY_HEALTH_STATUS_BITMASK_RFU 0x10
#define BATTERY_HEALTH_STATUS_BITMASK_RFU 0xF0
#define BATTERY_HEALTH_INFORMATION_BITMASK_CYCLE_COUNT_DESIGNED_LIFETIME_PRESENT 0x01
#define BATTERY_HEALTH_INFORMATION_BITMASK_DESIGNED_OPERATING_TEMPERATURE_PRESENT 0x02
#define BATTERY_HEALTH_INFORMATION_BITMASK_RFU 0x04
#define BATTERY_HEALTH_INFORMATION_BITMASK_RFU 0xFC
#define BATTERY_INFORMATION_BITMASK_MANUFACTURE_DATE_PRESENT 0x0001
#define BATTERY_INFORMATION_BITMASK_EXPIRATION_DATE_PRESENT 0x0002
@ -129,11 +129,11 @@ typedef enum {
#define BATTERY_INFORMATION_BITMASK_CHEMISTRY_PRESENT 0x0020
#define BATTERY_INFORMATION_BITMASK_NOMINAL_VOLTAGE_PRESENT 0x0040
#define BATTERY_INFORMATION_BITMASK_AGGREGATION_GROUP_PRESENT 0x0080
#define BATTERY_INFORMATION_BITMASK_RFU 0x0100
#define BATTERY_INFORMATION_BITMASK_RFU 0xFF00
#define BATTERY_INFROMATION_FEATURE_BITMASK_REPLACEABLE 0x01
#define BATTERY_INFROMATION_FEATURE_BITMASK_RECHARGEABLE 0x02
#define BATTERY_INFROMATION_FEATURE_BITMASK_RFU 0x04
#define BATTERY_INFROMATION_FEATURE_BITMASK_RFU 0xFC
struct battery_service_v1;
@ -200,6 +200,26 @@ typedef struct {
int8_t max_designed_operating_temperature_degree_celsius;
} battery_health_information_t;
typedef enum {
BATTERY_CHEMISTRY_UNKNOWN = 0,
BATTERY_CHEMISTRY_ALKALINE, // (ZINCMANGANESE DIOXIDE)
BATTERY_CHEMISTRY_LEAD_ACID,
BATTERY_CHEMISTRY_LITHIUM_LIFES2, // (LITHIUM-IRON DISULFIDE)
BATTERY_CHEMISTRY_LITHIUM_LIMNO2, // (LITHIUM-MANGANESE DIOXIDE)
BATTERY_CHEMISTRY_LITHIUM_ION_LI,
BATTERY_CHEMISTRY_LITHIUM_POLYMER,
BATTERY_CHEMISTRY_NICKEL_OXYHYDROXIDE_NIOX, // (ZINC-MANGANESE DIOXIDE/OXY NICKEL HYDROXIDE)
BATTERY_CHEMISTRY_NICKEL_CADMIUM_NICD,
BATTERY_CHEMISTRY_NICKEL_METAL_HYDRIDE_NIMH,
BATTERY_CHEMISTRY_SILVER_OXIDE_AGZN, // (SILVER-ZINC)
BATTERY_CHEMISTRY_ZINC_CHLORIDE,
BATTERY_CHEMISTRY_ZINC_AIR,
BATTERY_CHEMISTRY_ZINC_CARBON,
BATTERY_CHEMISTRY_RFU_START = 14,
BATTERY_CHEMISTRY_RFU_END = 254,
BATTERY_CHEMISTRY_OTHER = 255
} battery_chemistry_t;
typedef struct {
uint16_t flags;
uint8_t features;
@ -210,7 +230,7 @@ typedef struct {
uint16_t designed_capacity_kWh_medfloat16;
uint16_t low_energy_kWh_medfloat16;
uint16_t critical_energy_kWh_medfloat16;
uint8_t chemistry;
battery_chemistry_t chemistry;
uint16_t nominal_voltage_medfloat16;
uint8_t aggregation_group; // 0: not in group, 255: RFU
} battery_information_t;
@ -297,7 +317,7 @@ uint8_t battery_service_v1_server_set_battery_level(battery_service_v1_t * servi
uint8_t battery_service_v1_server_set_battery_level_status(battery_service_v1_t * service, const battery_level_status_t * battery_level_status);
/**
* @brief Update battery estimated service date
* @brief Update battery estimated service date as days elapsed since the Epoch (Jan 1, 1970)
* @note Triggers notification or indication if subscribed
* @param service
* @param estimated_service_date_days