]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
format_cap: Detect vector allocation failures. 14/1514/1
authorMark Michelson <mmichelson@digium.com>
Thu, 22 Oct 2015 22:07:55 +0000 (17:07 -0500)
committerMark Michelson <mmichelson@digium.com>
Thu, 22 Oct 2015 22:29:10 +0000 (17:29 -0500)
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

main/format_cap.c

index 364c924bfd116f7bcf2edb88b13854e3befc8c9d..05f157c5d12d80244662f8fc69104a574a1f7025 100644 (file)
@@ -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)
@@ -112,7 +125,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;
 }
@@ -126,7 +142,10 @@ struct ast_format_cap *__ast_format_cap_alloc_debug(enum ast_format_cap_flags fl
                return NULL;
        }
 
-       format_cap_init(cap, flags);
+       if (format_cap_init(cap, flags)) {
+               ao2_ref(cap, -1);
+               return NULL;
+       }
 
        return cap;
 }