From: shirsh-kumar Date: Thu, 16 Apr 2020 17:52:31 +0000 (+0530) Subject: Enable LONG file name support across all tar api's. X-Git-Tag: accepted/tizen/unified/20200428.130041^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ee88ac07426a5cd1e0763bc4c4afa4c06aca9284;p=platform%2Fcore%2Fsystem%2Flibtota.git Enable LONG file name support across all tar api's. Add additional info in error cases. Fix crash issue in building cfg table for LONG file names. Version up for Library Change-Id: Id5ee04e95909833c29527bea689f9d138fdc54ed Signed-off-by: shirsh-kumar --- diff --git a/ss_engine/fota_common.h b/ss_engine/fota_common.h index 8213546..915a0e6 100755 --- a/ss_engine/fota_common.h +++ b/ss_engine/fota_common.h @@ -58,7 +58,7 @@ typedef unsigned long long u64; #define UNUSED(x) (void)(x) -#define SS_TOTA_VERSION "1.0.18" +#define SS_TOTA_VERSION "1.0.19" #define BSDIFF "BSDIFF40" #define IMGDIFF "IMGDIFF2" #define SECTOR_SIZE 512 diff --git a/ss_engine/fota_tar.c b/ss_engine/fota_tar.c index 4bb27df..7b1fd14 100755 --- a/ss_engine/fota_tar.c +++ b/ss_engine/fota_tar.c @@ -194,7 +194,7 @@ int tar_get_item_offset(char *tar, char *item) int ret = -1; int fd = -1; char header[TAR_BLOCK_SIZE] = { 0, }; - char name[TAR_ITEM_NAME_SIZE + 1] = { 0, }; + char uExtendedName[MAX_FILE_PATH + 1] = { 0, }; char size_oct[TAR_SIZE_OF_HEADER] = { 0, }; unsigned long size_dec = 0; int blknum = 0; @@ -202,6 +202,10 @@ int tar_get_item_offset(char *tar, char *item) off_t tar_len = 0; ssize_t rdcnt = 0; + if (!item || !tar){ + LOG("Invalid params\n"); + return -1; + }; //check if gTarFd was opened by tar_open during SS_FSUpdateFile then use it if (gTarFd > 0) fd = gTarFd; @@ -232,16 +236,33 @@ int tar_get_item_offset(char *tar, char *item) } /* get file name and file size */ - memcpy(name, header, sizeof(name) - 1); + if (header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGNAME || header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGLINK) { + //rdcnt = read(fd, header, sizeof(header)); + memset(uExtendedName, 0, sizeof(uExtendedName)); + rdcnt = read(fd, uExtendedName, sizeof(uExtendedName) - 1); + if (rdcnt <= 0) { + LOG("read failed. (rdcnt=%d)\n", rdcnt); + break; + } + rdcnt = read(fd, header, sizeof(header)); + if (rdcnt <= 0) { + LOG("read failed. (rdcnt=%d)\n", rdcnt); + break; + } + } else { + memset(uExtendedName, 0, sizeof(uExtendedName)); + memcpy(uExtendedName, header, TAR_ITEM_NAME_SIZE); + } memcpy(size_oct, header + TAR_ITEM_SIZE_POSITION, sizeof(size_oct)); size_dec = strtoul(size_oct, NULL, TAR_SIZE_OF_ITEM_SIZE); if (size_dec > MAX_ITEM_SIZE) { + LOG("ITEM : [%s]\n", item); LOG("size too big. (size_dec=0x%08X)\n", size_dec); break; } /* check if the file is what we are looking for */ - if (strncmp(name, item, TAR_ITEM_NAME_SIZE) == 0) { + if (strncmp(uExtendedName, item, sizeof(uExtendedName) - 1) == 0) { ret = (int)lseek(fd, 0, SEEK_CUR); break; } @@ -274,13 +295,18 @@ int tar_get_item_size(char *tar, char *item) int ret = -1; int fd = -1; char header[TAR_BLOCK_SIZE] = { 0, }; - char uExtendedName[MAX_FILE_PATH] = { 0, }; + char uExtendedName[MAX_FILE_PATH + 1] = { 0, }; char size_oct[TAR_SIZE_OF_HEADER] = { 0, }; unsigned long size_dec = 0; int blknum = 0; off_t pos = 0; off_t tar_len = 0; ssize_t rdcnt = 0; + + if (!item || !tar){ + LOG("Invalid params\n"); + return -1; + } LOGL(LOG_SSENGINE, "Tar file Looking for (%s)\n", item); fd = open(tar, O_RDONLY); if (fd < 0) { @@ -311,7 +337,7 @@ int tar_get_item_size(char *tar, char *item) if (header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGNAME || header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGLINK) { //rdcnt = read(fd, header, sizeof(header)); memset(uExtendedName, 0, sizeof(uExtendedName)); - rdcnt = read(fd, uExtendedName, sizeof(uExtendedName)); + rdcnt = read(fd, uExtendedName, sizeof(uExtendedName) - 1); if (rdcnt <= 0) { LOG("read failed. (rdcnt=%d)\n", rdcnt); break; @@ -325,16 +351,16 @@ int tar_get_item_size(char *tar, char *item) memset(uExtendedName, 0, sizeof(uExtendedName)); memcpy(uExtendedName, header, TAR_ITEM_NAME_SIZE); } - //memcpy(name, header, sizeof(name)); memcpy(size_oct, header + TAR_ITEM_SIZE_POSITION, sizeof(size_oct)); size_dec = strtoul(size_oct, NULL, TAR_SIZE_OF_ITEM_SIZE); if (size_dec > MAX_ITEM_SIZE) { + LOG("ITEM : [%s]\n", item); LOG("size too big. (size_dec=0x%08X)\n", (unsigned int)size_dec); break; } /* check if the file is what we are looking for */ - if (strncmp(uExtendedName, item, sizeof(uExtendedName) / sizeof(char)) == 0) { + if (strncmp(uExtendedName, item, sizeof(uExtendedName) - 1) == 0) { ret = (int)size_dec; if ((ret == 0) && (header[TAR_ITEM_TYPE_FLAG_POS] == DIRTYPE)) ret = tar_get_folder_size(tar, item); @@ -369,13 +395,18 @@ char tar_get_item_type(char *tar, char *item) char ret = '0'; int fd = -1; char header[TAR_BLOCK_SIZE] = { 0, }; - char name[TAR_ITEM_NAME_SIZE + 1] = { 0, }; + char uExtendedName[MAX_FILE_PATH + 1] = { 0, }; char size_oct[TAR_SIZE_OF_HEADER] = { 0, }; unsigned long size_dec = 0; int blknum = 0; off_t pos = 0; off_t tar_len = 0; ssize_t rdcnt = 0; + + if (!item || !tar){ + LOG("Invalid params\n"); + return -1; + } //LOG("Tar file Looking for (%s)\n", item); fd = open(tar, O_RDONLY); if (fd < 0) { @@ -404,17 +435,34 @@ char tar_get_item_type(char *tar, char *item) } /* get file name and file size */ - memcpy(name, header, sizeof(name) - 1); + if (header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGNAME || header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGLINK) { + //rdcnt = read(fd, header, sizeof(header)); + memset(uExtendedName, 0, sizeof(uExtendedName)); + rdcnt = read(fd, uExtendedName, sizeof(uExtendedName) - 1); + if (rdcnt <= 0) { + LOG("read failed. (rdcnt=%d)\n", rdcnt); + break; + } + rdcnt = read(fd, header, sizeof(header)); + if (rdcnt <= 0) { + LOG("read failed. (rdcnt=%d)\n", rdcnt); + break; + } + } else { + memset(uExtendedName, 0, sizeof(uExtendedName)); + memcpy(uExtendedName, header, TAR_ITEM_NAME_SIZE); + } memcpy(size_oct, header + TAR_ITEM_SIZE_POSITION, sizeof(size_oct)); size_dec = strtoul(size_oct, NULL, TAR_SIZE_OF_ITEM_SIZE); if (size_dec > MAX_ITEM_SIZE) { + LOG("ITEM : [%s]\n", item); LOG("size too big. (size_dec=0x%08X)\n", (unsigned int)size_dec); ret = -1; break; } /* check if the file is what we are looking for */ - if (strncmp(name, item, TAR_ITEM_NAME_SIZE) == 0) { + if (strncmp(uExtendedName, item, sizeof(uExtendedName) - 1) == 0) { ret = header[TAR_ITEM_TYPE_FLAG_POS]; break; } @@ -449,6 +497,10 @@ int tar_get_cfg_data(char *tar, char *item, char *buf, int buflen) off_t pos = 0; ssize_t rdcnt = 0; + if (!buf){ + LOG("Invalid params\n"); + return -1; + } data_size = tar_get_item_size(tar, item); if (data_size <= 0) return -1; @@ -491,7 +543,7 @@ tar_Data_t *tar_build_cfg_table(char *tar) int fd = -1; int ret = 0; char header[TAR_BLOCK_SIZE] = { 0, }; - char uExtendedName[MAX_FILE_PATH] = { 0, }; + char uExtendedName[MAX_FILE_PATH + 1] = { 0, }; char size_oct[TAR_SIZE_OF_HEADER] = { 0, }; unsigned long size_dec = 0; int blknum = 0; @@ -537,7 +589,6 @@ tar_Data_t *tar_build_cfg_table(char *tar) break; } /* get file name and file size */ - //memcpy(name, header, sizeof(name)); if (header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGNAME || header[TAR_ITEM_TYPE_FLAG_POS] == GNUTYPE_LONGLINK) { //rdcnt = read(fd, header, sizeof(header)); memset(uExtendedName, 0, sizeof(uExtendedName)); @@ -560,6 +611,7 @@ tar_Data_t *tar_build_cfg_table(char *tar) memcpy(size_oct, header + TAR_ITEM_SIZE_POSITION, sizeof(size_oct)); size_dec = strtoul(size_oct, NULL, TAR_SIZE_OF_ITEM_SIZE); if (size_dec > MAX_ITEM_SIZE) { + LOG("uExtendedName is : [%s]\n", uExtendedName); LOG("size too big. (size_dec=0x%08X)\n", (unsigned int)size_dec); ret = -1; break; @@ -740,6 +792,11 @@ int tar_get_folder_size(char *tar, char *item) off_t pos = 0; off_t tar_len = 0; ssize_t rdcnt = 0; + + if (!item || !tar){ + LOG("Invalid params\n"); + return -1; + } LOG("Tar folder Looking for (%s)\n", item); fd = open(tar, O_RDONLY); if (fd < 0) { @@ -829,6 +886,11 @@ int tar_extract_folder(char *tar, char *item, char *path) int getheader = 1; // Asuming initial header is TAR header char fullname[512] = { 0 }; int ret; + + if (!item || !tar || !path){ + LOG("Invalid params\n"); + return -1; + } LOG("Extracting Folder from %s %s to %s\n", tar, item, path); data_offset = tar_get_item_offset(tar, item); @@ -1003,6 +1065,10 @@ int fast_tar_extract_file(char *tar, char *item, char *pathname, int size, int o char err_buf[256]; int fd2; + if (!item || !tar || !pathname){ + LOG("Invalid params\n"); + return -1; + } if (gTarFd > 0) fd = gTarFd; if (fd < 0) { @@ -1067,6 +1133,11 @@ int tar_extract_file(char *tar, char *item, char *pathname) char *buf = NULL; char err_buf[256]; int fd2; + + if (!item || !tar || !pathname){ + LOG("Invalid params\n"); + return -1; + } data_size = tar_get_item_size(tar, item); data_offset = tar_get_item_offset(tar, item);