diff --git a/ChangeLog b/ChangeLog
index a54acf2447e2feb3ff9096baeafa48048089ad1f..f43d9766c7636353795c14097b4bd324687278ac 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2005-11-10  Kevin P. Fleming  <kpfleming@digium.com>
 
+	* channels/chan_iax2.c (complete_iax2_show_peer): don't return from function without releasing lock (issue #5685)
+
 	* channels/iax2-provision.c (iax_provision_reload): don't leak memory (issue #5700)
 
 	* pbx/pbx_ael.c (handle_macro): don't leak memory (issue #5701)
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 806b1d2ca3535b5729573a4367e76641adc9d312..d601fc05d28bd2b0a77932c6f42c836431c5cfe8 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1970,6 +1970,7 @@ static char *complete_iax2_show_peer(char *line, char *word, int pos, int state)
 {
 	int which = 0;
 	struct iax2_peer *p;
+	char *res = NULL;
 
 	/* 0 - iax2; 1 - show; 2 - peer; 3 - <peername> */
 	if(pos == 3) {
@@ -1977,14 +1978,15 @@ static char *complete_iax2_show_peer(char *line, char *word, int pos, int state)
 		for(p = peerl.peers ; p ; p = p->next) {
 			if(!strncasecmp(p->name, word, strlen(word))) {
 				if(++which > state) {
-					return strdup(p->name);
+					res = strdup(p->name);
+					break;
 				}
 			}
 		}
 		ast_mutex_unlock(&peerl.lock);
 	}
 
-	return NULL;
+	return res;
 }
 
 static int iax2_show_stats(int fd, int argc, char *argv[])