From 6b6ecee06d0a1256334dc298e23634ea23a62877 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Sat, 6 Aug 2005 16:52:56 +0000
Subject: [PATCH] Properly handle | within ()'s when doing app arg parsing...
 (bug #4911)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6294 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 app.c | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/app.c b/app.c
index 866d5530ea..e571694bdc 100755
--- a/app.c
+++ b/app.c
@@ -1066,9 +1066,9 @@ int ast_app_group_match_get_count(char *groupmatch, char *category)
 
 int ast_separate_app_args(char *buf, char delim, char **array, int arraylen)
 {
-	int x;
+	int argc;
 	char *scan;
-	char delims[2];
+	int paren = 0;
 
 	if (!buf || !array || !arraylen)
 		return 0;
@@ -1076,21 +1076,26 @@ int ast_separate_app_args(char *buf, char delim, char **array, int arraylen)
 	memset(array, 0, arraylen * sizeof(*array));
 
 	scan = buf;
-	delims[0] = delim;
-	delims[1] = '\0';
-	x = 0;
-
-	while (x < arraylen - 1) {
-		array[x] = strsep(&scan, delims);
-		x++;
-		if (!scan)
-			break;
+
+	for (argc = 0; *scan && (argc < arraylen - 1); argc++) {
+		array[argc] = scan;
+		for (; *scan; scan++) {
+			if (*scan == '(')
+				paren++;
+			else if (*scan == ')') {
+				if (paren)
+					paren--;
+			} else if ((*scan == delim) && !paren) {
+				*scan++ = '\0';
+				break;
+			}
+		}
 	}
 
-	if (scan)
-		array[x++] = scan;
+	if (*scan)
+		array[argc++] = scan;
 
-	return x;
+	return argc;
 }
 
 enum AST_LOCK_RESULT ast_lock_path(const char *path)
-- 
GitLab