diff --git a/src/grib_accessor_class_unsigned.c b/src/grib_accessor_class_unsigned.c index d1e09634e..093d2a500 100644 --- a/src/grib_accessor_class_unsigned.c +++ b/src/grib_accessor_class_unsigned.c @@ -235,14 +235,14 @@ int pack_long_unsigned_helper(grib_accessor* a, const long* val, size_t* len, in /* Check if value fits into number of bits */ if (check) { - const long nbits = self->nbytes * 8; + if (v < 0) { + grib_context_log(a->context, GRIB_LOG_ERROR, + "Key \"%s\": Trying to encode a negative value of %ld for key of type unsigned\n", a->name, v); + return GRIB_ENCODING_ERROR; + } /* See GRIB-23 and GRIB-262 */ if (!value_is_missing(v)) { - if (v < 0) { - grib_context_log(a->context, GRIB_LOG_ERROR, - "Key \"%s\": Trying to encode a negative value of %ld for key of type unsigned\n", a->name, v); - return GRIB_ENCODING_ERROR; - } + const long nbits = self->nbytes * 8; if (nbits < 33) { unsigned long maxval = (1UL << nbits) - 1; if (maxval > 0 && v > maxval) { /* See ECC-1002 */ diff --git a/tests/grib_set.sh b/tests/grib_set.sh index 325d4168e..2871f661d 100755 --- a/tests/grib_set.sh +++ b/tests/grib_set.sh @@ -13,7 +13,8 @@ REDIRECT=/dev/null infile=${data_dir}/regular_gaussian_surface.grib1 -outfile=${data_dir}/set.grib1 +outfile=${data_dir}/temp.grib_set.grib +temp=temp.grib_set.out rm -f $outfile @@ -52,13 +53,37 @@ levtype=`${tools_dir}/grib_get -p levtype:l $outfile` centre=`${tools_dir}/grib_get -p centre:l $outfile` [ $centre -eq 80 ] +# Set without -s. Expected to fail +# ---------------------------------------------------- set +e -# This is expected to fail ${tools_dir}/grib_set -p levtype $infile $outfile 2> $REDIRECT > $REDIRECT -[ $? -ne 0 ] +status=$? set -e +[ $status -ne 0 ] -# GRIB-941: encoding of grib2 angles +# Out-of-bounds value. Expected to fail +# ---------------------------------------------------- +input=${data_dir}/reduced_gaussian_sub_area.grib2 +set +e +${tools_dir}/grib_set -s perturbationNumber=1000 $input $outfile 2>$temp +status=$? +set -e +[ $status -ne 0 ] +grep -q "Trying to encode value of 1000 but the maximum allowable value is 255 (number of bits=8)" $temp + +# Negative value for an unsigned key. Expected to fail +# ---------------------------------------------------- +input=${data_dir}/reduced_gaussian_sub_area.grib2 +set +e +${tools_dir}/grib_set -s perturbationNumber=-1 $input $outfile 2>$temp +status=$? +set -e +[ $status -ne 0 ] +grep -q "Trying to encode a negative value of -1 for key of type unsigned" $temp + + +# GRIB-941: encoding of GRIB2 angles +# ----------------------------------- angleInDegrees=130.9989 angleInMicroDegrees=130998900 files="GRIB2.tmpl regular_gg_pl_grib2.tmpl reduced_gg_pl_320_grib2.tmpl polar_stereographic_pl_grib2.tmpl" @@ -69,14 +94,17 @@ for f in $files; do done # GRIB-943: centre code table +# ---------------------------- ${tools_dir}/grib_set -s centre=289 $ECCODES_SAMPLES_PATH/GRIB2.tmpl $outfile ${tools_dir}/grib_dump -O $outfile | grep -q 'centre = 289.*Zambia' # ECC-539: avoid output being the same as input +# ----------------------------------------------- set +e ${tools_dir}/grib_set -s centre=0 $outfile $outfile status=$? set -e [ $status -ne 0 ] -rm -f $outfile + +rm -f $outfile $temp