X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Flib%2Fcmdline_parse_num.c;h=31ca78d2318bbb861d7b27091f1d48ea5a6627d3;hb=f32d30f48ddfb55b86efd695e0dd144e9d15401e;hp=cd3ca1e612eaafb457f3d200b9e3e6ee4aab601a;hpb=5dbaf53aa2c6187d464108e360621ebfff6e0bc4;p=libcmdline.git diff --git a/src/lib/cmdline_parse_num.c b/src/lib/cmdline_parse_num.c index cd3ca1e..31ca78d 100644 --- a/src/lib/cmdline_parse_num.c +++ b/src/lib/cmdline_parse_num.c @@ -71,14 +71,6 @@ //#define debug_printf(args...) printf(args) #define debug_printf(args...) do {} while(0) -struct cmdline_token_ops cmdline_token_num_ops = { - .parse = cmdline_parse_num, - .complete_get_nb = NULL, - .complete_get_elt = NULL, - .get_help = cmdline_get_help_num, -}; - - enum num_parse_state_t { START, DEC_NEG, @@ -109,7 +101,7 @@ static const char * num_help[] = { #endif }; -static inline int +static int add_to_res(unsigned int c, uint64_t *res, unsigned int base) { /* overflow */ @@ -121,10 +113,46 @@ add_to_res(unsigned int c, uint64_t *res, unsigned int base) return 0; } +static int +check_res_size(struct cmdline_token_num_data *nd, unsigned ressize) +{ + switch (nd->type) { + case INT8: + case UINT8: + if (ressize < sizeof(int8_t)) + return -1; + break; + case INT16: + case UINT16: + if (ressize < sizeof(int16_t)) + return -1; + break; + case INT32: + case UINT32: + if (ressize < sizeof(int32_t)) + return -1; + break; + case INT64: + case UINT64: + if (ressize < sizeof(int64_t)) + return -1; + break; +#ifdef CMDLINE_HAVE_FLOAT + case FLOAT: + if (ressize < sizeof(float)) + return -1; + break; +#endif + default: + return -1; + } + return 0; +} /* parse an int or a float */ -int -cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) +static int +cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, + void *res, unsigned ressize) { struct cmdline_token_num_data nd; enum num_parse_state_t st = START; @@ -137,6 +165,12 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) memcpy(&nd, &((struct cmdline_token_num *)tk)->num_data, sizeof(nd)); + /* check that we have enough room in res */ + if (res) { + if (check_res_size(&nd, ressize) < 0) + return -1; + } + while (st != ERROR && c != '\0') { debug_printf("%c %x -> ", c, c); switch (st) { @@ -469,8 +503,8 @@ cmdline_parse_num(cmdline_parse_token_hdr_t *tk, const char *srcbuf, void *res) /* parse an int or a float */ -int -cmdline_get_help_num(cmdline_parse_token_hdr_t *tk, char *dstbuf, unsigned int size) +static int +cmdline_help_num(cmdline_parse_token_hdr_t *tk, char *dstbuf, unsigned int size) { struct cmdline_token_num_data nd; @@ -484,3 +518,12 @@ cmdline_get_help_num(cmdline_parse_token_hdr_t *tk, char *dstbuf, unsigned int s dstbuf[size-1] = '\0'; return 0; } + + +struct cmdline_token_ops cmdline_token_num_ops = { + .parse = cmdline_parse_num, + .complete_start = NULL, + .complete_iterate = NULL, + .complete_end = NULL, + .help = cmdline_help_num, +};