mirror of https://github.com/ecmwf/eccodes.git
ECC-982 and ECC-765: BUFR leak in clone
This commit is contained in:
parent
68fde5f25e
commit
cca6b16d98
|
@ -35,6 +35,7 @@
|
||||||
MEMBERS = grib_vdarray* numericValues
|
MEMBERS = grib_vdarray* numericValues
|
||||||
MEMBERS = grib_vsarray* stringValues
|
MEMBERS = grib_vsarray* stringValues
|
||||||
MEMBERS = grib_viarray* elementsDescriptorsIndex
|
MEMBERS = grib_viarray* elementsDescriptorsIndex
|
||||||
|
MEMBERS = char* cname
|
||||||
|
|
||||||
END_CLASS_DEF
|
END_CLASS_DEF
|
||||||
|
|
||||||
|
@ -80,6 +81,7 @@ typedef struct grib_accessor_bufr_data_element {
|
||||||
grib_vdarray* numericValues;
|
grib_vdarray* numericValues;
|
||||||
grib_vsarray* stringValues;
|
grib_vsarray* stringValues;
|
||||||
grib_viarray* elementsDescriptorsIndex;
|
grib_viarray* elementsDescriptorsIndex;
|
||||||
|
char* cname;
|
||||||
} grib_accessor_bufr_data_element;
|
} grib_accessor_bufr_data_element;
|
||||||
|
|
||||||
extern grib_accessor_class* grib_accessor_class_gen;
|
extern grib_accessor_class* grib_accessor_class_gen;
|
||||||
|
@ -162,6 +164,7 @@ static grib_accessor* make_clone(grib_accessor* a,grib_section* s,int* err)
|
||||||
grib_accessor* attribute=NULL;
|
grib_accessor* attribute=NULL;
|
||||||
grib_accessor_bufr_data_element* elementAccessor;
|
grib_accessor_bufr_data_element* elementAccessor;
|
||||||
grib_accessor_bufr_data_element* self;
|
grib_accessor_bufr_data_element* self;
|
||||||
|
char* copied_name = NULL;
|
||||||
int i;
|
int i;
|
||||||
grib_action creator = {0, };
|
grib_action creator = {0, };
|
||||||
creator.op = "bufr_data_element";
|
creator.op = "bufr_data_element";
|
||||||
|
@ -174,7 +177,8 @@ static grib_accessor* make_clone(grib_accessor* a,grib_section* s,int* err)
|
||||||
*err=0;
|
*err=0;
|
||||||
|
|
||||||
the_clone = grib_accessor_factory(s, &creator, 0, NULL);
|
the_clone = grib_accessor_factory(s, &creator, 0, NULL);
|
||||||
the_clone->name=grib_context_strdup(a->context,a->name);
|
copied_name = grib_context_strdup(a->context,a->name);
|
||||||
|
the_clone->name=copied_name;
|
||||||
elementAccessor=(grib_accessor_bufr_data_element*)the_clone;
|
elementAccessor=(grib_accessor_bufr_data_element*)the_clone;
|
||||||
self=(grib_accessor_bufr_data_element*)a;
|
self=(grib_accessor_bufr_data_element*)a;
|
||||||
the_clone->flags=a->flags;
|
the_clone->flags=a->flags;
|
||||||
|
@ -189,6 +193,7 @@ static grib_accessor* make_clone(grib_accessor* a,grib_section* s,int* err)
|
||||||
elementAccessor->numericValues=self->numericValues;
|
elementAccessor->numericValues=self->numericValues;
|
||||||
elementAccessor->stringValues=self->stringValues;
|
elementAccessor->stringValues=self->stringValues;
|
||||||
elementAccessor->elementsDescriptorsIndex=self->elementsDescriptorsIndex;
|
elementAccessor->elementsDescriptorsIndex=self->elementsDescriptorsIndex;
|
||||||
|
elementAccessor->cname = copied_name; /* ECC-765 */
|
||||||
|
|
||||||
i=0;
|
i=0;
|
||||||
while (a->attributes[i]) {
|
while (a->attributes[i]) {
|
||||||
|
@ -257,10 +262,11 @@ void accessor_bufr_data_element_set_elementsDescriptorsIndex(grib_accessor* a,gr
|
||||||
|
|
||||||
static void init(grib_accessor* a, const long len, grib_arguments* params)
|
static void init(grib_accessor* a, const long len, grib_arguments* params)
|
||||||
{
|
{
|
||||||
|
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||||
a->length = 0;
|
a->length = 0;
|
||||||
a->flags |= GRIB_ACCESSOR_FLAG_BUFR_DATA;
|
a->flags |= GRIB_ACCESSOR_FLAG_BUFR_DATA;
|
||||||
/* a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; */
|
/* a->flags |= GRIB_ACCESSOR_FLAG_READ_ONLY; */
|
||||||
|
self->cname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump(grib_accessor* a, grib_dumper* dumper)
|
static void dump(grib_accessor* a, grib_dumper* dumper)
|
||||||
|
@ -603,7 +609,9 @@ static int get_native_type(grib_accessor* a)
|
||||||
|
|
||||||
static void destroy(grib_context* ct, grib_accessor* a)
|
static void destroy(grib_context* ct, grib_accessor* a)
|
||||||
{
|
{
|
||||||
|
grib_accessor_bufr_data_element* self = (grib_accessor_bufr_data_element*)a;
|
||||||
int i=0;
|
int i=0;
|
||||||
|
if (self->cname) grib_context_free(ct,self->cname); /* ECC-765 */
|
||||||
while (i<MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) {
|
while (i<MAX_ACCESSOR_ATTRIBUTES && a->attributes[i]) {
|
||||||
/*grib_context_log(ct,GRIB_LOG_DEBUG,"deleting attribute %s->%s",a->name,a->attributes[i]->name);*/
|
/*grib_context_log(ct,GRIB_LOG_DEBUG,"deleting attribute %s->%s",a->name,a->attributes[i]->name);*/
|
||||||
/*printf("bufr_data_element destroy %s %p\n", a->attributes[i]->name, (void*)a->attributes[i]);*/
|
/*printf("bufr_data_element destroy %s %p\n", a->attributes[i]->name, (void*)a->attributes[i]);*/
|
||||||
|
|
Loading…
Reference in New Issue