|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 1/2] lib/nolibc: strto* returns ERANGE/EINVAL error codes
In accordance with the posix documentation, strto* functions shall
report ERANGE if the correct value is outside the range of
representable values and EINVAL if no conversion was performed
Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
---
lib/nolibc/stdlib.c | 41 ++++++++++++++++++++++++++++++++++-------
1 file changed, 34 insertions(+), 7 deletions(-)
diff --git a/lib/nolibc/stdlib.c b/lib/nolibc/stdlib.c
index d3c94e1..76236af 100644
--- a/lib/nolibc/stdlib.c
+++ b/lib/nolibc/stdlib.c
@@ -72,6 +72,13 @@ unsigned long strtoul(const char *nptr, char **endptr, int
base)
unsigned long cutoff;
int neg = 0, any, cutlim;
+ if (base < 0 || base == 1 || base > 36) {
+ errno = -EINVAL;
+ any = 0;
+ acc = 0;
+ goto exit;
+ }
+
/*
* See strtol for comments as to the logic used.
*/
@@ -111,10 +118,12 @@ unsigned long strtoul(const char *nptr, char **endptr,
int base)
acc += c;
}
}
- if (any < 0)
+ if (any < 0) {
acc = ULONG_MAX;
- else if (neg)
+ errno = ERANGE;
+ } else if (neg)
acc = -acc;
+exit:
if (endptr != 0)
*endptr = __DECONST(char *, any ? s - 1 : nptr);
return acc;
@@ -134,12 +143,18 @@ long long strtoll(const char *nptr, char **endptr, int
base)
unsigned long long qbase, cutoff;
int neg, any, cutlim;
+ s = nptr;
+ if (base < 0 || base == 1 || base > 36) {
+ errno = -EINVAL;
+ any = 0;
+ acc = 0;
+ goto exit;
+ }
/*
* Skip white space and pick up leading +/- sign if any.
* If base is 0, allow 0x for hex and 0 for octal, else
* assume decimal; if base is already 16, allow 0x.
*/
- s = nptr;
do {
c = *s++;
} while (isspace(c));
@@ -203,10 +218,13 @@ long long strtoll(const char *nptr, char **endptr, int
base)
acc += c;
}
}
- if (any < 0)
+ if (any < 0) {
+ errno = ERANGE;
acc = neg ? LLONG_MIN : LLONG_MAX;
- else if (neg)
+ } else if (neg)
acc = -acc;
+
+exit:
if (endptr != 0)
*endptr = __DECONST(char *, any ? s - 1 : nptr);
return acc;
@@ -226,6 +244,12 @@ unsigned long long strtoull(const char *nptr, char
**endptr, int base)
unsigned long long qbase, cutoff;
int neg, any, cutlim;
+ if (base < 0 || base == 1 || base > 36) {
+ errno = -EINVAL;
+ any = 0;
+ acc = 0;
+ goto exit;
+ }
/*
* See strtoq for comments as to the logic used.
*/
@@ -269,10 +293,13 @@ unsigned long long strtoull(const char *nptr, char
**endptr, int base)
acc += c;
}
}
- if (any < 0)
+ if (any < 0) {
+ errno = ERANGE;
acc = ULLONG_MAX;
- else if (neg)
+ } else if (neg)
acc = -acc;
+
+exit:
if (endptr != 0)
*endptr = __DECONST(char *, any ? s - 1 : nptr);
return acc;
--
2.7.4
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |