From 2001d869a130ea365a9ad47b2652d2f89f899ec6 Mon Sep 17 00:00:00 2001 From: Benign X <1341398182@qq.com> Date: Wed, 17 Jan 2024 21:41:54 +0800 Subject: [PATCH] feat(fs): add `fn_len` for `lv_fs_dir_read` (#5362) --- docs/overview/fs.rst | 2 +- examples/porting/lv_port_fs_template.c | 4 ++-- src/libs/fsdrv/lv_fs_fatfs.c | 9 ++++----- src/libs/fsdrv/lv_fs_posix.c | 14 +++++++------- src/libs/fsdrv/lv_fs_stdio.c | 14 +++++++------- src/libs/fsdrv/lv_fs_win32.c | 4 ++-- src/misc/lv_fs.c | 8 ++++++-- src/misc/lv_fs.h | 5 +++-- src/others/file_explorer/lv_file_explorer.c | 2 +- 9 files changed, 33 insertions(+), 29 deletions(-) diff --git a/docs/overview/fs.rst b/docs/overview/fs.rst index de6d7746d..bb7f019e9 100644 --- a/docs/overview/fs.rst +++ b/docs/overview/fs.rst @@ -125,7 +125,7 @@ practice to insert a ``'/'`` in front of each directory name. char fn[256]; while(1) { - res = lv_fs_dir_read(&dir, fn); + res = lv_fs_dir_read(&dir, fn, sizeof(fn)); if(res != LV_FS_RES_OK) { my_error_handling(); break; diff --git a/examples/porting/lv_port_fs_template.c b/examples/porting/lv_port_fs_template.c index 842d7c3ba..f79ff49b7 100644 --- a/examples/porting/lv_port_fs_template.c +++ b/examples/porting/lv_port_fs_template.c @@ -34,7 +34,7 @@ static lv_fs_res_t fs_size(lv_fs_drv_t * drv, void * file_p, uint32_t * size_p); static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p); /********************** @@ -230,7 +230,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) * @param fn pointer to a buffer to store the filename * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn) +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len) { lv_fs_res_t res = LV_FS_RES_NOT_IMP; diff --git a/src/libs/fsdrv/lv_fs_fatfs.c b/src/libs/fsdrv/lv_fs_fatfs.c index 383551a89..48a84d4be 100644 --- a/src/libs/fsdrv/lv_fs_fatfs.c +++ b/src/libs/fsdrv/lv_fs_fatfs.c @@ -36,7 +36,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); /********************** @@ -245,7 +245,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) * @param fn pointer to a buffer to store the filename * @return LV_FS_RES_OK or any error from lv_fs_res_t enum */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) { LV_UNUSED(drv); FRESULT res; @@ -257,10 +257,9 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) if(res != FR_OK) return LV_FS_RES_UNKNOWN; if(fno.fattrib & AM_DIR) { - fn[0] = '/'; - lv_strcpy(&fn[1], fno.fname); + lv_snprintf(fn, fn_len, "/%s", fno.fname); } - else lv_strcpy(fn, fno.fname); + else lv_strncpy(fn, fno.fname, fn_len); } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); diff --git a/src/libs/fsdrv/lv_fs_posix.c b/src/libs/fsdrv/lv_fs_posix.c index bbf927970..87750f1b9 100644 --- a/src/libs/fsdrv/lv_fs_posix.c +++ b/src/libs/fsdrv/lv_fs_posix.c @@ -49,7 +49,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); /********************** @@ -274,7 +274,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) * @param fn pointer to a buffer to store the filename * @return LV_FS_RES_OK or any error from lv_fs_res_t enum */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) { LV_UNUSED(drv); @@ -283,17 +283,17 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) do { entry = readdir(dir_p); if(entry) { - if(entry->d_type == DT_DIR) lv_snprintf(fn, lv_strlen(entry->d_name) + 2, "/%s", entry->d_name); - else lv_strcpy(fn, entry->d_name); + if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); + else lv_strncpy(fn, entry->d_name, fn_len); } else { - lv_strcpy(fn, ""); + lv_strncpy(fn, "", fn_len); } } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); #else - lv_strcpy(fn, next_fn); + lv_strcpy(fn, next_fn, fn_len); - lv_strcpy(next_fn, ""); + lv_strcpy(next_fn, "", fn_len); WIN32_FIND_DATA fdata; if(FindNextFile(dir_p, &fdata) == false) return LV_FS_RES_OK; diff --git a/src/libs/fsdrv/lv_fs_stdio.c b/src/libs/fsdrv/lv_fs_stdio.c index b1f075f99..6a93eb35c 100644 --- a/src/libs/fsdrv/lv_fs_stdio.c +++ b/src/libs/fsdrv/lv_fs_stdio.c @@ -45,7 +45,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); /********************** @@ -273,7 +273,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) * @param fn pointer to a buffer to store the filename * @return LV_FS_RES_OK or any error from lv_fs_res_t enum */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) { LV_UNUSED(drv); dir_handle_t * handle = (dir_handle_t *)dir_p; @@ -283,17 +283,17 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) entry = readdir(handle->dir_p); if(entry) { /*Note, DT_DIR is not defined in C99*/ - if(entry->d_type == DT_DIR) lv_snprintf(fn, lv_strlen(entry->d_name) + 2, "/%s", entry->d_name); - else lv_strcpy(fn, entry->d_name); + if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); + else lv_strncpy(fn, entry->d_name, fn_len); } else { - lv_strcpy(fn, ""); + lv_strncpy(fn, "", fn_len); } } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); #else - lv_strcpy(fn, handle->next_fn); + lv_strncpy(fn, handle->next_fn, fn_len); - lv_strcpy(handle->next_fn, ""); + lv_strncpy(handle->next_fn, "", fn_len); WIN32_FIND_DATAA fdata; if(FindNextFileA(handle->dir_p, &fdata) == false) return LV_FS_RES_OK; diff --git a/src/libs/fsdrv/lv_fs_win32.c b/src/libs/fsdrv/lv_fs_win32.c index 03e0d9108..42e27c7b4 100644 --- a/src/libs/fsdrv/lv_fs_win32.c +++ b/src/libs/fsdrv/lv_fs_win32.c @@ -41,7 +41,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); /********************** @@ -409,7 +409,7 @@ static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) * @param fn pointer to a buffer to store the filename * @return LV_FS_RES_OK or any error from lv_fs_res_t enum */ -static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn) +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) { LV_UNUSED(drv); dir_handle_t * handle = (dir_handle_t *)dir_p; diff --git a/src/misc/lv_fs.c b/src/misc/lv_fs.c index 74347215a..921d30658 100644 --- a/src/misc/lv_fs.c +++ b/src/misc/lv_fs.c @@ -411,8 +411,12 @@ lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) return LV_FS_RES_OK; } -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn) +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len) { + if(fn_len == 0) { + return LV_FS_RES_INV_PARAM; + } + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { fn[0] = '\0'; return LV_FS_RES_INV_PARAM; @@ -423,7 +427,7 @@ lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn) return LV_FS_RES_NOT_IMP; } - lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn); + lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn, fn_len); return res; } diff --git a/src/misc/lv_fs.h b/src/misc/lv_fs.h index e7bf450f8..ae29456ef 100644 --- a/src/misc/lv_fs.h +++ b/src/misc/lv_fs.h @@ -93,7 +93,7 @@ struct _lv_fs_drv_t { lv_fs_res_t (*tell_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); void * (*dir_open_cb)(lv_fs_drv_t * drv, const char * path); - lv_fs_res_t (*dir_read_cb)(lv_fs_drv_t * drv, void * rddir_p, char * fn); + lv_fs_res_t (*dir_read_cb)(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); lv_fs_res_t (*dir_close_cb)(lv_fs_drv_t * drv, void * rddir_p); void * user_data; /**< Custom file user data*/ @@ -244,9 +244,10 @@ lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path); * The name of the directories will begin with '/' * @param rddir_p pointer to an initialized 'fs_dir_t' variable * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename * @return LV_FS_RES_OK or any error from lv_fs_res_t enum */ -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn); +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len); /** * Close the directory reading diff --git a/src/others/file_explorer/lv_file_explorer.c b/src/others/file_explorer/lv_file_explorer.c index cca55a307..acc73f004 100644 --- a/src/others/file_explorer/lv_file_explorer.c +++ b/src/others/file_explorer/lv_file_explorer.c @@ -544,7 +544,7 @@ static void show_dir(lv_obj_t * obj, const char * path) lv_table_set_cell_value(explorer->file_table, 1, 1, "0"); while(1) { - res = lv_fs_dir_read(&dir, fn); + res = lv_fs_dir_read(&dir, fn, sizeof(fn)); if(res != LV_FS_RES_OK) { LV_LOG_USER("Driver, file or directory is not exists %d!", res); break;