1
mirror of https://github.com/DarkFlippers/unleashed-firmware.git synced 2025-12-12 04:34:43 +04:00

Replace all calls to strncpy with strlcpy, use strdup more, expose strlcat (#3866)

strlcpy doesn't zero the buffer and ensures null termination,
just like snprintf

strlcat is already used by mjs and it's a safe alternative to strcat,
so it should be OK to expose to apps
This commit is contained in:
Silent
2024-09-07 18:16:56 +02:00
committed by GitHub
parent 9bdf41d8ff
commit 8672a1d94c
18 changed files with 47 additions and 47 deletions

View File

@@ -24,7 +24,7 @@ static void rpc_debug_app_tick_event_callback(void* context) {
static void static void
rpc_debug_app_format_hex(const uint8_t* data, size_t data_size, char* buf, size_t buf_size) { rpc_debug_app_format_hex(const uint8_t* data, size_t data_size, char* buf, size_t buf_size) {
if(data == NULL || data_size == 0) { if(data == NULL || data_size == 0) {
strncpy(buf, "<Data empty>", buf_size); strlcpy(buf, "<Data empty>", buf_size);
return; return;
} }

View File

@@ -26,7 +26,7 @@ static void rpc_debug_app_scene_input_error_code_result_callback(void* context)
void rpc_debug_app_scene_input_error_code_on_enter(void* context) { void rpc_debug_app_scene_input_error_code_on_enter(void* context) {
RpcDebugApp* app = context; RpcDebugApp* app = context;
strncpy(app->text_store, "666", TEXT_STORE_SIZE); strlcpy(app->text_store, "666", TEXT_STORE_SIZE);
text_input_set_header_text(app->text_input, "Enter error code"); text_input_set_header_text(app->text_input, "Enter error code");
text_input_set_validator( text_input_set_validator(
app->text_input, rpc_debug_app_scene_input_error_code_validator_callback, NULL); app->text_input, rpc_debug_app_scene_input_error_code_validator_callback, NULL);

View File

@@ -7,7 +7,7 @@ static void rpc_debug_app_scene_input_error_text_result_callback(void* context)
void rpc_debug_app_scene_input_error_text_on_enter(void* context) { void rpc_debug_app_scene_input_error_text_on_enter(void* context) {
RpcDebugApp* app = context; RpcDebugApp* app = context;
strncpy(app->text_store, "I'm a scary error message!", TEXT_STORE_SIZE); strlcpy(app->text_store, "I'm a scary error message!", TEXT_STORE_SIZE);
text_input_set_header_text(app->text_input, "Enter error text"); text_input_set_header_text(app->text_input, "Enter error text");
text_input_set_result_callback( text_input_set_result_callback(
app->text_input, app->text_input,

View File

@@ -2,7 +2,7 @@
void rpc_debug_app_scene_receive_data_exchange_on_enter(void* context) { void rpc_debug_app_scene_receive_data_exchange_on_enter(void* context) {
RpcDebugApp* app = context; RpcDebugApp* app = context;
strncpy(app->text_store, "Received data will appear here...", TEXT_STORE_SIZE); strlcpy(app->text_store, "Received data will appear here...", TEXT_STORE_SIZE);
text_box_set_text(app->text_box, app->text_store); text_box_set_text(app->text_box, app->text_store);
text_box_set_font(app->text_box, TextBoxFontHex); text_box_set_font(app->text_box, TextBoxFontHex);

View File

@@ -257,7 +257,7 @@ static void example_thermo_draw_callback(Canvas* canvas, void* ctx) {
snprintf(text_store, TEXT_STORE_SIZE, "Temperature: %+.1f%c", (double)temp, temp_units); snprintf(text_store, TEXT_STORE_SIZE, "Temperature: %+.1f%c", (double)temp, temp_units);
} else { } else {
/* Or show a message that no data is available */ /* Or show a message that no data is available */
strncpy(text_store, "-- No data --", TEXT_STORE_SIZE); strlcpy(text_store, "-- No data --", TEXT_STORE_SIZE);
} }
canvas_draw_str_aligned(canvas, middle_x, 58, AlignCenter, AlignBottom, text_store); canvas_draw_str_aligned(canvas, middle_x, 58, AlignCenter, AlignBottom, text_store);

View File

@@ -183,7 +183,7 @@ bool ibutton_load_key(iButton* ibutton, bool show_error) {
FuriString* tmp = furi_string_alloc(); FuriString* tmp = furi_string_alloc();
path_extract_filename(ibutton->file_path, tmp, true); path_extract_filename(ibutton->file_path, tmp, true);
strncpy(ibutton->key_name, furi_string_get_cstr(tmp), IBUTTON_KEY_NAME_SIZE); strlcpy(ibutton->key_name, furi_string_get_cstr(tmp), IBUTTON_KEY_NAME_SIZE);
furi_string_free(tmp); furi_string_free(tmp);
} else if(show_error) { } else if(show_error) {
@@ -243,7 +243,7 @@ bool ibutton_delete_key(iButton* ibutton) {
} }
void ibutton_reset_key(iButton* ibutton) { void ibutton_reset_key(iButton* ibutton) {
memset(ibutton->key_name, 0, IBUTTON_KEY_NAME_SIZE + 1); ibutton->key_name[0] = '\0';
furi_string_reset(ibutton->file_path); furi_string_reset(ibutton->file_path);
ibutton_key_reset(ibutton->key); ibutton_key_reset(ibutton->key);
} }

View File

@@ -32,7 +32,7 @@
#define IBUTTON_APP_FILENAME_PREFIX "iBtn" #define IBUTTON_APP_FILENAME_PREFIX "iBtn"
#define IBUTTON_APP_FILENAME_EXTENSION ".ibtn" #define IBUTTON_APP_FILENAME_EXTENSION ".ibtn"
#define IBUTTON_KEY_NAME_SIZE 22 #define IBUTTON_KEY_NAME_SIZE 23
typedef enum { typedef enum {
iButtonWriteModeInvalid, iButtonWriteModeInvalid,
@@ -56,7 +56,7 @@ struct iButton {
iButtonWriteMode write_mode; iButtonWriteMode write_mode;
FuriString* file_path; FuriString* file_path;
char key_name[IBUTTON_KEY_NAME_SIZE + 1]; char key_name[IBUTTON_KEY_NAME_SIZE];
Submenu* submenu; Submenu* submenu;
ByteInput* byte_input; ByteInput* byte_input;

View File

@@ -43,8 +43,8 @@
#define INFRARED_TEXT_STORE_NUM 2 #define INFRARED_TEXT_STORE_NUM 2
#define INFRARED_TEXT_STORE_SIZE 128 #define INFRARED_TEXT_STORE_SIZE 128
#define INFRARED_MAX_BUTTON_NAME_LENGTH 22 #define INFRARED_MAX_BUTTON_NAME_LENGTH 23
#define INFRARED_MAX_REMOTE_NAME_LENGTH 22 #define INFRARED_MAX_REMOTE_NAME_LENGTH 23
#define INFRARED_APP_FOLDER EXT_PATH("infrared") #define INFRARED_APP_FOLDER EXT_PATH("infrared")
#define INFRARED_APP_EXTENSION ".ir" #define INFRARED_APP_EXTENSION ".ir"

View File

@@ -39,7 +39,7 @@ void infrared_scene_edit_rename_on_enter(void* context) {
furi_check(current_button_index != InfraredButtonIndexNone); furi_check(current_button_index != InfraredButtonIndexNone);
enter_name_length = INFRARED_MAX_BUTTON_NAME_LENGTH; enter_name_length = INFRARED_MAX_BUTTON_NAME_LENGTH;
strncpy( strlcpy(
infrared->text_store[0], infrared->text_store[0],
infrared_remote_get_signal_name(remote, current_button_index), infrared_remote_get_signal_name(remote, current_button_index),
enter_name_length); enter_name_length);
@@ -47,7 +47,7 @@ void infrared_scene_edit_rename_on_enter(void* context) {
} else if(edit_target == InfraredEditTargetRemote) { } else if(edit_target == InfraredEditTargetRemote) {
text_input_set_header_text(text_input, "Name the remote"); text_input_set_header_text(text_input, "Name the remote");
enter_name_length = INFRARED_MAX_REMOTE_NAME_LENGTH; enter_name_length = INFRARED_MAX_REMOTE_NAME_LENGTH;
strncpy(infrared->text_store[0], infrared_remote_get_name(remote), enter_name_length); strlcpy(infrared->text_store[0], infrared_remote_get_name(remote), enter_name_length);
FuriString* folder_path; FuriString* folder_path;
folder_path = furi_string_alloc(); folder_path = furi_string_alloc();

View File

@@ -6,7 +6,7 @@
#include <dolphin/dolphin.h> #include <dolphin/dolphin.h>
#include <toolbox/name_generator.h> #include <toolbox/name_generator.h>
#define MAX_TEXT_INPUT_LEN 22 #define MAX_TEXT_INPUT_LEN 23
void subghz_scene_save_name_text_input_callback(void* context) { void subghz_scene_save_name_text_input_callback(void* context) {
furi_assert(context); furi_assert(context);
@@ -39,7 +39,7 @@ void subghz_scene_save_name_on_enter(void* context) {
FuriString* dir_name = furi_string_alloc(); FuriString* dir_name = furi_string_alloc();
if(!subghz_path_is_file(subghz->file_path)) { if(!subghz_path_is_file(subghz->file_path)) {
char file_name_buf[SUBGHZ_MAX_LEN_NAME] = {0}; char file_name_buf[SUBGHZ_MAX_LEN_NAME];
name_generator_make_auto(file_name_buf, SUBGHZ_MAX_LEN_NAME, SUBGHZ_APP_FILENAME_PREFIX); name_generator_make_auto(file_name_buf, SUBGHZ_MAX_LEN_NAME, SUBGHZ_APP_FILENAME_PREFIX);
@@ -62,7 +62,7 @@ void subghz_scene_save_name_on_enter(void* context) {
furi_string_set(subghz->file_path, dir_name); furi_string_set(subghz->file_path, dir_name);
} }
strncpy(subghz->file_name_tmp, furi_string_get_cstr(file_name), SUBGHZ_MAX_LEN_NAME); strlcpy(subghz->file_name_tmp, furi_string_get_cstr(file_name), SUBGHZ_MAX_LEN_NAME);
text_input_set_header_text(text_input, "Name signal"); text_input_set_header_text(text_input, "Name signal");
text_input_set_result_callback( text_input_set_result_callback(
text_input, text_input,

View File

@@ -52,8 +52,7 @@ static bool animation_storage_load_single_manifest_info(
if(furi_string_cmp_str(read_string, name)) break; if(furi_string_cmp_str(read_string, name)) break;
flipper_format_set_strict_mode(file, true); flipper_format_set_strict_mode(file, true);
manifest_info->name = malloc(furi_string_size(read_string) + 1); manifest_info->name = strdup(furi_string_get_cstr(read_string));
strcpy((char*)manifest_info->name, furi_string_get_cstr(read_string));
if(!flipper_format_read_uint32(file, "Min butthurt", &u32value, 1)) break; if(!flipper_format_read_uint32(file, "Min butthurt", &u32value, 1)) break;
manifest_info->min_butthurt = u32value; manifest_info->min_butthurt = u32value;
@@ -105,9 +104,7 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis
storage_animation->manifest_info.name = NULL; storage_animation->manifest_info.name = NULL;
if(!flipper_format_read_string(file, "Name", read_string)) break; if(!flipper_format_read_string(file, "Name", read_string)) break;
storage_animation->manifest_info.name = malloc(furi_string_size(read_string) + 1); storage_animation->manifest_info.name = strdup(furi_string_get_cstr(read_string));
strcpy(
(char*)storage_animation->manifest_info.name, furi_string_get_cstr(read_string));
if(!flipper_format_read_uint32(file, "Min butthurt", &u32value, 1)) break; if(!flipper_format_read_uint32(file, "Min butthurt", &u32value, 1)) break;
storage_animation->manifest_info.min_butthurt = u32value; storage_animation->manifest_info.min_butthurt = u32value;
@@ -401,8 +398,7 @@ static bool animation_storage_load_bubbles(BubbleAnimation* animation, FlipperFo
furi_string_replace_all(str, "\\n", "\n"); furi_string_replace_all(str, "\\n", "\n");
FURI_CONST_ASSIGN_PTR(bubble->bubble.text, malloc(furi_string_size(str) + 1)); FURI_CONST_ASSIGN_PTR(bubble->bubble.text, strdup(furi_string_get_cstr(str)));
strcpy((char*)bubble->bubble.text, furi_string_get_cstr(str));
if(!flipper_format_read_string(ff, "AlignH", str)) break; if(!flipper_format_read_string(ff, "AlignH", str)) break;
if(!animation_storage_cast_align(str, (Align*)&bubble->bubble.align_h)) break; if(!animation_storage_cast_align(str, (Align*)&bubble->bubble.align_h)) break;

View File

@@ -226,9 +226,7 @@ static void rpc_system_storage_list_root(const PB_Main* request, void* context)
response.content.storage_list_response.file[i].data = NULL; response.content.storage_list_response.file[i].data = NULL;
response.content.storage_list_response.file[i].size = 0; response.content.storage_list_response.file[i].size = 0;
response.content.storage_list_response.file[i].type = PB_Storage_File_FileType_DIR; response.content.storage_list_response.file[i].type = PB_Storage_File_FileType_DIR;
char* str = malloc(strlen(hard_coded_dirs[i]) + 1); response.content.storage_list_response.file[i].name = strdup(hard_coded_dirs[i]);
strcpy(str, hard_coded_dirs[i]);
response.content.storage_list_response.file[i].name = str;
} }
rpc_send_and_release(session, &response); rpc_send_and_release(session, &response);

View File

@@ -209,7 +209,7 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e
if(dialog_file_browser_show(app->dialogs, temp_path, temp_path, &browser_options)) { if(dialog_file_browser_show(app->dialogs, temp_path, temp_path, &browser_options)) {
submenu_reset(app->submenu); // Prevent menu from being shown when we exiting scene submenu_reset(app->submenu); // Prevent menu from being shown when we exiting scene
strncpy( strlcpy(
curr_favorite_app->name_or_path, curr_favorite_app->name_or_path,
furi_string_get_cstr(temp_path), furi_string_get_cstr(temp_path),
sizeof(curr_favorite_app->name_or_path)); sizeof(curr_favorite_app->name_or_path));
@@ -219,7 +219,7 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e
size_t app_index = event.event - 2; size_t app_index = event.event - 2;
const char* name = favorite_fap_get_app_name(app_index); const char* name = favorite_fap_get_app_name(app_index);
if(name) if(name)
strncpy( strlcpy(
curr_favorite_app->name_or_path, curr_favorite_app->name_or_path,
name, name,
sizeof(curr_favorite_app->name_or_path)); sizeof(curr_favorite_app->name_or_path));

View File

@@ -37,7 +37,7 @@
#ifdef _WIN32 #ifdef _WIN32
#undef snprintf #undef snprintf
#undef vsnprintf #undef vsnprintf
#define snprintf cs_win_snprintf #define snprintf cs_win_snprintf
#define vsnprintf cs_win_vsnprintf #define vsnprintf cs_win_vsnprintf
int cs_win_snprintf(char* str, size_t size, const char* format, ...); int cs_win_snprintf(char* str, size_t size, const char* format, ...);
int cs_win_vsnprintf(char* str, size_t size, const char* format, va_list ap); int cs_win_vsnprintf(char* str, size_t size, const char* format, va_list ap);
@@ -150,7 +150,8 @@ static int json_isspace(int ch) {
} }
static void json_skip_whitespaces(struct frozen* f) { static void json_skip_whitespaces(struct frozen* f) {
while(f->cur < f->end && json_isspace(*f->cur)) f->cur++; while(f->cur < f->end && json_isspace(*f->cur))
f->cur++;
} }
static int json_cur(struct frozen* f) { static int json_cur(struct frozen* f) {
@@ -263,15 +264,18 @@ static int json_parse_number(struct frozen* f) {
f->cur += 2; f->cur += 2;
EXPECT(f->cur < f->end, JSON_STRING_INCOMPLETE); EXPECT(f->cur < f->end, JSON_STRING_INCOMPLETE);
EXPECT(json_isxdigit(f->cur[0]), JSON_STRING_INVALID); EXPECT(json_isxdigit(f->cur[0]), JSON_STRING_INVALID);
while(f->cur < f->end && json_isxdigit(f->cur[0])) f->cur++; while(f->cur < f->end && json_isxdigit(f->cur[0]))
f->cur++;
} else { } else {
EXPECT(json_isdigit(f->cur[0]), JSON_STRING_INVALID); EXPECT(json_isdigit(f->cur[0]), JSON_STRING_INVALID);
while(f->cur < f->end && json_isdigit(f->cur[0])) f->cur++; while(f->cur < f->end && json_isdigit(f->cur[0]))
f->cur++;
if(f->cur < f->end && f->cur[0] == '.') { if(f->cur < f->end && f->cur[0] == '.') {
f->cur++; f->cur++;
EXPECT(f->cur < f->end, JSON_STRING_INCOMPLETE); EXPECT(f->cur < f->end, JSON_STRING_INCOMPLETE);
EXPECT(json_isdigit(f->cur[0]), JSON_STRING_INVALID); EXPECT(json_isdigit(f->cur[0]), JSON_STRING_INVALID);
while(f->cur < f->end && json_isdigit(f->cur[0])) f->cur++; while(f->cur < f->end && json_isdigit(f->cur[0]))
f->cur++;
} }
if(f->cur < f->end && (f->cur[0] == 'e' || f->cur[0] == 'E')) { if(f->cur < f->end && (f->cur[0] == 'e' || f->cur[0] == 'E')) {
f->cur++; f->cur++;
@@ -279,7 +283,8 @@ static int json_parse_number(struct frozen* f) {
if((f->cur[0] == '+' || f->cur[0] == '-')) f->cur++; if((f->cur[0] == '+' || f->cur[0] == '-')) f->cur++;
EXPECT(f->cur < f->end, JSON_STRING_INCOMPLETE); EXPECT(f->cur < f->end, JSON_STRING_INCOMPLETE);
EXPECT(json_isdigit(f->cur[0]), JSON_STRING_INVALID); EXPECT(json_isdigit(f->cur[0]), JSON_STRING_INVALID);
while(f->cur < f->end && json_isdigit(f->cur[0])) f->cur++; while(f->cur < f->end && json_isdigit(f->cur[0]))
f->cur++;
} }
} }
json_truncate_path(f, fstate.path_len); json_truncate_path(f, fstate.path_len);
@@ -639,8 +644,7 @@ int json_vprintf(struct json_out* out, const char* fmt, va_list xap) {
int need_len, size = sizeof(buf); int need_len, size = sizeof(buf);
char fmt2[20]; char fmt2[20];
va_list ap_copy; va_list ap_copy;
strncpy(fmt2, fmt, n + 1 > (int)sizeof(fmt2) ? sizeof(fmt2) : (size_t)n + 1); strlcpy(fmt2, fmt, sizeof(fmt2));
fmt2[n + 1] = '\0';
va_copy(ap_copy, ap); va_copy(ap_copy, ap);
need_len = vsnprintf(pbuf, size, fmt2, ap_copy); need_len = vsnprintf(pbuf, size, fmt2, ap_copy);
@@ -1047,7 +1051,7 @@ int json_vscanf(const char* s, int len, const char* fmt, va_list ap) {
while(fmt[i] != '\0') { while(fmt[i] != '\0') {
if(fmt[i] == '{') { if(fmt[i] == '{') {
strcat(path, "."); strlcat(path, ".", sizeof(path));
i++; i++;
} else if(fmt[i] == '}') { } else if(fmt[i] == '}') {
if((p = strrchr(path, '.')) != NULL) *p = '\0'; if((p = strrchr(path, '.')) != NULL) *p = '\0';
@@ -1160,7 +1164,8 @@ struct json_setf_data {
static int get_matched_prefix_len(const char* s1, const char* s2) { static int get_matched_prefix_len(const char* s1, const char* s2) {
int i = 0; int i = 0;
while(s1[i] && s2[i] && s1[i] == s2[i]) i++; while(s1[i] && s2[i] && s1[i] == s2[i])
i++;
return i; return i;
} }
@@ -1235,7 +1240,8 @@ int json_vsetf(
/* Trim comma after the value that begins at object/array start */ /* Trim comma after the value that begins at object/array start */
if(s[data.prev - 1] == '{' || s[data.prev - 1] == '[') { if(s[data.prev - 1] == '{' || s[data.prev - 1] == '[') {
int i = data.end; int i = data.end;
while(i < len && json_isspace(s[i])) i++; while(i < len && json_isspace(s[i]))
i++;
if(s[i] == ',') data.end = i + 1; /* Point after comma */ if(s[i] == ',') data.end = i + 1; /* Point after comma */
} }
json_printf(out, "%.*s", len - data.end, s + data.end); json_printf(out, "%.*s", len - data.end, s + data.end);
@@ -1305,7 +1311,8 @@ struct prettify_data {
}; };
static void indent(struct json_out* out, int level) { static void indent(struct json_out* out, int level) {
while(level-- > 0) out->printer(out, " ", 2); while(level-- > 0)
out->printer(out, " ", 2);
} }
static void print_key(struct prettify_data* pd, const char* path, const char* name, int name_len) { static void print_key(struct prettify_data* pd, const char* path, const char* name, int name_len) {

View File

@@ -138,8 +138,7 @@ MJS_PRIVATE mjs_err_t to_json_or_debug(
vp < mjs->json_visited_stack.buf + mjs->json_visited_stack.len; vp < mjs->json_visited_stack.buf + mjs->json_visited_stack.len;
vp += sizeof(mjs_val_t)) { vp += sizeof(mjs_val_t)) {
if(*(mjs_val_t*)vp == v) { if(*(mjs_val_t*)vp == v) {
strncpy(buf, "[Circular]", size); len = strlcpy(buf, "[Circular]", size);
len = 10;
goto clean; goto clean;
} }
} }

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,72.4,, Version,+,72.5,,
Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli.h,,
@@ -2598,7 +2598,7 @@ Function,+,strint_to_int64,StrintParseError,"const char*, char**, int64_t*, uint
Function,+,strint_to_uint16,StrintParseError,"const char*, char**, uint16_t*, uint8_t" Function,+,strint_to_uint16,StrintParseError,"const char*, char**, uint16_t*, uint8_t"
Function,+,strint_to_uint32,StrintParseError,"const char*, char**, uint32_t*, uint8_t" Function,+,strint_to_uint32,StrintParseError,"const char*, char**, uint32_t*, uint8_t"
Function,+,strint_to_uint64,StrintParseError,"const char*, char**, uint64_t*, uint8_t" Function,+,strint_to_uint64,StrintParseError,"const char*, char**, uint64_t*, uint8_t"
Function,-,strlcat,size_t,"char*, const char*, size_t" Function,+,strlcat,size_t,"char*, const char*, size_t"
Function,+,strlcpy,size_t,"char*, const char*, size_t" Function,+,strlcpy,size_t,"char*, const char*, size_t"
Function,+,strlen,size_t,const char* Function,+,strlen,size_t,const char*
Function,-,strlwr,char*,char* Function,-,strlwr,char*,char*
1 entry status name type params
2 Version + 72.4 72.5
3 Header + applications/services/bt/bt_service/bt.h
4 Header + applications/services/bt/bt_service/bt_keys_storage.h
5 Header + applications/services/cli/cli.h
2598 Function + strint_to_uint16 StrintParseError const char*, char**, uint16_t*, uint8_t
2599 Function + strint_to_uint32 StrintParseError const char*, char**, uint32_t*, uint8_t
2600 Function + strint_to_uint64 StrintParseError const char*, char**, uint64_t*, uint8_t
2601 Function - + strlcat size_t char*, const char*, size_t
2602 Function + strlcpy size_t char*, const char*, size_t
2603 Function + strlen size_t const char*
2604 Function - strlwr char* char*

View File

@@ -1,5 +1,5 @@
entry,status,name,type,params entry,status,name,type,params
Version,+,72.4,, Version,+,72.5,,
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt.h,,
Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,,
@@ -3275,7 +3275,7 @@ Function,+,strint_to_int64,StrintParseError,"const char*, char**, int64_t*, uint
Function,+,strint_to_uint16,StrintParseError,"const char*, char**, uint16_t*, uint8_t" Function,+,strint_to_uint16,StrintParseError,"const char*, char**, uint16_t*, uint8_t"
Function,+,strint_to_uint32,StrintParseError,"const char*, char**, uint32_t*, uint8_t" Function,+,strint_to_uint32,StrintParseError,"const char*, char**, uint32_t*, uint8_t"
Function,+,strint_to_uint64,StrintParseError,"const char*, char**, uint64_t*, uint8_t" Function,+,strint_to_uint64,StrintParseError,"const char*, char**, uint64_t*, uint8_t"
Function,-,strlcat,size_t,"char*, const char*, size_t" Function,+,strlcat,size_t,"char*, const char*, size_t"
Function,+,strlcpy,size_t,"char*, const char*, size_t" Function,+,strlcpy,size_t,"char*, const char*, size_t"
Function,+,strlen,size_t,const char* Function,+,strlen,size_t,const char*
Function,-,strlwr,char*,char* Function,-,strlwr,char*,char*
1 entry status name type params
2 Version + 72.4 72.5
3 Header + applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h
4 Header + applications/services/bt/bt_service/bt.h
5 Header + applications/services/bt/bt_service/bt_keys_storage.h
3275 Function + strint_to_uint16 StrintParseError const char*, char**, uint16_t*, uint8_t
3276 Function + strint_to_uint32 StrintParseError const char*, char**, uint32_t*, uint8_t
3277 Function + strint_to_uint64 StrintParseError const char*, char**, uint64_t*, uint8_t
3278 Function - + strlcat size_t char*, const char*, size_t
3279 Function + strlcpy size_t char*, const char*, size_t
3280 Function + strlen size_t const char*
3281 Function - strlwr char* char*

View File

@@ -99,7 +99,7 @@ static void furi_hal_version_set_name(const char* name) {
"xFlipper %s", "xFlipper %s",
furi_hal_version.name); furi_hal_version.name);
} else { } else {
snprintf(furi_hal_version.device_name, FURI_HAL_VERSION_DEVICE_NAME_LENGTH, "xFlipper"); strlcpy(furi_hal_version.device_name, "xFlipper", FURI_HAL_VERSION_DEVICE_NAME_LENGTH);
} }
furi_hal_version.device_name[0] = AD_TYPE_COMPLETE_LOCAL_NAME; furi_hal_version.device_name[0] = AD_TYPE_COMPLETE_LOCAL_NAME;