Ver código fonte

Be paranoid with strtol.

Check for :

* overflow/underflow
* size is 0
* size is garbage
Cyril Roelandt 13 anos atrás
pai
commit
c3b2c893af
1 arquivos alterados com 15 adições e 1 exclusões
  1. 15 1
      gcc-plugin/examples/cholesky/cholesky.h

+ 15 - 1
gcc-plugin/examples/cholesky/cholesky.h

@@ -47,7 +47,21 @@ static void __attribute__((unused)) parse_args(int argc, char **argv)
 	for (i = 1; i < argc; i++) {
 		if (strcmp(argv[i], "-size") == 0) {
 		        char *argptr;
-			size = strtol(argv[++i], &argptr, 10);
+			long int ret;
+			ret = strtol(argv[++i], &argptr, 10);
+			if (*argptr != '\0') {
+				fprintf(stderr, "Invalid size %s, aborting \n", argv[i]);
+				exit(EXIT_FAILURE);
+			}
+			if (ret == LONG_MIN || ret == LONG_MAX) {
+				perror("strtol");
+				exit(EXIT_FAILURE);
+			}
+			if (ret == 0) {
+				fprintf(stderr, "0 is not a valid size\n");
+				exit(EXIT_FAILURE);
+			}
+			size = ret;
 		}
 
 		if (strcmp(argv[i], "-nblocks") == 0) {