Rcl issues 469 test arguments (#564)
* `rcl_arguments_fini` free external_log_config_file (#469) * Fix memory leak in `parse_key` in parser.c Signed-off-by: y-okumura-isp <y-okumura@isp.co.jp>
This commit is contained in:
parent
4835a947a5
commit
85948c7c3c
2 changed files with 52 additions and 35 deletions
|
@ -299,6 +299,16 @@ _atob(
|
||||||
const char * str,
|
const char * str,
|
||||||
bool * val);
|
bool * val);
|
||||||
|
|
||||||
|
/// Allocate and zero initialize arguments impl and.
|
||||||
|
/**
|
||||||
|
* \param[out] args target arguments to set impl
|
||||||
|
* \param[in] allocator an allocator to use
|
||||||
|
* \return RCL_RET_OK if a valid rule was parsed, or
|
||||||
|
* \return RCL_RET_BAD_ALLOC if an allocation failed
|
||||||
|
*/
|
||||||
|
rcl_ret_t
|
||||||
|
_rcl_allocate_initialized_arguments_impl(rcl_arguments_t * args, rcl_allocator_t * allocator);
|
||||||
|
|
||||||
rcl_ret_t
|
rcl_ret_t
|
||||||
rcl_parse_arguments(
|
rcl_parse_arguments(
|
||||||
int argc,
|
int argc,
|
||||||
|
@ -323,26 +333,11 @@ rcl_parse_arguments(
|
||||||
rcl_ret_t ret;
|
rcl_ret_t ret;
|
||||||
rcl_ret_t fail_ret;
|
rcl_ret_t fail_ret;
|
||||||
|
|
||||||
args_output->impl = allocator.allocate(sizeof(rcl_arguments_impl_t), allocator.state);
|
ret = _rcl_allocate_initialized_arguments_impl(args_output, &allocator);
|
||||||
if (NULL == args_output->impl) {
|
if (RCL_RET_OK != ret) {
|
||||||
return RCL_RET_BAD_ALLOC;
|
return ret;
|
||||||
}
|
}
|
||||||
rcl_arguments_impl_t * args_impl = args_output->impl;
|
rcl_arguments_impl_t * args_impl = args_output->impl;
|
||||||
args_impl->num_remap_rules = 0;
|
|
||||||
args_impl->remap_rules = NULL;
|
|
||||||
args_impl->log_level = -1;
|
|
||||||
args_impl->external_log_config_file = NULL;
|
|
||||||
args_impl->unparsed_args = NULL;
|
|
||||||
args_impl->num_unparsed_args = 0;
|
|
||||||
args_impl->unparsed_ros_args = NULL;
|
|
||||||
args_impl->num_unparsed_ros_args = 0;
|
|
||||||
args_impl->parameter_overrides = NULL;
|
|
||||||
args_impl->parameter_files = NULL;
|
|
||||||
args_impl->num_param_files_args = 0;
|
|
||||||
args_impl->log_stdout_disabled = false;
|
|
||||||
args_impl->log_rosout_disabled = false;
|
|
||||||
args_impl->log_ext_lib_disabled = false;
|
|
||||||
args_impl->allocator = allocator;
|
|
||||||
|
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
// there are no arguments to parse
|
// there are no arguments to parse
|
||||||
|
@ -967,24 +962,11 @@ rcl_arguments_copy(
|
||||||
|
|
||||||
rcl_allocator_t allocator = args->impl->allocator;
|
rcl_allocator_t allocator = args->impl->allocator;
|
||||||
|
|
||||||
args_out->impl = allocator.allocate(sizeof(rcl_arguments_impl_t), allocator.state);
|
rcl_ret_t ret = _rcl_allocate_initialized_arguments_impl(args_out, &allocator);
|
||||||
if (NULL == args_out->impl) {
|
if (RCL_RET_OK != ret) {
|
||||||
return RCL_RET_BAD_ALLOC;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
args_out->impl->allocator = allocator;
|
|
||||||
|
|
||||||
// Zero so it's safe to call rcl_arguments_fini() if an error occurrs while copying.
|
|
||||||
args_out->impl->num_remap_rules = 0;
|
|
||||||
args_out->impl->remap_rules = NULL;
|
|
||||||
args_out->impl->unparsed_args = NULL;
|
|
||||||
args_out->impl->num_unparsed_args = 0;
|
|
||||||
args_out->impl->unparsed_ros_args = NULL;
|
|
||||||
args_out->impl->num_unparsed_ros_args = 0;
|
|
||||||
args_out->impl->parameter_overrides = NULL;
|
|
||||||
args_out->impl->parameter_files = NULL;
|
|
||||||
args_out->impl->num_param_files_args = 0;
|
|
||||||
|
|
||||||
if (args->impl->num_unparsed_args) {
|
if (args->impl->num_unparsed_args) {
|
||||||
// Copy unparsed args
|
// Copy unparsed args
|
||||||
args_out->impl->unparsed_args = allocator.allocate(
|
args_out->impl->unparsed_args = allocator.allocate(
|
||||||
|
@ -1030,7 +1012,7 @@ rcl_arguments_copy(
|
||||||
args_out->impl->num_remap_rules = args->impl->num_remap_rules;
|
args_out->impl->num_remap_rules = args->impl->num_remap_rules;
|
||||||
for (int i = 0; i < args->impl->num_remap_rules; ++i) {
|
for (int i = 0; i < args->impl->num_remap_rules; ++i) {
|
||||||
args_out->impl->remap_rules[i] = rcl_get_zero_initialized_remap();
|
args_out->impl->remap_rules[i] = rcl_get_zero_initialized_remap();
|
||||||
rcl_ret_t ret = rcl_remap_copy(
|
ret = rcl_remap_copy(
|
||||||
&(args->impl->remap_rules[i]), &(args_out->impl->remap_rules[i]));
|
&(args->impl->remap_rules[i]), &(args_out->impl->remap_rules[i]));
|
||||||
if (RCL_RET_OK != ret) {
|
if (RCL_RET_OK != ret) {
|
||||||
if (RCL_RET_OK != rcl_arguments_fini(args_out)) {
|
if (RCL_RET_OK != rcl_arguments_fini(args_out)) {
|
||||||
|
@ -1117,6 +1099,12 @@ rcl_arguments_fini(
|
||||||
args->impl->parameter_files = NULL;
|
args->impl->parameter_files = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NULL != args->impl->external_log_config_file) {
|
||||||
|
args->impl->allocator.deallocate(
|
||||||
|
args->impl->external_log_config_file, args->impl->allocator.state);
|
||||||
|
args->impl->external_log_config_file = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
args->impl->allocator.deallocate(args->impl, args->impl->allocator.state);
|
args->impl->allocator.deallocate(args->impl, args->impl->allocator.state);
|
||||||
args->impl = NULL;
|
args->impl = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -2094,6 +2082,34 @@ _atob(
|
||||||
return RCL_RET_ERROR;
|
return RCL_RET_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rcl_ret_t
|
||||||
|
_rcl_allocate_initialized_arguments_impl(rcl_arguments_t * args, rcl_allocator_t * allocator)
|
||||||
|
{
|
||||||
|
args->impl = allocator->allocate(sizeof(rcl_arguments_impl_t), allocator->state);
|
||||||
|
if (NULL == args->impl) {
|
||||||
|
return RCL_RET_BAD_ALLOC;
|
||||||
|
}
|
||||||
|
|
||||||
|
rcl_arguments_impl_t * args_impl = args->impl;
|
||||||
|
args_impl->num_remap_rules = 0;
|
||||||
|
args_impl->remap_rules = NULL;
|
||||||
|
args_impl->log_level = -1;
|
||||||
|
args_impl->external_log_config_file = NULL;
|
||||||
|
args_impl->unparsed_args = NULL;
|
||||||
|
args_impl->num_unparsed_args = 0;
|
||||||
|
args_impl->unparsed_ros_args = NULL;
|
||||||
|
args_impl->num_unparsed_ros_args = 0;
|
||||||
|
args_impl->parameter_overrides = NULL;
|
||||||
|
args_impl->parameter_files = NULL;
|
||||||
|
args_impl->num_param_files_args = 0;
|
||||||
|
args_impl->log_stdout_disabled = false;
|
||||||
|
args_impl->log_rosout_disabled = false;
|
||||||
|
args_impl->log_ext_lib_disabled = false;
|
||||||
|
args_impl->allocator = *allocator;
|
||||||
|
|
||||||
|
return RCL_RET_OK;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1343,6 +1343,7 @@ static rcutils_ret_t parse_key(
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = find_node(node_name_ns, params_st, node_idx);
|
ret = find_node(node_name_ns, params_st, node_idx);
|
||||||
|
allocator.deallocate(node_name_ns, allocator.state);
|
||||||
if (RCUTILS_RET_OK != ret) {
|
if (RCUTILS_RET_OK != ret) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue