From f908dd984cdf3bb6b1804ec780612bfc58b786e1 Mon Sep 17 00:00:00 2001
From: Mark Michelson <mmichelson@digium.com>
Date: Mon, 24 May 2010 21:44:30 +0000
Subject: [PATCH] Allow type=user SIP endpoints to be loaded properly from
 realtime.

(closes issue #16021)
Reported by: Guggemand
Patches:
      realtime-type-fix.patch uploaded by Guggemand (license 897)
	  (altered by me slightly to avoid ref leaks)
Tested by: Guggemand




git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@265449 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index e3a79fbac0..51896353fa 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -4379,17 +4379,7 @@ static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_i
 	}
 
 	for (tmp = var; tmp; tmp = tmp->next) {
-		/* If this is type=user, then skip this object. */
-		if (!strcasecmp(tmp->name, "type") &&
-		    !strcasecmp(tmp->value, "user")) {
-			if(peerlist)
-				ast_config_destroy(peerlist);
-			else {
-				ast_variables_destroy(var);
-				ast_variables_destroy(varregs);
-			}
-			return NULL;
-		} else if (!newpeername && !strcasecmp(tmp->name, "name")) {
+		if (!newpeername && !strcasecmp(tmp->name, "name")) {
 			newpeername = tmp->value;
 		}
 	}
@@ -4510,6 +4500,24 @@ static struct sip_peer *find_peer(const char *peer, struct sockaddr_in *sin, int
 
 	if (!p && (realtime || devstate_only)) {
 		p = realtime_peer(peer, sin, devstate_only);
+		if (p) {
+			switch (which_objects) {
+			case FINDUSERS:
+				if (!(p->type & SIP_TYPE_USER)) {
+					unref_peer(p, "Wrong type of realtime SIP endpoint");
+					return NULL;
+				}
+				break;
+			case FINDPEERS:
+				if (!(p->type & SIP_TYPE_PEER)) {
+					unref_peer(p, "Wrong type of realtime SIP endpoint");
+					return NULL;
+				}
+				break;
+			case FINDALLDEVICES:
+				break;
+			}
+		}
 	}
 
 	return p;
-- 
GitLab