Properly convert 64bit parameters.

Introduces kore_strtonum64() for just this purpose as to
not taint kore_strtonum() too much.
This commit is contained in:
Joris Vink 2014-07-21 01:16:03 +02:00
parent ac345410dc
commit d4cec3427e
4 changed files with 52 additions and 4 deletions

View File

@ -62,6 +62,16 @@ struct http_arg {
*(t **)o = *(t **)v; \
} while (0);
#define COPY_ARG_INT64(type, sign) \
do { \
int err; \
type nval; \
nval = (type)kore_strtonum64(q->s_value, sign, &err); \
if (err != KORE_RESULT_OK) \
return (KORE_RESULT_ERROR); \
COPY_ARG_TYPE(&nval, len, type, out); \
} while (0);
#define COPY_ARG_INT(min, max, type) \
do { \
int err; \
@ -81,6 +91,12 @@ struct http_arg {
} \
} while (0);
#define COPY_AS_INTTYPE_64(type, sign) \
do { \
CACHE_STRING(); \
COPY_ARG_INT64(type, sign); \
} while (0);
#define COPY_AS_INTTYPE(min, max, type) \
do { \
CACHE_STRING(); \

View File

@ -401,6 +401,7 @@ time_t kore_date_to_time(char *);
char *kore_time_to_date(time_t);
char *kore_strdup(const char *);
void kore_log(int, const char *, ...);
u_int64_t kore_strtonum64(const char *, int, int *);
void kore_strlcpy(char *, const char *, size_t);
void kore_server_disconnect(struct connection *);
int kore_split_string(char *, char *, char **, size_t);

View File

@ -634,11 +634,11 @@ http_argument_get(struct http_request *req, const char *name,
COPY_AS_INTTYPE(0, UINT_MAX, u_int32_t);
return (KORE_RESULT_OK);
case HTTP_ARG_TYPE_INT64:
COPY_AS_INTTYPE(LONG_MIN, LONG_MAX, u_int64_t);
break;
COPY_AS_INTTYPE_64(int64_t, 1);
return (KORE_RESULT_OK);
case HTTP_ARG_TYPE_UINT64:
COPY_AS_INTTYPE(0, ULONG_MAX, u_int64_t);
break;
COPY_AS_INTTYPE_64(u_int64_t, 0);
return (KORE_RESULT_OK);
case HTTP_ARG_TYPE_STRING:
CACHE_STRING();
*out = q->s_value;

View File

@ -14,6 +14,8 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <limits.h>
#include "kore.h"
static struct {
@ -123,6 +125,35 @@ kore_strtonum(const char *str, int base, long long min, long long max, int *err)
return (l);
}
u_int64_t
kore_strtonum64(const char *str, int sign, int *err)
{
u_int64_t l;
char *ep;
errno = 0;
l = strtoull(str, &ep, 10);
if (errno != 0 || str == ep || *ep != '\0') {
*err = KORE_RESULT_ERROR;
return (0);
}
if (sign) {
if ((int64_t)l < LLONG_MIN || l > LLONG_MAX) {
*err = KORE_RESULT_ERROR;
return (0);
}
} else {
if ((int64_t)l < 0 || l > ULLONG_MAX) {
*err = KORE_RESULT_ERROR;
return (0);
}
}
*err = KORE_RESULT_OK;
return (l);
}
int
kore_split_string(char *input, char *delim, char **out, size_t ele)
{