Bluetooth: ISO: Ensure strtoX correctness in iso.c
Verify all values returned by calls to strtoX and convert to the shell_strtoX functions. Signed-off-by: Emil Gydesen <emil.gydesen@nordicsemi.no>
This commit is contained in:
parent
ab9d2c32c9
commit
0c9180ef99
|
@ -160,58 +160,174 @@ static int cmd_cig_create(const struct shell *sh, size_t argc, char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
err = 0;
|
||||
if (argc > 2) {
|
||||
param.interval = strtol(argv[2], NULL, 0);
|
||||
unsigned long interval;
|
||||
|
||||
interval = shell_strtoul(argv[2], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse interval: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (!IN_RANGE(interval,
|
||||
BT_ISO_SDU_INTERVAL_MIN,
|
||||
BT_ISO_SDU_INTERVAL_MAX)) {
|
||||
shell_error(sh, "Invalid interval %lu", interval);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.interval = interval;
|
||||
} else {
|
||||
param.interval = 10000;
|
||||
}
|
||||
cis_sdu_interval_us = param.interval;
|
||||
|
||||
if (argc > 3) {
|
||||
param.packing = strtol(argv[3], NULL, 0);
|
||||
unsigned long packing;
|
||||
|
||||
packing = shell_strtoul(argv[3], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse packing: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (!IN_RANGE(packing,
|
||||
BT_ISO_PACKING_SEQUENTIAL,
|
||||
BT_ISO_PACKING_INTERLEAVED)) {
|
||||
shell_error(sh, "Invalid packing %lu", packing);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.packing = packing;
|
||||
} else {
|
||||
param.packing = 0;
|
||||
}
|
||||
|
||||
if (argc > 4) {
|
||||
param.framing = strtol(argv[4], NULL, 0);
|
||||
unsigned long framing;
|
||||
|
||||
framing = shell_strtoul(argv[4], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse framing: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (!IN_RANGE(framing,
|
||||
BT_ISO_FRAMING_UNFRAMED,
|
||||
BT_ISO_FRAMING_FRAMED)) {
|
||||
shell_error(sh, "Invalid framing %lu", framing);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.framing = framing;
|
||||
} else {
|
||||
param.framing = 0;
|
||||
}
|
||||
|
||||
if (argc > 5) {
|
||||
param.latency = strtol(argv[5], NULL, 0);
|
||||
unsigned long latency;
|
||||
|
||||
latency = shell_strtoul(argv[5], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse latency: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (!IN_RANGE(latency,
|
||||
BT_ISO_LATENCY_MIN,
|
||||
BT_ISO_LATENCY_MAX)) {
|
||||
shell_error(sh, "Invalid latency %lu", latency);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.latency = latency;
|
||||
} else {
|
||||
param.latency = 10;
|
||||
}
|
||||
|
||||
if (argc > 6) {
|
||||
unsigned long sdu;
|
||||
|
||||
sdu = shell_strtoul(argv[6], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse sdu: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (sdu > BT_ISO_MAX_SDU) {
|
||||
shell_error(sh, "Invalid sdu %lu", sdu);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (chans[0]->qos->tx) {
|
||||
chans[0]->qos->tx->sdu = strtol(argv[6], NULL, 0);
|
||||
chans[0]->qos->tx->sdu = sdu;
|
||||
}
|
||||
|
||||
if (chans[0]->qos->rx) {
|
||||
chans[0]->qos->rx->sdu = strtol(argv[6], NULL, 0);
|
||||
chans[0]->qos->rx->sdu = sdu;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc > 7) {
|
||||
unsigned long phy;
|
||||
|
||||
phy = shell_strtoul(argv[7], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse phy: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (phy != BT_GAP_LE_PHY_1M &&
|
||||
phy != BT_GAP_LE_PHY_2M &&
|
||||
phy != BT_GAP_LE_PHY_CODED) {
|
||||
shell_error(sh, "Invalid phy %lu", phy);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (chans[0]->qos->tx) {
|
||||
chans[0]->qos->tx->phy = strtol(argv[7], NULL, 0);
|
||||
chans[0]->qos->tx->phy = phy;
|
||||
}
|
||||
|
||||
if (chans[0]->qos->rx) {
|
||||
chans[0]->qos->rx->phy = strtol(argv[7], NULL, 0);
|
||||
chans[0]->qos->rx->phy = phy;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc > 8) {
|
||||
unsigned long rtn;
|
||||
|
||||
rtn = shell_strtoul(argv[8], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse rtn: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (rtn > BT_ISO_CONNECTED_RTN_MAX) {
|
||||
shell_error(sh, "Invalid rtn %lu", rtn);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (chans[0]->qos->tx) {
|
||||
chans[0]->qos->tx->rtn = strtol(argv[8], NULL, 0);
|
||||
chans[0]->qos->tx->rtn = rtn;
|
||||
}
|
||||
|
||||
if (chans[0]->qos->rx) {
|
||||
chans[0]->qos->rx->rtn = strtol(argv[8], NULL, 0);
|
||||
chans[0]->qos->rx->rtn = rtn;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -361,11 +477,18 @@ static int cmd_send(const struct shell *sh, size_t argc, char *argv[])
|
|||
static uint8_t buf_data[CONFIG_BT_ISO_TX_MTU] = {
|
||||
[0 ... (CONFIG_BT_ISO_TX_MTU - 1)] = 0xff
|
||||
};
|
||||
int ret, len, count = 1;
|
||||
unsigned long count = 1;
|
||||
struct net_buf *buf;
|
||||
int ret = 0;
|
||||
int len;
|
||||
|
||||
if (argc > 1) {
|
||||
count = strtoul(argv[1], NULL, 10);
|
||||
count = shell_strtoul(argv[1], 0, &ret);
|
||||
if (ret != 0) {
|
||||
shell_error(sh, "Could not parse count: %d", ret);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
}
|
||||
|
||||
if (!iso_chan.iso) {
|
||||
|
@ -465,11 +588,18 @@ static int cmd_broadcast(const struct shell *sh, size_t argc, char *argv[])
|
|||
static uint8_t buf_data[CONFIG_BT_ISO_TX_MTU] = {
|
||||
[0 ... (CONFIG_BT_ISO_TX_MTU - 1)] = 0xff
|
||||
};
|
||||
int ret, len, count = 1;
|
||||
unsigned long count = 1;
|
||||
struct net_buf *buf;
|
||||
int ret = 0;
|
||||
int len;
|
||||
|
||||
if (argc > 1) {
|
||||
count = strtoul(argv[1], NULL, 10);
|
||||
count = shell_strtoul(argv[1], 0, &ret);
|
||||
if (ret != 0) {
|
||||
shell_error(sh, "Could not parse count: %d", ret);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bis_iso_chan.iso) {
|
||||
|
@ -591,28 +721,38 @@ static int cmd_big_sync(const struct shell *sh, size_t argc, char *argv[])
|
|||
/* TODO: Add support to select which PA sync to BIG sync to */
|
||||
struct bt_le_per_adv_sync *pa_sync = per_adv_syncs[0];
|
||||
struct bt_iso_big_sync_param param;
|
||||
unsigned long bis_bitfield;
|
||||
|
||||
if (!pa_sync) {
|
||||
shell_error(sh, "No PA sync selected");
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
bis_bitfield = shell_strtoul(argv[1], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse bis_bitfield: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (bis_bitfield > BIT_MASK(BT_ISO_BIS_INDEX_MAX)) {
|
||||
shell_error(sh, "Invalid bis_bitfield: %lu", bis_bitfield);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
bis_iso_qos.tx = NULL;
|
||||
|
||||
param.bis_channels = bis_channels;
|
||||
param.num_bis = BIS_ISO_CHAN_COUNT;
|
||||
param.encryption = false;
|
||||
param.bis_bitfield = strtoul(argv[1], NULL, 16);
|
||||
param.bis_bitfield = bis_bitfield;
|
||||
param.mse = 0;
|
||||
param.sync_timeout = 0xFF;
|
||||
|
||||
for (int i = 2; i < argc; i++) {
|
||||
for (size_t i = 2U; i < argc; i++) {
|
||||
if (!strcmp(argv[i], "mse")) {
|
||||
param.mse = strtoul(argv[i], NULL, 16);
|
||||
} else if (!strcmp(argv[i], "timeout")) {
|
||||
param.sync_timeout = strtoul(argv[i], NULL, 16);
|
||||
} else if (!strcmp(argv[i], "enc")) {
|
||||
uint8_t bcode_len;
|
||||
unsigned long mse;
|
||||
|
||||
i++;
|
||||
if (i == argc) {
|
||||
|
@ -620,13 +760,69 @@ static int cmd_big_sync(const struct shell *sh, size_t argc, char *argv[])
|
|||
return SHELL_CMD_HELP_PRINTED;
|
||||
}
|
||||
|
||||
mse = shell_strtoul(argv[i], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh, "Could not parse mse: %d", err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (!IN_RANGE(mse,
|
||||
BT_ISO_SYNC_MSE_MIN,
|
||||
BT_ISO_SYNC_MSE_MAX)) {
|
||||
shell_error(sh, "Invalid mse %lu", mse);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.mse = mse;
|
||||
} else if (!strcmp(argv[i], "timeout")) {
|
||||
unsigned long sync_timeout;
|
||||
|
||||
i++;
|
||||
if (i == argc) {
|
||||
shell_help(sh);
|
||||
return SHELL_CMD_HELP_PRINTED;
|
||||
}
|
||||
|
||||
sync_timeout = shell_strtoul(argv[i], 0, &err);
|
||||
if (err != 0) {
|
||||
shell_error(sh,
|
||||
"Could not parse sync_timeout: %d",
|
||||
err);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
if (!IN_RANGE(sync_timeout,
|
||||
BT_ISO_SYNC_MSE_MIN,
|
||||
BT_ISO_SYNC_MSE_MAX)) {
|
||||
shell_error(sh, "Invalid sync_timeout %lu",
|
||||
sync_timeout);
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.sync_timeout = sync_timeout;
|
||||
} else if (!strcmp(argv[i], "enc")) {
|
||||
size_t bcode_len;
|
||||
|
||||
i++;
|
||||
if (i == argc) {
|
||||
shell_help(sh);
|
||||
return SHELL_CMD_HELP_PRINTED;
|
||||
}
|
||||
|
||||
memset(param.bcode, 0, sizeof(param.bcode));
|
||||
bcode_len = hex2bin(argv[i], strlen(argv[i]), param.bcode,
|
||||
sizeof(param.bcode));
|
||||
|
||||
if (!bcode_len || bcode_len != sizeof(param.bcode)) {
|
||||
shell_error(sh, "Invalid Broadcast Code Length");
|
||||
if (bcode_len == 0) {
|
||||
shell_error(sh, "Invalid Broadcast Code");
|
||||
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
param.encryption = true;
|
||||
} else {
|
||||
shell_help(sh);
|
||||
|
|
Loading…
Reference in a new issue