9
9
#include "group.h"
10
10
11
11
#include <assert.h>
12
- #include <stdlib.h> // calloc, free
13
12
#include <string.h>
14
13
15
14
#include "DHT.h"
@@ -149,6 +148,7 @@ typedef struct Group_c {
149
148
} Group_c ;
150
149
151
150
struct Group_Chats {
151
+ const Memory * mem ;
152
152
const Mono_Time * mono_time ;
153
153
154
154
Messenger * m ;
@@ -255,12 +255,12 @@ non_null()
255
255
static bool realloc_conferences (Group_Chats * g_c , uint16_t num )
256
256
{
257
257
if (num == 0 ) {
258
- free ( g_c -> chats );
258
+ mem_delete ( g_c -> mem , g_c -> chats );
259
259
g_c -> chats = nullptr ;
260
260
return true;
261
261
}
262
262
263
- Group_c * newgroup_chats = (Group_c * )realloc (g_c -> chats , num * sizeof (Group_c ));
263
+ Group_c * newgroup_chats = (Group_c * )mem_vrealloc (g_c -> mem , g_c -> chats , num , sizeof (Group_c ));
264
264
265
265
if (newgroup_chats == nullptr ) {
266
266
return false;
@@ -302,10 +302,10 @@ static int32_t create_group_chat(Group_Chats *g_c)
302
302
}
303
303
304
304
non_null ()
305
- static void wipe_group_c (Group_c * g )
305
+ static void wipe_group_c (const Memory * mem , Group_c * g )
306
306
{
307
- free ( g -> frozen );
308
- free ( g -> group );
307
+ mem_delete ( mem , g -> frozen );
308
+ mem_delete ( mem , g -> group );
309
309
crypto_memzero (g , sizeof (Group_c ));
310
310
}
311
311
@@ -320,7 +320,7 @@ static bool wipe_group_chat(Group_Chats *g_c, uint32_t groupnumber)
320
320
return false;
321
321
}
322
322
323
- wipe_group_c (& g_c -> chats [groupnumber ]);
323
+ wipe_group_c (g_c -> mem , & g_c -> chats [groupnumber ]);
324
324
325
325
uint16_t i ;
326
326
@@ -669,7 +669,7 @@ static int get_frozen_index(const Group_c *g, uint16_t peer_number)
669
669
}
670
670
671
671
non_null ()
672
- static bool delete_frozen (Group_c * g , uint32_t frozen_index )
672
+ static bool delete_frozen (const Memory * mem , Group_c * g , uint32_t frozen_index )
673
673
{
674
674
if (frozen_index >= g -> numfrozen ) {
675
675
return false;
@@ -678,14 +678,14 @@ static bool delete_frozen(Group_c *g, uint32_t frozen_index)
678
678
-- g -> numfrozen ;
679
679
680
680
if (g -> numfrozen == 0 ) {
681
- free ( g -> frozen );
681
+ mem_delete ( mem , g -> frozen );
682
682
g -> frozen = nullptr ;
683
683
} else {
684
684
if (g -> numfrozen != frozen_index ) {
685
685
g -> frozen [frozen_index ] = g -> frozen [g -> numfrozen ];
686
686
}
687
687
688
- Group_Peer * const frozen_temp = (Group_Peer * )realloc ( g -> frozen , g -> numfrozen * sizeof (Group_Peer ));
688
+ Group_Peer * const frozen_temp = (Group_Peer * )mem_vrealloc ( mem , g -> frozen , g -> numfrozen , sizeof (Group_Peer ));
689
689
690
690
if (frozen_temp == nullptr ) {
691
691
return false;
@@ -726,7 +726,7 @@ static int note_peer_active(Group_Chats *g_c, uint32_t groupnumber, uint16_t pee
726
726
727
727
/* Now thaw the peer */
728
728
729
- Group_Peer * temp = (Group_Peer * )realloc ( g -> group , ( g -> numpeers + 1 ) * sizeof (Group_Peer ));
729
+ Group_Peer * temp = (Group_Peer * )mem_vrealloc ( g_c -> mem , g -> group , g -> numpeers + 1 , sizeof (Group_Peer ));
730
730
731
731
if (temp == nullptr ) {
732
732
return -1 ;
@@ -743,7 +743,7 @@ static int note_peer_active(Group_Chats *g_c, uint32_t groupnumber, uint16_t pee
743
743
744
744
++ g -> numpeers ;
745
745
746
- delete_frozen (g , frozen_index );
746
+ delete_frozen (g_c -> mem , g , frozen_index );
747
747
748
748
if (g_c -> peer_list_changed_callback != nullptr ) {
749
749
g_c -> peer_list_changed_callback (g_c -> m , groupnumber , userdata );
@@ -779,7 +779,7 @@ static void delete_any_peer_with_pk(Group_Chats *g_c, uint32_t groupnumber, cons
779
779
const int frozen_index = frozen_in_group (g , real_pk );
780
780
781
781
if (frozen_index >= 0 ) {
782
- delete_frozen (g , frozen_index );
782
+ delete_frozen (g_c -> mem , g , frozen_index );
783
783
}
784
784
}
785
785
@@ -839,7 +839,7 @@ static int addpeer(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *real_p
839
839
840
840
delete_any_peer_with_pk (g_c , groupnumber , real_pk , userdata );
841
841
842
- Group_Peer * temp = (Group_Peer * )realloc ( g -> group , ( g -> numpeers + 1 ) * sizeof (Group_Peer ));
842
+ Group_Peer * temp = (Group_Peer * )mem_vrealloc ( g_c -> mem , g -> group , g -> numpeers + 1 , sizeof (Group_Peer ));
843
843
844
844
if (temp == nullptr ) {
845
845
return -1 ;
@@ -930,14 +930,14 @@ static bool delpeer(Group_Chats *g_c, uint32_t groupnumber, int peer_index, void
930
930
void * peer_object = g -> group [peer_index ].object ;
931
931
932
932
if (g -> numpeers == 0 ) {
933
- free ( g -> group );
933
+ mem_delete ( g_c -> mem , g -> group );
934
934
g -> group = nullptr ;
935
935
} else {
936
936
if (g -> numpeers != (uint32_t )peer_index ) {
937
937
g -> group [peer_index ] = g -> group [g -> numpeers ];
938
938
}
939
939
940
- Group_Peer * temp = (Group_Peer * )realloc ( g -> group , g -> numpeers * sizeof (Group_Peer ));
940
+ Group_Peer * temp = (Group_Peer * )mem_vrealloc ( g_c -> mem , g -> group , g -> numpeers , sizeof (Group_Peer ));
941
941
942
942
if (temp == nullptr ) {
943
943
return false;
@@ -1034,15 +1034,15 @@ static bool delete_old_frozen(Group_c *g, const Memory *mem)
1034
1034
}
1035
1035
1036
1036
if (g -> maxfrozen == 0 ) {
1037
- free ( g -> frozen );
1037
+ mem_delete ( mem , g -> frozen );
1038
1038
g -> frozen = nullptr ;
1039
1039
g -> numfrozen = 0 ;
1040
1040
return true;
1041
1041
}
1042
1042
1043
1043
merge_sort (g -> frozen , g -> numfrozen , mem , & group_peer_cmp_funcs );
1044
1044
1045
- Group_Peer * temp = (Group_Peer * )realloc ( g -> frozen , g -> maxfrozen * sizeof (Group_Peer ));
1045
+ Group_Peer * temp = (Group_Peer * )mem_vrealloc ( mem , g -> frozen , g -> maxfrozen , sizeof (Group_Peer ));
1046
1046
1047
1047
if (temp == nullptr ) {
1048
1048
return false;
@@ -1067,7 +1067,7 @@ static bool freeze_peer(Group_Chats *g_c, uint32_t groupnumber, int peer_index,
1067
1067
return false;
1068
1068
}
1069
1069
1070
- Group_Peer * temp = (Group_Peer * )realloc ( g -> frozen , ( g -> numfrozen + 1 ) * sizeof (Group_Peer ));
1070
+ Group_Peer * temp = (Group_Peer * )mem_vrealloc ( g_c -> m -> mem , g -> frozen , g -> numfrozen + 1 , sizeof (Group_Peer ));
1071
1071
1072
1072
if (temp == nullptr ) {
1073
1073
return false;
@@ -3665,7 +3665,7 @@ static uint32_t load_group(Group_c *g, const Group_Chats *g_c, const uint8_t *da
3665
3665
}
3666
3666
3667
3667
// This is inefficient, but allows us to check data consistency before allocating memory
3668
- Group_Peer * tmp_frozen = (Group_Peer * )realloc ( g -> frozen , ( j + 1 ) * sizeof (Group_Peer ));
3668
+ Group_Peer * tmp_frozen = (Group_Peer * )mem_vrealloc ( g_c -> mem , g -> frozen , j + 1 , sizeof (Group_Peer ));
3669
3669
3670
3670
if (tmp_frozen == nullptr ) {
3671
3671
// Memory allocation failure
@@ -3811,12 +3811,13 @@ Group_Chats *new_groupchats(const Mono_Time *mono_time, Messenger *m)
3811
3811
return nullptr ;
3812
3812
}
3813
3813
3814
- Group_Chats * temp = (Group_Chats * )calloc ( 1 , sizeof (Group_Chats ));
3814
+ Group_Chats * temp = (Group_Chats * )mem_alloc ( m -> mem , sizeof (Group_Chats ));
3815
3815
3816
3816
if (temp == nullptr ) {
3817
3817
return nullptr ;
3818
3818
}
3819
3819
3820
+ temp -> mem = m -> mem ;
3820
3821
temp -> mono_time = mono_time ;
3821
3822
temp -> m = m ;
3822
3823
temp -> fr_c = m -> fr_c ;
@@ -3867,7 +3868,7 @@ void kill_groupchats(Group_Chats *g_c)
3867
3868
m_callback_conference_invite (g_c -> m , nullptr );
3868
3869
set_global_status_callback (g_c -> m -> fr_c , nullptr , nullptr );
3869
3870
g_c -> m -> conferences_object = nullptr ;
3870
- free ( g_c );
3871
+ mem_delete ( g_c -> mem , g_c );
3871
3872
}
3872
3873
3873
3874
/**
0 commit comments