Make check_ua_op_mode slightly less broken 10/275410/1
authorMateusz Majewski <m.majewski2@samsung.com>
Tue, 24 May 2022 11:51:05 +0000 (13:51 +0200)
committerMateusz Majewski <m.majewski2@samsung.com>
Tue, 24 May 2022 11:51:55 +0000 (13:51 +0200)
Change-Id: Ib1cfa0111756d5bb7f992699da49665c27e3b0cb

src/ua.c

index 5d33bed..e744976 100755 (executable)
--- a/src/ua.c
+++ b/src/ua.c
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+#include <assert.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -54,6 +55,7 @@ int ua_op_mode = UA_OP_MODE_FG;
 char ua_slot_mode = 0;
 int dm_verity_status = DM_VERITY_DISABLED;
 
+// TODO: Consider changing all to PATH_MAX
 static char fota_result[MAX_FILE_PATH];
 static char fota_cause[MAX_FILE_PATH];
 static char fota_status_path[MAX_FILE_PATH];
@@ -63,7 +65,7 @@ static char log_folder[MAX_FOLDER_PATH];
 static char result_folder[MAX_FOLDER_PATH];
 static char temp_folder[MAX_FOLDER_PATH];
 static char log_path[MAX_FILE_PATH];
-static char blk_dev_arg[MAX_FOLDER_PATH]="/dev/mmcblk0";
+static char blk_dev_arg[PATH_MAX] = "/dev/mmcblk0";
 
 static ua_part_info_t s_part_info[UA_PARTI_MAX];
 
@@ -1076,9 +1078,8 @@ void fota_path_deinit(void)
  ----------------------------------------------------------------------------*/
 int check_ua_op_mode(int argc, char **argv)
 {
-       char blk_dev[PATH_MAX + 100];
        ua_op_mode = -1;
-       ua_slot_mode=0;
+       ua_slot_mode = 0;
        if (argc == 3) {
                ua_op_mode = UA_OP_MODE_FG;
        } else if (argc >= 4 && argc <= 6) {
@@ -1089,23 +1090,25 @@ int check_ua_op_mode(int argc, char **argv)
                }
                if (argc == 6) {
                        if (argv[4][0] == 'a') {
-                               ua_slot_mode='a';
+                               ua_slot_mode = 'a';
                        } else if (argv[4][0] == 'b') {
-                               ua_slot_mode='b';
+                               ua_slot_mode = 'b';
                        } else {
-                               ua_slot_mode=-1;
+                               ua_slot_mode = -1;
                        }
-                       char *block_device = realpath(argv[5], blk_dev);
+                       // TODO: realpath is fundamentally broken, see man. Not that we care :)
+                       char *block_device = realpath(argv[5], blk_dev_arg);
                        if (!block_device) {
-                               snprintf(blk_dev, sizeof(blk_dev), "Unable to get realpath for: %s\n", argv[5]);
-                               print_usage(blk_dev);
+                               int max_err_len = strlen(argv[5]) + 100;
+                               char err[max_err_len];
+                               snprintf(err, max_err_len, "Unable to get realpath for: %s\n", argv[5]);
+                               print_usage(err);
                                return -1;
                        }
-                       // sizeof(blk_dev_arg) == PATH_MAX; PATH_MAX > MAX_FOLDER_PATH
-                       snprintf(blk_dev_arg, sizeof(blk_dev_arg), "%s", blk_dev);
+                       // Thanks to realpath call, blk_dev_arg now contains the path.
                }
                else if (argc == 5) {
-                       print_usage("Unable to parse arguments, please specify upgrade_slot and block_device or none off them.\n");
+                       print_usage("Unable to parse arguments, please specify upgrade_slot and block_device or none of them.\n");
                        return -1;
                }
        }