mirror of https://github.com/ecmwf/eccodes.git
ECC-1395: BUFR: Encoding should fail if attempting to encode message with an undefined element descriptor
This commit is contained in:
parent
2c11c7ad9c
commit
b8ae44fccf
|
@ -766,7 +766,11 @@ static int descriptor_get_min_max(bufr_descriptor* bd, long width, long referenc
|
||||||
double* minAllowed, double* maxAllowed)
|
double* minAllowed, double* maxAllowed)
|
||||||
{
|
{
|
||||||
/* Maximum value is allowed to be the largest number (all bits 1) which means it's MISSING */
|
/* Maximum value is allowed to be the largest number (all bits 1) which means it's MISSING */
|
||||||
size_t max1 = (1ULL << width) - 1; /* Highest value for number with 'width' bits */
|
const size_t max1 = (1ULL << width) - 1; /* Highest value for number with 'width' bits */
|
||||||
|
|
||||||
|
if (width <= 0)
|
||||||
|
return GRIB_MISSING_BUFR_ENTRY; /* ECC-1395 */
|
||||||
|
|
||||||
DebugAssert(width > 0 && width < 64);
|
DebugAssert(width > 0 && width < 64);
|
||||||
|
|
||||||
*maxAllowed = (max1 + reference) * factor;
|
*maxAllowed = (max1 + reference) * factor;
|
||||||
|
@ -804,7 +808,8 @@ static int encode_double_array(grib_context* c, grib_buffer* buff, long* pos, bu
|
||||||
inverseFactor = grib_power(bd->scale, 10);
|
inverseFactor = grib_power(bd->scale, 10);
|
||||||
modifiedWidth = bd->width;
|
modifiedWidth = bd->width;
|
||||||
|
|
||||||
descriptor_get_min_max(bd, modifiedWidth, modifiedReference, modifiedFactor, &minAllowed, &maxAllowed);
|
err = descriptor_get_min_max(bd, modifiedWidth, modifiedReference, modifiedFactor, &minAllowed, &maxAllowed);
|
||||||
|
if (err) return err;
|
||||||
|
|
||||||
nvals = grib_iarray_used_size(self->iss_list);
|
nvals = grib_iarray_used_size(self->iss_list);
|
||||||
if (nvals <= 0)
|
if (nvals <= 0)
|
||||||
|
@ -1006,7 +1011,8 @@ static int encode_double_value(grib_context* c, grib_buffer* buff, long* pos, bu
|
||||||
modifiedFactor = bd->factor;
|
modifiedFactor = bd->factor;
|
||||||
modifiedWidth = bd->width;
|
modifiedWidth = bd->width;
|
||||||
|
|
||||||
descriptor_get_min_max(bd, modifiedWidth, modifiedReference, modifiedFactor, &minAllowed, &maxAllowed);
|
err = descriptor_get_min_max(bd, modifiedWidth, modifiedReference, modifiedFactor, &minAllowed, &maxAllowed);
|
||||||
|
if (err) return err;
|
||||||
|
|
||||||
grib_buffer_set_ulength_bits(c, buff, buff->ulength_bits + modifiedWidth);
|
grib_buffer_set_ulength_bits(c, buff, buff->ulength_bits + modifiedWidth);
|
||||||
if (value == GRIB_MISSING_DOUBLE) {
|
if (value == GRIB_MISSING_DOUBLE) {
|
||||||
|
|
|
@ -10,15 +10,16 @@
|
||||||
|
|
||||||
. ./include.ctest.sh
|
. ./include.ctest.sh
|
||||||
|
|
||||||
REDIRECT=/dev/null
|
|
||||||
label="bufr_ecc-1395_test"
|
label="bufr_ecc-1395_test"
|
||||||
temp=temp.$label
|
|
||||||
tempBufr=temp.$label.bufr
|
tempBufr=temp.$label.bufr
|
||||||
tempFilt=temp.$label.filt
|
tempFilt=temp.$label.filt
|
||||||
tempOut=temp.$label.out
|
tempOut=temp.$label.out
|
||||||
|
|
||||||
sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR4.tmpl
|
sample_bufr4=$ECCODES_SAMPLES_PATH/BUFR4.tmpl
|
||||||
|
|
||||||
|
rm -f $tempBufr
|
||||||
|
|
||||||
# Pick a descriptor that does not exist in version 19
|
# Pick a descriptor that does not exist in version 19
|
||||||
cat > $tempFilt <<EOF
|
cat > $tempFilt <<EOF
|
||||||
set masterTablesVersionNumber = 19;
|
set masterTablesVersionNumber = 19;
|
||||||
|
@ -27,11 +28,14 @@ cat > $tempFilt <<EOF
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
set +e
|
set +e
|
||||||
${tools_dir}/bufr_filter -o $tempBufr $tempFilt $sample_bufr4 # > $tempOut
|
${tools_dir}/bufr_filter -o $tempBufr $tempFilt $sample_bufr4 > $tempOut 2>&1
|
||||||
status=$?
|
status=$?
|
||||||
set -e
|
set -e
|
||||||
|
[ $status -ne 0 ]
|
||||||
|
|
||||||
# TODO check status
|
[ ! -f "$tempBufr" ]
|
||||||
|
|
||||||
|
grep -q "unable to get descriptor 025195" $tempOut
|
||||||
|
|
||||||
|
|
||||||
rm -f $tempFilt $tempBufr $tempOut
|
rm -f $tempFilt $tempOut
|
||||||
|
|
Loading…
Reference in New Issue