aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <daniel@totalueberwachung.de>2011-08-18 15:22:01 +0200
committerDaniel Willmann <daniel@totalueberwachung.de>2011-08-22 19:27:49 +0200
commit67e2f74d01edc3a563d9037d205c44f2afd20eb4 (patch)
tree521d9d515295e0623f9d17d5fe941a7d73025600
parentccdc490c335be5f2ed5582edfa875cdb96dcb5b2 (diff)
ctrl: Use strtol instead of atoi to detect conversion errors
-rw-r--r--openbsc/src/libctrl/control_if.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/openbsc/src/libctrl/control_if.c b/openbsc/src/libctrl/control_if.c
index 12b8753ce..b1a7c418e 100644
--- a/openbsc/src/libctrl/control_if.c
+++ b/openbsc/src/libctrl/control_if.c
@@ -113,10 +113,30 @@ struct ctrl_cmd *ctrl_cmd_trap(struct ctrl_cmd *cmd)
return trap;
}
+static int get_num(vector vline, int i, long *num)
+{
+ char *token, *tmp;
+
+ if (i >= vector_active(vline))
+ return 0;
+ token = vector_slot(vline, i);
+
+ errno = 0;
+ if (token[0] == '\0')
+ return 0;
+
+ *num = strtol(token, &tmp, 10);
+ if (tmp[0] != '\0' || errno != 0)
+ return 0;
+
+ return 1;
+}
+
int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data)
{
char *token, *request;
- int num, i, j, ret, node;
+ long num;
+ int i, j, ret, node;
struct gsm_network *gsmnet = data;
struct gsm_network *net = NULL;
@@ -161,10 +181,9 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data)
if (!net)
goto err_missing;
i++;
- if (i >= vector_active(vline))
+ if (!get_num(vline, i, &num))
goto err_index;
- token = vector_slot(vline, i);
- num = atoi(token);
+
bts = gsm_bts_num(net, num);
if (!bts)
goto err_missing;
@@ -174,10 +193,9 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data)
if (!bts)
goto err_missing;
i++;
- if (i >= vector_active(vline))
+ if (!get_num(vline, i, &num))
goto err_index;
- token = vector_slot(vline, i);
- num = atoi(token);
+
trx = gsm_bts_trx_num(bts, num);
if (!trx)
goto err_missing;
@@ -187,10 +205,9 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data)
if (!trx)
goto err_missing;
i++;
- if (i >= vector_active(vline))
+ if (!get_num(vline, i, &num))
goto err_index;
- token = vector_slot(vline, i);
- num = atoi(token);
+
if ((num >= 0) && (num < TRX_NR_TS))
ts = &trx->ts[num];
if (!ts)