@@ -4857,8 +4857,8 @@ typedef struct list_entry {
4857
4857
4858
4858
typedef struct srtp_stream_list_ctx_t_ {
4859
4859
list_entry * entries ;
4860
+ size_t capacity ;
4860
4861
size_t size ;
4861
- size_t available ;
4862
4862
} srtp_stream_list_ctx_t_ ;
4863
4863
4864
4864
srtp_err_status_t srtp_stream_list_alloc (srtp_stream_list_t * list_ptr )
@@ -4876,8 +4876,8 @@ srtp_err_status_t srtp_stream_list_alloc(srtp_stream_list_t *list_ptr)
4876
4876
return srtp_err_status_alloc_fail ;
4877
4877
}
4878
4878
4879
- list -> size = INITIAL_STREAM_INDEX_SIZE ;
4880
- list -> available = INITIAL_STREAM_INDEX_SIZE ;
4879
+ list -> capacity = INITIAL_STREAM_INDEX_SIZE ;
4880
+ list -> size = 0 ;
4881
4881
4882
4882
* list_ptr = list ;
4883
4883
@@ -4887,7 +4887,7 @@ srtp_err_status_t srtp_stream_list_alloc(srtp_stream_list_t *list_ptr)
4887
4887
srtp_err_status_t srtp_stream_list_dealloc (srtp_stream_list_t list )
4888
4888
{
4889
4889
/* list must be empty */
4890
- if (list -> available != list -> size ) {
4890
+ if (list -> size != 0 ) {
4891
4891
return srtp_err_status_fail ;
4892
4892
}
4893
4893
@@ -4908,32 +4908,38 @@ srtp_err_status_t srtp_stream_list_insert(srtp_stream_list_t list,
4908
4908
* there is no space to hold the new entry in the entries buffer,
4909
4909
* double the size of the buffer.
4910
4910
*/
4911
- if (list -> available == 0 ) {
4912
- size_t new_size = list -> size * 2 ;
4911
+ if (list -> size == list -> capacity ) {
4912
+ size_t new_capacity = list -> capacity * 2 ;
4913
+
4914
+ // check for capacity overflow.
4915
+ if ((sizeof (list_entry ) * new_capacity ) <=
4916
+ (sizeof (list_entry ) * list -> capacity )) {
4917
+ return srtp_err_status_alloc_fail ;
4918
+ }
4919
+
4913
4920
list_entry * new_entries =
4914
- srtp_crypto_alloc (sizeof (list_entry ) * new_size );
4921
+ srtp_crypto_alloc (sizeof (list_entry ) * new_capacity );
4915
4922
if (new_entries == NULL ) {
4916
4923
return srtp_err_status_alloc_fail ;
4917
4924
}
4918
4925
4919
4926
// copy previous entries into the new buffer
4920
- memcpy (new_entries , list -> entries , sizeof (list_entry ) * list -> size );
4927
+ memcpy (new_entries , list -> entries , sizeof (list_entry ) * list -> capacity );
4921
4928
// release previous entries
4922
4929
srtp_crypto_free (list -> entries );
4923
4930
// assign new entries to the list
4924
4931
list -> entries = new_entries ;
4925
- // update list info
4926
- list -> size = new_size ;
4927
- list -> available = new_size / 2 ;
4932
+ // update list capacity
4933
+ list -> capacity = new_capacity ;
4928
4934
}
4929
4935
4930
4936
// fill the first available entry
4931
- size_t next_index = list -> size - list -> available ;
4937
+ size_t next_index = list -> size ;
4932
4938
list -> entries [next_index ].ssrc = stream -> ssrc ;
4933
4939
list -> entries [next_index ].stream = stream ;
4934
4940
4935
- // update available value
4936
- list -> available -- ;
4941
+ // update size value
4942
+ list -> size ++ ;
4937
4943
4938
4944
return srtp_err_status_ok ;
4939
4945
}
@@ -4946,14 +4952,14 @@ srtp_err_status_t srtp_stream_list_insert(srtp_stream_list_t list,
4946
4952
void srtp_stream_list_remove (srtp_stream_list_t list ,
4947
4953
srtp_stream_t stream_to_remove )
4948
4954
{
4949
- size_t end = list -> size - list -> available ;
4955
+ size_t end = list -> size ;
4950
4956
4951
4957
for (size_t i = 0 ; i < end ; i ++ ) {
4952
4958
if (list -> entries [i ].ssrc == stream_to_remove -> ssrc ) {
4953
- size_t entries_to_move = list -> size - list -> available - i - 1 ;
4959
+ size_t entries_to_move = list -> size - i - 1 ;
4954
4960
memmove (& list -> entries [i ], & list -> entries [i + 1 ],
4955
4961
sizeof (list_entry ) * entries_to_move );
4956
- list -> available ++ ;
4962
+ list -> size -- ;
4957
4963
4958
4964
break ;
4959
4965
}
@@ -4962,7 +4968,7 @@ void srtp_stream_list_remove(srtp_stream_list_t list,
4962
4968
4963
4969
srtp_stream_t srtp_stream_list_get (srtp_stream_list_t list , uint32_t ssrc )
4964
4970
{
4965
- size_t end = list -> size - list -> available ;
4971
+ size_t end = list -> size ;
4966
4972
4967
4973
list_entry * entries = list -> entries ;
4968
4974
@@ -4981,25 +4987,25 @@ void srtp_stream_list_for_each(srtp_stream_list_t list,
4981
4987
{
4982
4988
list_entry * entries = list -> entries ;
4983
4989
4984
- size_t available = list -> available ;
4990
+ size_t size = list -> size ;
4985
4991
4986
4992
/*
4987
4993
* the second statement of the expression needs to be recalculated on each
4988
4994
* iteration as the available number of entries may change within the given
4989
4995
* callback.
4990
4996
* Ie: in case the callback calls srtp_stream_list_remove().
4991
4997
*/
4992
- for (size_t i = 0 ; i < list -> size - list -> available ;) {
4998
+ for (size_t i = 0 ; i < list -> size ;) {
4993
4999
if (!callback (entries [i ].stream , data )) {
4994
5000
break ;
4995
5001
}
4996
5002
4997
5003
// the entry was not removed, increase the counter.
4998
- if (available == list -> available ) {
5004
+ if (size == list -> size ) {
4999
5005
++ i ;
5000
5006
}
5001
5007
5002
- available = list -> available ;
5008
+ size = list -> size ;
5003
5009
}
5004
5010
}
5005
5011
0 commit comments