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:
y-okumura-isp 2020-03-12 23:12:30 +09:00 committed by GitHub
parent 4835a947a5
commit 85948c7c3c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 35 deletions

View file

@ -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

View file

@ -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;
} }