Ver código fonte

Fix int parsing in getopt

Martijn Braam 3 anos atrás
pai
commit
e7c6820469
1 arquivos alterados com 19 adições e 5 exclusões
  1. 19 5
      single.c

+ 19 - 5
single.c

@@ -1,6 +1,7 @@
 #include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
 #include <unistd.h>
-#include <libnet.h>
 
 #include "postprocess.h"
 
@@ -23,7 +24,9 @@ main(int argc, char *argv[])
 {
     int opt;
     int verbose = 0;
+    long temp;
     int quality = 90;
+    char *endptr;
     char *input_path;
     char *output_path;
 
@@ -33,21 +36,32 @@ main(int argc, char *argv[])
                 verbose = 1;
                 break;
             case 'q':
-                quality = atoi(optarg);
+                temp = strtol(optarg, &endptr, 0);
+                if (errno == ERANGE || *endptr != '\0' || optarg == endptr) {
+                    fprintf(stderr, "Invalid value for -q\n");
+                    print_usage(argv[0]);
+                    return 1;
+                }
+                if (temp < 0 || temp > 100) {
+                    fprintf(stderr, "Quality out of range, valid values are 0-100\n");
+                    print_usage(argv[0]);
+                    return 1;
+                }
+                quality = (int) temp;
                 break;
             case 'h':
                 print_usage(argv[0]);
-                exit(0);
+                return 0;
             case '?':
                 print_usage(argv[0]);
-                exit(1);
+                return 1;
         }
     }
 
     if (argc < optind + 2) {
         fprintf(stderr, "Missing image parameters\n");
         print_usage(argv[0]);
-        exit(1);
+        return 1;
     }
 
     input_path = argv[optind];