---
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