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
changes/14/1514/1
Mark Michelson 10 years ago
parent b5cfcfc427
commit b95101aab0

@ -93,14 +93,27 @@ static void format_cap_destroy(void *obj)
AST_VECTOR_FREE(&cap->preference_order); 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 */ /* 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; cap->framing = UINT_MAX;
return 0;
} }
struct ast_format_cap *__ast_format_cap_alloc(enum ast_format_cap_flags flags) 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; return NULL;
} }
format_cap_init(cap, flags); if (format_cap_init(cap, flags)) {
ao2_ref(cap, -1);
return NULL;
}
return cap; return cap;
} }
@ -126,7 +142,10 @@ struct ast_format_cap *__ast_format_cap_alloc_debug(enum ast_format_cap_flags fl
return NULL; return NULL;
} }
format_cap_init(cap, flags); if (format_cap_init(cap, flags)) {
ao2_ref(cap, -1);
return NULL;
}
return cap; return cap;
} }

Loading…
Cancel
Save