Просмотр исходного кода

Subghz: Adding checks for get_upload functions (#1704)

* Adding checks for get_upload functions
  Almost in every protocol, function which generates upload might fail and return false.
  But we don't check this result, which might end up sending random memory contents to the air.
* Format sources and fix crash on ivalid bit count in chamberlain

Co-authored-by: あく <alleteam@gmail.com>
Max Lapan 3 лет назад
Родитель
Сommit
3360f818a1

+ 1 - 1
lib/subghz/protocols/bett.c

@@ -173,7 +173,7 @@ bool subghz_protocol_encoder_bett_deserialize(void* context, FlipperFormat* flip
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_bett_get_upload(instance);
+        if(!subghz_protocol_encoder_bett_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/came.c

@@ -162,7 +162,7 @@ bool subghz_protocol_encoder_came_deserialize(void* context, FlipperFormat* flip
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_came_get_upload(instance);
+        if(!subghz_protocol_encoder_came_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 2 - 2
lib/subghz/protocols/chamberlain_code.c

@@ -155,7 +155,7 @@ static bool
         break;
 
     default:
-        furi_crash(TAG " unknown protocol.");
+        FURI_LOG_E(TAG, "Invalid bits count");
         return false;
         break;
     }
@@ -224,7 +224,7 @@ bool subghz_protocol_encoder_chamb_code_deserialize(void* context, FlipperFormat
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_chamb_code_get_upload(instance);
+        if(!subghz_protocol_encoder_chamb_code_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/clemsa.c

@@ -173,7 +173,7 @@ bool subghz_protocol_encoder_clemsa_deserialize(void* context, FlipperFormat* fl
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_clemsa_get_upload(instance);
+        if(!subghz_protocol_encoder_clemsa_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/doitrand.c

@@ -154,7 +154,7 @@ bool subghz_protocol_encoder_doitrand_deserialize(void* context, FlipperFormat*
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_doitrand_get_upload(instance);
+        if(!subghz_protocol_encoder_doitrand_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/gate_tx.c

@@ -147,7 +147,7 @@ bool subghz_protocol_encoder_gate_tx_deserialize(void* context, FlipperFormat* f
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_gate_tx_get_upload(instance);
+        if(!subghz_protocol_encoder_gate_tx_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/holtek.c

@@ -160,7 +160,7 @@ bool subghz_protocol_encoder_holtek_deserialize(void* context, FlipperFormat* fl
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_holtek_get_upload(instance);
+        if(!subghz_protocol_encoder_holtek_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/honeywell_wdb.c

@@ -162,7 +162,7 @@ bool subghz_protocol_encoder_honeywell_wdb_deserialize(
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_honeywell_wdb_get_upload(instance);
+        if(!subghz_protocol_encoder_honeywell_wdb_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/hormann.c

@@ -163,7 +163,7 @@ bool subghz_protocol_encoder_hormann_deserialize(void* context, FlipperFormat* f
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_hormann_get_upload(instance);
+        if(!subghz_protocol_encoder_hormann_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/intertechno_v3.c

@@ -179,7 +179,7 @@ bool subghz_protocol_encoder_intertechno_v3_deserialize(
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_intertechno_v3_get_upload(instance);
+        if(!subghz_protocol_encoder_intertechno_v3_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/keeloq.c

@@ -280,7 +280,7 @@ bool subghz_protocol_encoder_keeloq_deserialize(void* context, FlipperFormat* fl
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_keeloq_get_upload(instance, instance->generic.btn);
+        if(!subghz_protocol_encoder_keeloq_get_upload(instance, instance->generic.btn)) break;
 
         if(!flipper_format_rewind(flipper_format)) {
             FURI_LOG_E(TAG, "Rewind error");

+ 1 - 1
lib/subghz/protocols/linear.c

@@ -165,7 +165,7 @@ bool subghz_protocol_encoder_linear_deserialize(void* context, FlipperFormat* fl
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_linear_get_upload(instance);
+        if(!subghz_protocol_encoder_linear_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/magellen.c

@@ -168,7 +168,7 @@ bool subghz_protocol_encoder_magellen_deserialize(void* context, FlipperFormat*
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_magellen_get_upload(instance);
+        if(!subghz_protocol_encoder_magellen_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/megacode.c

@@ -193,7 +193,7 @@ bool subghz_protocol_encoder_megacode_deserialize(void* context, FlipperFormat*
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_megacode_get_upload(instance);
+        if(!subghz_protocol_encoder_megacode_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/nero_radio.c

@@ -172,7 +172,7 @@ bool subghz_protocol_encoder_nero_radio_deserialize(void* context, FlipperFormat
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_nero_radio_get_upload(instance);
+        if(!subghz_protocol_encoder_nero_radio_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/nero_sketch.c

@@ -166,7 +166,7 @@ bool subghz_protocol_encoder_nero_sketch_deserialize(void* context, FlipperForma
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_nero_sketch_get_upload(instance);
+        if(!subghz_protocol_encoder_nero_sketch_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/nice_flo.c

@@ -149,7 +149,7 @@ bool subghz_protocol_encoder_nice_flo_deserialize(void* context, FlipperFormat*
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_nice_flo_get_upload(instance);
+        if(!subghz_protocol_encoder_nice_flo_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/phoenix_v2.c

@@ -150,7 +150,7 @@ bool subghz_protocol_encoder_phoenix_v2_deserialize(void* context, FlipperFormat
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_phoenix_v2_get_upload(instance);
+        if(!subghz_protocol_encoder_phoenix_v2_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;

+ 1 - 1
lib/subghz/protocols/princeton.c

@@ -167,7 +167,7 @@ bool subghz_protocol_encoder_princeton_deserialize(void* context, FlipperFormat*
         flipper_format_read_uint32(
             flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1);
 
-        subghz_protocol_encoder_princeton_get_upload(instance);
+        if(!subghz_protocol_encoder_princeton_get_upload(instance)) break;
         instance->encoder.is_running = true;
 
         res = true;