summaryrefslogtreecommitdiff
path: root/main/format_cap.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2015-10-22 17:07:55 -0500
committerMark Michelson <mmichelson@digium.com>2015-10-22 17:29:15 -0500
commit5dd9e1938a1335475f8b1a6be2f13ff76276dd84 (patch)
treebbbf00939300b2e239e9cc06cd6f191bfa3ee833 /main/format_cap.c
parent41f9fd56fb5213f358e2e63b6882dd7ee2278831 (diff)
format_cap: Detect vector allocation failures.
A crash was seen on a system that ran out of memory due to Asterisk not checking for vector allocation failures in format_cap.c. With this change, if either of the AST_VECTOR_INIT calls fail, we will return a value indicating failure. Change-Id: Ieb9c59f39dfde6d11797a92b45e0cf8ac5722bc8
Diffstat (limited to 'main/format_cap.c')
-rw-r--r--main/format_cap.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/main/format_cap.c b/main/format_cap.c
index 224fe331f..d486d5d8c 100644
--- a/main/format_cap.c
+++ b/main/format_cap.c
@@ -93,14 +93,27 @@ static void format_cap_destroy(void *obj)
AST_VECTOR_FREE(&cap->preference_order);
}
-static inline void format_cap_init(struct ast_format_cap *cap, enum ast_format_cap_flags flags)
+/*
+ * \brief Initialize values on an ast_format_cap
+ *
+ * \param cap ast_format_cap to initialize
+ * \param flags Unused.
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+static inline int format_cap_init(struct ast_format_cap *cap, enum ast_format_cap_flags flags)
{
- AST_VECTOR_INIT(&cap->formats, 0);
+ if (AST_VECTOR_INIT(&cap->formats, 0)) {
+ return -1;
+ }
/* TODO: Look at common usage of this and determine a good starting point */
- AST_VECTOR_INIT(&cap->preference_order, 5);
+ if (AST_VECTOR_INIT(&cap->preference_order, 5)) {
+ return -1;
+ }
cap->framing = UINT_MAX;
+ return 0;
}
struct ast_format_cap *__ast_format_cap_alloc(enum ast_format_cap_flags flags,
@@ -114,7 +127,10 @@ struct ast_format_cap *__ast_format_cap_alloc(enum ast_format_cap_flags flags,
return NULL;
}
- format_cap_init(cap, flags);
+ if (format_cap_init(cap, flags)) {
+ ao2_ref(cap, -1);
+ return NULL;
+ }
return cap;
}