@@ -292,6 +292,7 @@ int fcntl_setfl(int fd, int flag)
ssize_t strtosz(const char *nptr, char **end)
{
ssize_t retval = -1;
+ int64_t tmpval;
char *endptr;
int mul_required = 0;
double val, mul = 1;
@@ -301,9 +302,9 @@ ssize_t strtosz(const char *nptr, char **end)
mul_required = 1;
}
+ errno = 0;
val = strtod(nptr, &endptr);
-
- if (val < 0)
+ if (endptr == nptr || errno != 0 || val < 0)
goto fail;
switch (*endptr++) {
@@ -332,7 +333,10 @@ ssize_t strtosz(const char *nptr, char **end)
goto fail;
}
- retval = (ssize_t)(val * mul);
+ tmpval = (val * mul);
+ if (tmpval > ~(size_t)0)
+ goto fail;
+ retval = tmpval;
if (end)
*end = endptr;