Fail DELTA_FS type upgrade if there is not enough disk space 21/286421/3
authorAntoni Adaszkiewicz <a.adaszkiewi@samsung.com>
Thu, 5 Jan 2023 15:35:39 +0000 (16:35 +0100)
committerAntoni Adaszkiewicz <a.adaszkiewi@samsung.com>
Tue, 10 Jan 2023 13:02:14 +0000 (14:02 +0100)
Change-Id: I2cfcb4113093aab111e64677e453c65892e97a26

src/upgrade-apply-deltafs/engine/SS_FSUpdate.c
src/upgrade-apply-deltafs/engine/SS_FSUpdate.h
src/upgrade-apply-deltafs/engine/SS_PatchDelta.c
src/upgrade-apply-deltafs/engine/SS_PatchDelta.h
src/upgrade-apply/main.c
src/upgrade-apply/patch/patch.c
src/upgrade-apply/patch/patch.h
src/upgrade-apply/patch/patch_helper.c
src/upgrade-apply/patch/patch_helper.h

index 5b0d2b1..54ff219 100755 (executable)
@@ -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' };
index 5d40d2c..881847a 100755 (executable)
@@ -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);
 
 /*!
  *******************************************************************************
index 57f5d28..233cb36 100755 (executable)
@@ -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);
index 4acc160..5ba32ba 100755 (executable)
@@ -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);
index 26a1337..930c2bc 100644 (file)
@@ -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;
                        }
                }
index 40697ad..e2af145 100644 (file)
@@ -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;
index 919802c..8a2c462 100644 (file)
@@ -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);
index be2d46f..fb6e7d1 100644 (file)
@@ -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);
 }
index b214cd4..03670f9 100644 (file)
@@ -19,4 +19,4 @@
 #pragma once
 #include <libtar.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);