Forráskód Böngészése

presence: safety checks in timer callbacks to cope with storage modes

Daniel-Constantin Mierla 5 éve
szülő
commit
a59dbb7a81

+ 4 - 0
src/modules/presence/hash.c

@@ -1269,6 +1269,10 @@ ps_presentity_t *ps_ptable_get_expired(int eval)
 	ps_presentity_t *pte = NULL;
 	int i = 0;
 
+	if(_ps_ptable == NULL) {
+		return NULL;
+	}
+
 	for(i=0; i<_ps_ptable->ssize; i++) {
 		lock_get(&_ps_ptable->slots[i].lock);
 		ptn = _ps_ptable->slots[i].plist;

+ 7 - 6
src/modules/presence/presence.c

@@ -448,14 +448,14 @@ static int mod_init(void)
 	pres_startup_time = (int)time(NULL);
 	if(pres_clean_period > 0) {
 		if(pres_timer_mode==0) {
-			register_timer(msg_presentity_clean, 0, pres_clean_period);
-			register_timer(msg_watchers_clean, 0, pres_clean_period);
+			register_timer(ps_presentity_db_timer_clean, 0, pres_clean_period);
+			register_timer(ps_watchers_db_timer_clean, 0, pres_clean_period);
 			if(publ_cache_mode==PS_PCACHE_RECORD) {
 				register_timer(ps_ptable_timer_clean, 0, pres_clean_period);
 			}
 		} else {
-			sr_wtimer_add(msg_presentity_clean, 0, pres_clean_period);
-			sr_wtimer_add(msg_watchers_clean, 0, pres_clean_period);
+			sr_wtimer_add(ps_presentity_db_timer_clean, 0, pres_clean_period);
+			sr_wtimer_add(ps_watchers_db_timer_clean, 0, pres_clean_period);
 			if(publ_cache_mode==PS_PCACHE_RECORD) {
 				sr_wtimer_add(ps_ptable_timer_clean, 0, pres_clean_period);
 			}
@@ -1841,8 +1841,9 @@ void rpc_presence_cleanup(rpc_t *rpc, void *c)
 {
 	LM_DBG("rpc_presence_cleanup:start\n");
 
-	(void)msg_watchers_clean(0, 0);
-	(void)msg_presentity_clean(0, 0);
+	(void)ps_watchers_db_timer_clean(0, 0);
+	(void)ps_presentity_db_timer_clean(0, 0);
+	(void)ps_ptable_timer_clean(0, 0);
 	(void)timer_db_update(0, 0);
 
 	rpc->rpl_printf(c, "Reload OK");

+ 5 - 1
src/modules/presence/publish.c

@@ -59,7 +59,7 @@ struct p_modif
 	str uri;
 };
 
-void msg_presentity_clean(unsigned int ticks, void *param)
+void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 {
 	db_key_t db_keys[2], result_cols[4];
 	db_val_t db_vals[2], *values;
@@ -73,6 +73,10 @@ void msg_presentity_clean(unsigned int ticks, void *param)
 	str uri = {0, 0}, event, *rules_doc = NULL;
 	static str query_str;
 
+	if(pa_db == NULL) {
+		return;
+	}
+
 	LM_DBG("cleaning expired presentity information\n");
 	if(pa_dbf.use_table(pa_db, &presentity_table) < 0) {
 		LM_ERR("in use_table\n");

+ 1 - 1
src/modules/presence/publish.h

@@ -42,7 +42,7 @@
 #include "presentity.h"
 #include "../alias_db/alias_db.h"
 
-void msg_presentity_clean(unsigned int ticks, void *param);
+void ps_presentity_db_timer_clean(unsigned int ticks, void *param);
 void ps_ptable_timer_clean(unsigned int ticks, void *param);
 
 int w_handle_publish(struct sip_msg *msg, char *str1, char *str2);

+ 5 - 1
src/modules/presence/subscribe.c

@@ -702,12 +702,16 @@ error:
 	return -1;
 }
 
-void msg_watchers_clean(unsigned int ticks, void *param)
+void ps_watchers_db_timer_clean(unsigned int ticks, void *param)
 {
 	db_key_t db_keys[2];
 	db_val_t db_vals[2];
 	db_op_t db_ops[2];
 
+	if(pa_db == NULL) {
+		return;
+	}
+
 	LM_DBG("cleaning pending subscriptions\n");
 
 	db_keys[0] = &str_inserted_time_col;

+ 1 - 3
src/modules/presence/subscribe.h

@@ -88,9 +88,7 @@ struct subscription
 };
 typedef struct subscription subs_t;
 
-void msg_active_watchers_clean(unsigned int ticks, void *param);
-
-void msg_watchers_clean(unsigned int ticks, void *param);
+void ps_watchers_db_timer_clean(unsigned int ticks, void *param);
 
 int handle_subscribe0(struct sip_msg *);
 int w_handle_subscribe0(struct sip_msg *, char *, char *);