diff --git a/main/pbx.c b/main/pbx.c
index 548e20268be7ee4bc1bb5cc645b0143b2257925e..b5f6ddd01771080bc654b93cdae963cfb1172426 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -1091,19 +1091,30 @@ static void new_find_extension(const char *str, struct scoreboard *score, struct
 static struct match_char *already_in_tree(struct match_char *current, char *pat)
 {
 	struct match_char *t;
+
 	if (!current)
 		return 0;
-	for (t=current; t; t=t->alt_char) {
-		if (strcmp(pat,t->x) == 0) /* uh, we may want to sort exploded [] contents to make matching easy */
+
+	for (t = current; t; t = t->alt_char) {
+		if (!strcmp(pat, t->x)) /* uh, we may want to sort exploded [] contents to make matching easy */
 			return t;
 	}
+
 	return 0;
 }
 
 static struct match_char *add_pattern_node(struct ast_context *con, struct match_char *current, char *pattern, int is_pattern, int already, int specificity)
 {
-	struct match_char *m = ast_calloc(1,sizeof(struct match_char));
-	m->x = ast_strdup(pattern);
+	struct match_char *m;
+	
+	if (!(m = ast_calloc(1, sizeof(*m))))
+		return NULL;
+
+	if (!(m->x = ast_strdup(pattern))) {
+		ast_free(m);
+		return NULL;
+	}
+
 	m->is_pattern = is_pattern;
 	if (specificity == 1 && is_pattern && pattern[0] == 'N')
 		m->specificity = 98;
@@ -1133,6 +1144,7 @@ static struct match_char *add_pattern_node(struct ast_context *con, struct match
 			}
 		}
 	}
+
 	return m;
 }