mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 19:16:46 +00:00
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
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user