Bläddra i källkod

pua_reginfo: fix crash and issue during high load

- do not release a already deleted entry, as this causes a crash

- use sruid_next_safe instead of sruid_next as it has been seen during load that same sruid returned on multiple threads
lasseo 7 år sedan
förälder
incheckning
62e0af0957
1 ändrade filer med 8 tillägg och 2 borttagningar
  1. 8 2
      src/modules/pua_reginfo/notify.c

+ 8 - 2
src/modules/pua_reginfo/notify.c

@@ -111,7 +111,7 @@ int process_contact(udomain_t * domain, urecord_t ** ul_record, str aor, str cal
 	ci.expires = time(0) + expires;
 	ci.expires = time(0) + expires;
 
 
 	/* set ruid */
 	/* set ruid */
-	if(sruid_next(&_reginfo_sruid) < 0) {
+	if(sruid_next_safe(&_reginfo_sruid) < 0) {
 		LM_ERR("failed to generate ruid");
 		LM_ERR("failed to generate ruid");
 	} else {
 	} else {
 		ci.ruid = _reginfo_sruid.uid;
 		ci.ruid = _reginfo_sruid.uid;
@@ -306,9 +306,15 @@ int process_body(str notify_body, udomain_t * domain) {
 					}
 					}
 					ul_contact = ul_contact->next;
 					ul_contact = ul_contact->next;
 				}
 				}
+				
 				if (ul.delete_urecord(domain, &aor_key, ul_record) < 0) {
 				if (ul.delete_urecord(domain, &aor_key, ul_record) < 0) {
 					LM_ERR("failed to remove record from usrloc\n");
 					LM_ERR("failed to remove record from usrloc\n");
-				}
+				} 
+
+				/* Record deleted, and should not be used anymore */
+				ul_record = NULL;
+				
+				
 				/* If already a registration with contacts was found, then keep that result.
 				/* If already a registration with contacts was found, then keep that result.
 				   otherwise the result is now "No contacts found" */
 				   otherwise the result is now "No contacts found" */
 				if (final_result != RESULT_CONTACTS_FOUND) final_result = RESULT_NO_CONTACTS;
 				if (final_result != RESULT_CONTACTS_FOUND) final_result = RESULT_NO_CONTACTS;