From a1054554875284edc268c8a3c730acbe536ad541 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Thu, 20 May 2004 07:52:07 +0000
Subject: [PATCH] Stage 1 of deadlock fix (bug #1673 -- but not yet solved,
 just started) and fix configs ending with no newline (bug #1672)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3025 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 13 ++++++++++++-
 config.c            |  3 +--
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 0e28fd1634..0aa8f57ec3 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -4538,8 +4538,17 @@ static int get_refer_info(struct sip_pvt *p, struct sip_request *oreq)
 		p2 = iflist;
 		while(p2) {
 			if (!strcmp(p2->callid, tmp5)) {
-				/* Go ahead and lock it before returning */
+				/* Go ahead and lock it (and its owner) before returning */
 				ast_mutex_lock(&p2->lock);
+				if (p2->owner) {
+					while(ast_mutex_trylock(&p2->owner->lock)) {
+						ast_mutex_unlock(&p2->lock);
+						usleep(1);
+						ast_mutex_lock(&p2->lock);
+						if (!p2->owner)
+							break;
+					}
+				}
 				p->refer_call = p2;
 				break;
 			}
@@ -6471,6 +6480,8 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
 				if (p->refer_call) {
 					ast_log(LOG_DEBUG,"202 Accepted (supervised)\n");
 					attempt_transfer(p, p->refer_call);
+					if (p->refer_call->owner)
+						ast_mutex_unlock(&p->refer_call->owner->lock);
 					ast_mutex_unlock(&p->refer_call->lock);
 					p->refer_call = NULL;
 					p->gotrefer = 1;
diff --git a/config.c b/config.c
index 574561ab3c..954d095092 100755
--- a/config.c
+++ b/config.c
@@ -740,9 +740,8 @@ static struct ast_config *__ast_load(char *configfile, struct ast_config *tmp, s
 			return NULL;
 		}
 		while(!feof(f)) {
-			fgets(buf, sizeof(buf), f);
 			lineno++;
-			if (!feof(f)) {
+			if (fgets(buf, sizeof(buf), f)) {
 				if (cfg_process(tmp, _tmpc, _last, buf, lineno, configfile, includelevel
 #ifdef PRESERVE_COMMENTS
 				, acs
-- 
GitLab