* \param callerid pattern to match CallerID, or NULL to match any CallerID
* \param application application to run on the extension with that priority level
* \param data data to pass to the application
- * \param datad
+ * \param datad a pointer to a function that will deallocate \c data when needed
+ * or NULL if \c data does not need to be freed.
* \param registrar who registered the extension
*
+ * \note On any failure, the function pointed to by \c datap will be called and passed the
+ * \c data pointer.
+ *
* \retval 0 success
* \retval -1 failure
*/
* \since 12.0.0
*
* \note con must be write locked prior to calling. For details about the arguments,
- * check ast_add_extension2()
+ * check ast_add_extension()
*/
int ast_add_extension2_nolock(struct ast_context *con, int replace, const char *extension,
int priority, const char *label, const char *callerid,
if (ast_strlen_zero(extension)) {
ast_log(LOG_ERROR,"You have to be kidding-- add exten '' to context %s? Figure out a name and call me back. Action ignored.\n",
con->name);
+ /* We always need to deallocate 'data' on failure */
+ if (datad) {
+ datad(data);
+ }
return -1;
}
}
/* Be optimistic: Build the extension structure first */
- if (!(tmp = ast_calloc(1, length)))
+ tmp = ast_calloc(1, length);
+ if (!tmp) {
+ /* We always need to deallocate 'data' on failure */
+ if (datad) {
+ datad(data);
+ }
return -1;
+ }
if (ast_strlen_zero(label)) /* let's turn empty labels to a null ptr */
label = 0;
dial_string_flat, PARK_DIAL_CONTEXT, ast_get_extension_registrar(existing_exten));
} else if (ast_add_extension2_nolock(park_dial_context, 1, dial_string_flat, 1, NULL, NULL,
"Dial", duplicate_returnexten, ast_free_ptr, BASE_REGISTRAR, NULL, 0)) {
- ast_free(duplicate_returnexten);
ast_log(LOG_ERROR, "Failed to create parking redial parker extension %s@%s - Dial(%s)\n",
dial_string_flat, PARK_DIAL_CONTEXT, returnexten);
}
if (ast_add_extension2_nolock(context, replace, extension, priority, NULL, NULL,
application, data_duplicate, ast_free_ptr, registrar, NULL, 0)) {
- ast_free(data_duplicate);
return -1;
}
if (ast_add_extension2_nolock(context, 0, exten, priority, NULL, NULL,
app, data, free_ptr, BASE_REGISTRAR, NULL, 0)) {
- ast_free(data);
return -1;
}