} icand_t;
#define MAX_CAND 50
+#define MAX_CAND_IDX_COUNT 2
typedef struct ice_s {
- icand_t cands[MAX_CAND][2];
- int cand_idx[2];
- int chosen[2];
- int is_chosen[2];
+ icand_t cands[MAX_CAND][MAX_CAND_IDX_COUNT];
+ int cand_idx[MAX_CAND_IDX_COUNT];
+ int chosen[MAX_CAND_IDX_COUNT];
+ int is_chosen[MAX_CAND_IDX_COUNT];
char *ufrag;
char *pwd;
char *options;
SWITCH_DECLARE(switch_status_t) switch_frame_alloc(switch_frame_t **frame, switch_size_t size);
SWITCH_DECLARE(switch_status_t) switch_frame_dup(switch_frame_t *orig, switch_frame_t **clone);
SWITCH_DECLARE(switch_status_t) switch_frame_free(switch_frame_t **frame);
+
+/*! \brief Check if a 32 bit unsigned number is in a range.
+ * \param str string to check. Should not contain non-digit characters.
+ * \param from start of range including this number
+ * \param to end of range including this number
+ * \return true or false
+ */
+SWITCH_DECLARE(switch_bool_t) switch_is_uint_in_range(const char *str, unsigned int from, unsigned int to);
SWITCH_DECLARE(switch_bool_t) switch_is_number(const char *str);
SWITCH_DECLARE(switch_bool_t) switch_is_leading_number(const char *str);
SWITCH_DECLARE(char *) switch_find_parameter(const char *str, const char *param, switch_memory_pool_t *pool);
argc = switch_split(data, ' ', fields);
+ if (argc < 6 || !switch_is_uint_in_range(fields[1], 1, MAX_CAND_IDX_COUNT)) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Invalid data\n");
+ continue;
+ }
+
cid = fields[1] ? atoi(fields[1]) - 1 : 0;
- if (argc < 6 || engine->ice_in.cand_idx[cid] >= MAX_CAND - 1) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Invalid data\n");
+ if (engine->ice_in.cand_idx[cid] >= MAX_CAND - 1) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Too many candidates\n");
continue;
}
relay:
- for (cid = 0; cid < 2; cid++) {
+ for (cid = 0; cid < MAX_CAND_IDX_COUNT; cid++) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_DEBUG, "Searching for %s candidate.\n", cid ? "rtcp" : "rtp");
for (ai = 0; ai < engine->cand_acl_count; ai++) {
return args;
}
+SWITCH_DECLARE(switch_bool_t) switch_is_uint_in_range(const char *str, unsigned int from, unsigned int to)
+{
+ unsigned int number;
+ const char *original_str = str;
+
+ if (str == NULL || *str == '\0' || from > to) {
+ return SWITCH_FALSE;
+ }
+
+ for (; *str != '\0'; str++) {
+ if (!isdigit(*str)) {
+ return SWITCH_FALSE;
+ }
+ }
+
+ number = atoi(original_str);
+
+ if (number < from || number > to) {
+ return SWITCH_FALSE;
+ }
+
+ return SWITCH_TRUE;
+}
+
SWITCH_DECLARE(switch_bool_t) switch_is_number(const char *str)
{
const char *p;
FST_TEST_END()
#endif
+ FST_TEST_BEGIN(test_switch_is_number_in_range)
+ {
+ fst_check_int_equals(switch_is_uint_in_range("x5", 0, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("0", 1, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("-11", -10, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("-10", -10, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("-5", -10, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("-5", -10, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("5", -10, 10), SWITCH_FALSE);
+ fst_check_int_equals(switch_is_uint_in_range("0", 0, 10), SWITCH_TRUE);
+ fst_check_int_equals(switch_is_uint_in_range("10", 0, 10), SWITCH_TRUE);
+ fst_check_int_equals(switch_is_uint_in_range("11", 0, 10), SWITCH_FALSE);
+ }
+ FST_TEST_END()
+
FST_TEST_BEGIN(test_md5)
{
char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 };