GRIB-364: Memory fault when packing GRIB2 files with 'log preprocessing'

This commit is contained in:
Shahram Najm 2020-02-20 13:58:23 +00:00
commit 6dc79a4a78
3 changed files with 27 additions and 7 deletions

View File

@ -216,7 +216,17 @@ static int pack_double(grib_accessor* a, const double* cval, size_t* len)
for (i = 0; i < n_vals; i++)
val[i] += units_bias;
ret = super->pack_double(a, val, len);
if (super != grib_accessor_class_data_g2simple_packing) {
/* Normal case: parent not same as me! */
ret = super->pack_double(a, val, len);
}
else {
/* GRIB-364: simple packing with logarithm pre-processing */
grib_accessor_class* super2 = NULL;
Assert(super->super);
super2 = *(super->super);
ret = super2->pack_double(a, val, len);
}
switch (ret) {
case GRIB_CONSTANT_FIELD:
grib_buffer_replace(a, NULL, 0, 1, 1);

View File

@ -183,6 +183,7 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len)
{
grib_accessor_data_g2simple_packing_with_preprocessing* self = (grib_accessor_data_g2simple_packing_with_preprocessing*)a;
grib_accessor_class* super = *(a->cclass->super);
grib_accessor_class* super2 = NULL;
size_t n_vals = 0;
long nn = 0;
@ -213,7 +214,9 @@ static int unpack_double(grib_accessor* a, double* val, size_t* len)
return err;
}
err = super->unpack_double(a, val, &n_vals);
Assert(super->super);
super2 = *(super->super);
err = super2->unpack_double(a, val, &n_vals); /* GRIB-364 */
if (err != GRIB_SUCCESS)
return err;
@ -266,6 +269,7 @@ static int pre_processing_func(double* values, long length, long pre_processing,
int ret = 0;
double min = values[0];
double next_min = values[0];
Assert(length > 0);
switch (pre_processing) {
/* NONE */
@ -286,15 +290,21 @@ static int pre_processing_func(double* values, long length, long pre_processing,
}
if (min > 0) {
*pre_processing_parameter = 0;
for (i = 0; i < length; i++)
for (i = 0; i < length; i++) {
DebugAssert(values[i] > 0);
values[i] = log(values[i]);
}
}
else {
double ppp = 0;
*pre_processing_parameter = next_min - 2 * min;
if (next_min == min)
return ret;
for (i = 0; i < length; i++)
values[i] = log(values[i] + *pre_processing_parameter);
ppp = *pre_processing_parameter;
for (i = 0; i < length; i++) {
DebugAssert((values[i] + ppp) > 0);
values[i] = log(values[i] + ppp);
}
}
}
else {

View File

@ -18,8 +18,8 @@ packing1="
packing2="
grid_ieee
grid_simple
grid_simple_matrix"
#TODO: grid_simple_log_preprocessing
grid_simple_matrix
grid_simple_log_preprocessing"
if [ $HAVE_JPEG -eq 1 ]; then
packing2="grid_jpeg "$packing2