--- sort.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/sort.c b/sort.c index 6184b0b..128945f 100644 --- a/sort.c +++ b/sort.c _AT_@ -1,6 +1,8 @@ /* See LICENSE file for copyright and license details. */ #include <ctype.h> +#include <errno.h> #include <stdio.h> +#include <stdint.h> #include <stdlib.h> #include <string.h> #include <unistd.h> _AT_@ -9,10 +11,10 @@ #include "util.h" struct keydef { - int start_column; - int end_column; - int start_char; - int end_char; + size_t start_column; + size_t end_column; + size_t start_char; + size_t end_char; int flags; }; _AT_@ -32,6 +34,7 @@ static struct kdlist *head = NULL; static struct kdlist *tail = NULL; static void addkeydef(char *, int); +static long long estrtoll(char *, char **, long long, long long); static void check(FILE *); static int linecmp(const char **, const char **); static char *skipblank(char *); _AT_@ -214,6 +217,20 @@ parse_flags(char **s, int *flags, int bflag) return 0; } +static long long +estrtoll(char *nptr, char **endptr, long long minval, long long maxval) +{ + long long n; + + n = strtoll(nptr, endptr, 10); + if (n < minval || (n == LLONG_MIN && errno == ERANGE)) + enprintf(2, "strtoll: %lld too small\n", n); + if (n > maxval || (n == LLONG_MAX && errno == ERANGE)) + enprintf(2, "strtoll: %lld too large\n", n); + + return n; +} + static int parse_keydef(struct keydef *kd, char *s, int flags) { _AT_@ -226,24 +243,17 @@ parse_keydef(struct keydef *kd, char *s, int flags) kd->end_char = 0; kd->flags = flags; - kd->start_column = strtol(rest, &rest, 10); - if (kd->start_column < 1) - return -1; + kd->start_column = estrtoll(rest, &rest, 1, MIN(SIZE_MAX, LLONG_MAX)); if (*rest == '.') - kd->start_char = strtol(rest+1, &rest, 10); - if (kd->start_char < 1) - return -1; + kd->start_char = estrtoll(rest + 1, &rest, 1, MIN(SIZE_MAX, LLONG_MAX)); if (parse_flags(&rest, &kd->flags, MOD_STARTB) < 0) return -1; if (*rest == ',') { - kd->end_column = strtol(rest+1, &rest, 10); + kd->end_column = estrtoll(rest + 1, &rest, 0, MIN(SIZE_MAX, LLONG_MAX)); if (kd->end_column && kd->end_column < kd->start_column) return -1; - if (*rest == '.') { - kd->end_char = strtol(rest+1, &rest, 10); - if (kd->end_char < 1) - return -1; - } + if (*rest == '.') + kd->end_char = estrtoll(rest + 1, &rest, 1, MIN(SIZE_MAX, LLONG_MAX)); if (parse_flags(&rest, &kd->flags, MOD_ENDB) < 0) return -1; } _AT_@ -280,7 +290,7 @@ static char * columns(char *line, const struct keydef *kd) { char *start, *end; - int i; + size_t i; for (i = 1, start = line; i < kd->start_column; i++) start = nextcol(start); -- 1.9.1 --------------030800010706080104080704--Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Sun Feb 15 2015 - 00:48:06 CET