@@ -2000,6 +2000,7 @@ static inline int report_silent_logoffs(collector_sync_t *sync,
20002000 if (remove_session_ip (prev -> session [i ], & (prev -> ip )) == 1 ) {
20012001 HASH_DELETE (hh , prev -> owner [i ]-> sessions , prev -> session [i ]);
20022002 free_single_session (prev -> session [i ]);
2003+ prev -> session [i ] = NULL ;
20032004 }
20042005 }
20052006 HASH_DELETE (hh , sync -> activeips , prev );
@@ -2012,7 +2013,7 @@ static inline int report_silent_logoffs(collector_sync_t *sync,
20122013static int add_ip_to_session_mapping (collector_sync_t * sync ,
20132014 access_session_t * sess , internet_user_t * iuser ) {
20142015
2015- int i , replaced = 0 ;
2016+ int i , j , replaced = 0 ;
20162017 ip_to_session_t * prev ;
20172018
20182019 prev = NULL ;
@@ -2028,6 +2029,21 @@ static int add_ip_to_session_mapping(collector_sync_t *sync,
20282029 sizeof (internetaccess_ip_t ), prev );
20292030
20302031 if (prev && prev -> cin == sess -> cin ) {
2032+ int already = 0 ;
2033+ for (j = 0 ; j < prev -> sessioncount ; j ++ ) {
2034+ if (prev -> session [j ] == sess ) {
2035+ already = 1 ;
2036+ break ;
2037+ }
2038+ }
2039+
2040+ /* This IP->session mapping is already known (somehow?),
2041+ * don't insert it twice because that can cause issues
2042+ * if we have to do a silent-logoff later on */
2043+ if (already ) {
2044+ continue ;
2045+ }
2046+
20312047 prev -> session = realloc (prev -> session ,
20322048 (prev -> sessioncount + 1 ) * sizeof (access_session_t * ));
20332049 prev -> owner = realloc (prev -> owner ,
0 commit comments