options: use strtonum(3) to convert numbers

Limit the ranges for integers accepted as command line options.
pull/1/head
Michael Santos 7 years ago
parent f30f666d87
commit cee9094fc8

@ -66,6 +66,7 @@ main(int argc, char **argv)
u_int16_t port = 0; u_int16_t port = 0;
int ch = 0; int ch = 0;
const char *errstr = NULL;
state = xmppipe_calloc(1, sizeof(xmppipe_state_t)); state = xmppipe_calloc(1, sizeof(xmppipe_state_t));
@ -108,7 +109,11 @@ main(int argc, char **argv)
p = strchr(addr, ':'); p = strchr(addr, ':');
if (p) { if (p) {
*p++ = '\0'; *p++ = '\0';
port = (u_int16_t)atoi(p); port = strtonum(p, 0, 0xfffe, &errstr);
if (errstr) {
warnx("invalid argument: %s: %s", p, errstr);
usage(state);
}
} }
} }
break; break;
@ -129,31 +134,62 @@ main(int argc, char **argv)
case 'b': case 'b':
/* read buffer size */ /* read buffer size */
state->bufsz = (size_t)atoi(optarg); state->bufsz = strtonum(optarg, 3, 0xfffe, &errstr);
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'c': case 'c':
/* XEP-0198: stream management flow control */ /* XEP-0198: stream management flow control */
state->sm_fc = (u_int32_t)atoi(optarg); state->sm_fc = strtonum(optarg, 0, 0xfffe, &errstr);
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'I': case 'I':
/* XEP-0198: stream management request interval */ /* XEP-0198: stream management request interval */
state->sm_request_interval = (u_int32_t)atoi(optarg); state->sm_request_interval = strtonum(optarg, 0, 0xfffe,
&errstr);
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'k': case 'k':
/* XEP-0199: XMPP ping keepalives */ /* XEP-0199: XMPP ping keepalives */
state->keepalive = (u_int32_t)atoi(optarg) * 1000; state->sm_request_interval = strtonum(optarg, 0, 0xfffe,
&errstr) * 1000;
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'K': case 'K':
/* XEP-0199: number of keepalive without a reply */ /* XEP-0199: number of keepalive without a reply */
state->keepalive_limit = (u_int32_t)atoi(optarg); state->keepalive_limit = strtonum(optarg, 0, 0xfffe,
&errstr);
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'P': case 'P':
/* poll delay */ /* poll delay */
state->poll = (u_int32_t)atoi(optarg); state->poll = strtonum(optarg, 0, 0xfffe, &errstr);
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'U': case 'U':
/* XEP-0198: stream management unacked requests */ /* XEP-0198: stream management unacked requests */
state->sm_unacked = (u_int32_t)atoi(optarg); state->sm_unacked = strtonum(optarg, 0, 0xfffe, &errstr);
if (errstr) {
warnx("invalid argument: %s: %s", optarg, errstr);
usage(state);
}
break; break;
case 'd': case 'd':
@ -179,8 +215,7 @@ main(int argc, char **argv)
if (jid == NULL) if (jid == NULL)
usage(state); usage(state);
if (state->bufsz < 3 || state->bufsz >= 0xffff if (state->encode && BASE64_LENGTH(state->bufsz) + 1 > 0xffff)
|| (state->encode && BASE64_LENGTH(state->bufsz) + 1 > 0xffff))
usage(state); usage(state);
if (state->keepalive_limit < 1) if (state->keepalive_limit < 1)

Loading…
Cancel
Save