From: Antoni Adaszkiewicz Date: Thu, 5 Jan 2023 15:35:39 +0000 (+0100) Subject: Fail DELTA_FS type upgrade if there is not enough disk space X-Git-Tag: accepted/tizen/unified/20230116.060918~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=38ec08bf386ef4eabe42df5c2003ee073abeb976;p=platform%2Fcore%2Fsystem%2Fupgrade.git Fail DELTA_FS type upgrade if there is not enough disk space Change-Id: I2cfcb4113093aab111e64677e453c65892e97a26 --- diff --git a/src/upgrade-apply-deltafs/engine/SS_FSUpdate.c b/src/upgrade-apply-deltafs/engine/SS_FSUpdate.c index 5b0d2b1..54ff219 100755 --- a/src/upgrade-apply-deltafs/engine/SS_FSUpdate.c +++ b/src/upgrade-apply-deltafs/engine/SS_FSUpdate.c @@ -1032,7 +1032,7 @@ long SS_SetFileAttributes(const char *ui16pFilePath, /* vrm functions */ long SS_GetAvailableFreeSpace(const char *partition_name, - SS_UINT32 *available_flash_size) + size_t *available_flash_size) { int result = 0; char path[MAX_PATH] = { '\0' }; diff --git a/src/upgrade-apply-deltafs/engine/SS_FSUpdate.h b/src/upgrade-apply-deltafs/engine/SS_FSUpdate.h index 5d40d2c..881847a 100755 --- a/src/upgrade-apply-deltafs/engine/SS_FSUpdate.h +++ b/src/upgrade-apply-deltafs/engine/SS_FSUpdate.h @@ -204,7 +204,7 @@ extern "C" { * \return S_SS_SUCCESS on success or an \ref SS_vRM_Errors.h error code ******************************************************************************* */ - long SS_GetAvailableFreeSpace(const char *path, SS_UINT32 * available_flash_size); + long SS_GetAvailableFreeSpace(const char *path, size_t * available_flash_size); /*! ******************************************************************************* diff --git a/src/upgrade-apply-deltafs/engine/SS_PatchDelta.c b/src/upgrade-apply-deltafs/engine/SS_PatchDelta.c index 57f5d28..233cb36 100755 --- a/src/upgrade-apply-deltafs/engine/SS_PatchDelta.c +++ b/src/upgrade-apply-deltafs/engine/SS_PatchDelta.c @@ -200,7 +200,7 @@ int SS_UpdateDeltaFS(const char *source_filename, const char *target_filename, do { int enough_space = 0; - SS_UINT32 free_space = 0; + size_t free_space = 0; if (retry > 0) { SS_GetAvailableFreeSpace(source_filename, &free_space); @@ -250,7 +250,7 @@ int SS_UpdateDeltaFS(const char *source_filename, const char *target_filename, } } } - result = apply_patch_brotli((char *)source_filename, outname, tar_file, -1); + result = apply_patch_brotli((char *)source_filename, outname, tar_file, -1, &free_space); if (output >= 0) { fsync(output); close(output); diff --git a/src/upgrade-apply-deltafs/engine/SS_PatchDelta.h b/src/upgrade-apply-deltafs/engine/SS_PatchDelta.h index 4acc160..5ba32ba 100755 --- a/src/upgrade-apply-deltafs/engine/SS_PatchDelta.h +++ b/src/upgrade-apply-deltafs/engine/SS_PatchDelta.h @@ -40,7 +40,7 @@ int ParseSha1(const char *str, uint8_t * digest); int SS_LoadFile(const char *filename, FileInfo * file); extern void SS_SetUpgradeState(int Val); -extern long SS_GetAvailableFreeSpace(const char *partition_name, SS_UINT32 * available_flash_size); +extern long SS_GetAvailableFreeSpace(const char *partition_name, size_t * available_flash_size); extern int SS_ApplyBsdiff(char *oldfile, char *newfile, char *patch, SinkFn sink, void *token, SHA1_CTX * ctx1); extern int SS_PatchSourceClear(char *patch_path); extern long SS_WriteFile(long wHandle, SS_UINT32 dwPosition, unsigned char *pbBuffer, SS_UINT32 dwSize); diff --git a/src/upgrade-apply/main.c b/src/upgrade-apply/main.c index 26a1337..930c2bc 100644 --- a/src/upgrade-apply/main.c +++ b/src/upgrade-apply/main.c @@ -479,7 +479,7 @@ int main(int argc, char **argv) case KIND_BROTLI_PATCH: { struct dec_funcs funcs = { init_brotli, decompress_brotli, free_brotli }; - r = apply_patch(parsed.patch_orig, parsed.dest, tar, parsed.dest_size, &funcs); + r = apply_patch(parsed.patch_orig, parsed.dest, tar, parsed.dest_size, NULL, &funcs); break; } } diff --git a/src/upgrade-apply/patch/patch.c b/src/upgrade-apply/patch/patch.c index 40697ad..e2af145 100644 --- a/src/upgrade-apply/patch/patch.c +++ b/src/upgrade-apply/patch/patch.c @@ -289,7 +289,7 @@ static int64_t parse_ssint(unsigned char *buff) return result; } -int read_header(struct dec_funcs *funcs, struct bs_data *data, uint8_t **buff_out_pos) +int read_header(struct dec_funcs *funcs, struct bs_data *data, uint8_t **buff_out_pos, size_t *free_space) { assert(data); assert(buff_out_pos); @@ -314,6 +314,11 @@ int read_header(struct dec_funcs *funcs, struct bs_data *data, uint8_t **buff_ou size_t target_size = parse_ssint(*buff_out_pos); fprintf(stderr, "target_size: 0x%zx (%zu)\n", target_size, target_size); + if ((free_space != NULL) && (*free_space <= target_size)) { + fprintf(stderr, "Not enough disk space (target: %zu, free: %zu)\n", target_size, *free_space); + return PF_NOT_ENOUGH_DISK_SPACE; + } + if (data->dest.len == -1) { data->dest.len = target_size; if (ftruncate(data->dest.fd, data->dest.len) == -1) { @@ -330,7 +335,7 @@ int read_header(struct dec_funcs *funcs, struct bs_data *data, uint8_t **buff_ou return PF_OK; } -int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, struct dec_funcs *funcs) +int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space, struct dec_funcs *funcs) { assert(source_file); assert(dest_file); @@ -352,7 +357,7 @@ int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, uint8_t *buff_out_pos; - if ((result = read_header(funcs, &data, &buff_out_pos)) != PF_OK) + if ((result = read_header(funcs, &data, &buff_out_pos, free_space)) != PF_OK) goto exit; int res; diff --git a/src/upgrade-apply/patch/patch.h b/src/upgrade-apply/patch/patch.h index 919802c..8a2c462 100644 --- a/src/upgrade-apply/patch/patch.h +++ b/src/upgrade-apply/patch/patch.h @@ -29,6 +29,7 @@ #define PF_ERROR_INVALID_PATCH_FILE 3 #define PF_ERROR_DECOMPRESSION 4 #define PF_NEED_MORE_DATA 5 +#define PF_NOT_ENOUGH_DISK_SPACE 6 #define BUFF_OUT_LEN 4096 @@ -64,4 +65,4 @@ struct dec_funcs { void (*clean)(struct bs_data *data); }; -extern int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, struct dec_funcs *funcs); +extern int apply_patch(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space, struct dec_funcs *funcs); diff --git a/src/upgrade-apply/patch/patch_helper.c b/src/upgrade-apply/patch/patch_helper.c index be2d46f..fb6e7d1 100644 --- a/src/upgrade-apply/patch/patch_helper.c +++ b/src/upgrade-apply/patch/patch_helper.c @@ -18,8 +18,8 @@ #include "brotli.h" -int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size) +int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space) { struct dec_funcs funcs = { init_brotli, decompress_brotli, free_brotli }; - return apply_patch(source_file, dest_file, patch_tar, dest_size, &funcs); + return apply_patch(source_file, dest_file, patch_tar, dest_size, free_space, &funcs); } diff --git a/src/upgrade-apply/patch/patch_helper.h b/src/upgrade-apply/patch/patch_helper.h index b214cd4..03670f9 100644 --- a/src/upgrade-apply/patch/patch_helper.h +++ b/src/upgrade-apply/patch/patch_helper.h @@ -19,4 +19,4 @@ #pragma once #include -int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size); +int apply_patch_brotli(const char *source_file, const char *dest_file, TAR *patch_tar, size_t dest_size, size_t *free_space);