commit 102bc0b6fc9ce25146ab721de71d6ad3b8866158
parent 45a1499e177cbc9e1203f87ad76690934ef0dc1e
Author: Wilson Gheen <wilson@wilsonrgheen.com>
Date:   Sun, 15 Jan 2023 10:49:10 -0600
Add error-checking for overly long arguments and fix error message for -w/-l
Diffstat:
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/photomosaics.c b/photomosaics.c
@@ -415,9 +415,10 @@ void usage(char *progname) {
 int main(int argc, char **argv) {
     ExceptionInfo *exception;
     Image *input_img, *output_img = NULL;
-    char input_img_filename[400];
+    const size_t max_fn_len = 400;
+    char input_img_filename[max_fn_len];
     input_img_filename[0] = 0;
-    char output_img_filename[400];
+    char output_img_filename[max_fn_len];
     output_img_filename[0] = 0;
     ImageInfo *image_info, *new_image_info = NULL;
     size_t length = 1, width = 1;
@@ -429,25 +430,26 @@ int main(int argc, char **argv) {
             usage(argv[0]);
             return 0;
         case 'i':
-            strcpy(input_img_filename, optarg);
+            if(slen(optarg, max_fn_len) == max_fn_len) DIE(2, "Argument \"%s\" to option -i should be less than %zu characters.", optarg, max_fn_len)
+            strncat(input_img_filename, optarg, max_fn_len - 1);
             break;
         case 'l':
             if(!parse_ulong(optarg, &length))
-                DIE(2, "Argument \"%s\" to option -l could not be parsed to a long long int.", optarg);
+                DIE(2, "Argument \"%s\" to option -l could not be parsed to an unsigned long int.", optarg);
             break;
         case 'o':
-            strcpy(output_img_filename, optarg);
+            if(slen(optarg, max_fn_len) == max_fn_len) DIE(2, "Argument \"%s\" to option -o should be less than %zu characters.", optarg, max_fn_len)
+            strncat(output_img_filename, optarg, max_fn_len - 1);
             break;
         case 'w':
             if(!parse_ulong(optarg, &width))
-                DIE(2, "Argument \"%s\" to option -w could not be parsed to a long long int.", optarg);
+                DIE(2, "Argument \"%s\" to option -w could not be parsed to an unsigned long int.", optarg);
             break;
         }
     }
 
-
-    if(slen(input_img_filename, 400) < 1)  DIE(2, "No input image specified.%s", "");
-    if(slen(output_img_filename, 400) < 1) DIE(2, "No output image specified.%s", "");
+    if(slen(input_img_filename, max_fn_len) < 1)  DIE(2, "No input image specified.%s", "");
+    if(slen(output_img_filename, max_fn_len) < 1) DIE(2, "No output image specified.%s", "");
 
     MagickCoreGenesis(*argv, MagickTrue);
     exception = AcquireExceptionInfo();