diff --git a/apps/decoder.c b/apps/decoder.c index 6f73723af1b7d21049c50acc6502adb70ba72c8b..7f94e19808d8b87dfc2df054745085d41609fbf8 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -79,7 +79,6 @@ static #define NUM_BITS_SID_IVAS_9K3 186 #define NUM_BITS_SID_IVAS_10K2 204 #endif -#define META_LINE_LENGTH 200 #define MAX_FRAME_SIZE ( 48000 / 50 ) #define MAX_NUM_OUTPUT_CHANNELS 16 #define MAX_OUTPUT_PCM_BUFFER_SIZE ( MAX_NUM_OUTPUT_CHANNELS * MAX_FRAME_SIZE ) diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 0074be76d2a476bc284839a5e2aea8d90695060f..7306216378b47fa704882c4e3a42459489f61cda 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -303,8 +303,6 @@ typedef enum * ISm Constants *----------------------------------------------------------------------------------*/ -#define META_LINE_LENGTH 200 /* max number of characters at one line of metadata input/output file */ - #define ISM_NB_BITS_METADATA_NOMINAL ( ( SCE_CORE_16k_LOW_LIMIT - ACELP_16k_LOW_LIMIT ) / FRAMES_PER_SEC ) /* nominal number of metadata bits - used for configuration of Core-Coder modules */ #define ISM_METADATA_VAD_FLAG_BITS 1 diff --git a/lib_com/ivas_error.h b/lib_com/ivas_error.h index fdc7a1502df931a6e4e08151525d141169808540..c6b517b9a0ce241963dfd16138c93f7e8946d7a8 100644 --- a/lib_com/ivas_error.h +++ b/lib_com/ivas_error.h @@ -89,6 +89,9 @@ typedef enum IVAS_ERR_NOT_IMPLEMENTED, IVAS_ERR_FILE_READER_TIMESTAMP_MISMATCH, IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT, +#ifdef FIX_ISM_METADATA_READER + IVAS_ERR_ISM_INVALID_METADATA_VALUE, +#endif IVAS_ERR_INVALID_MASA_FORMAT_METADATA_FILE, #ifdef DEBUGGING IVAS_ERR_INVALID_FORCE_MODE, diff --git a/lib_com/options.h b/lib_com/options.h old mode 100644 new mode 100755 index 73a346c8091b0c71f5751eee55b4b1b80b42b21b..83488b2b6441ecd3b318fc228f0480067d63e1f0 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -170,6 +170,7 @@ #define FIX_I220_PARAMMC_CPROTO /* Issue 220: sanitizer error in the svd due to NaNs coming from negative energies in Cproto */ #define FIX_221_BR_SWITCH_STEREO /* Issue 221: Fix missing initialization when switchin from TD to MDCT stereo*/ #define FIX_DTX_RANGE /* Issue 118: fix the DTX usage: default DTX up to 64 kbps, otherwise only in silence */ +#define FIX_ISM_METADATA_READER /* Issue 211: make ISM metadata file reader robust against invalid files */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_enc/lib_enc.c b/lib_enc/lib_enc.c index f9857f1162f64885ffb2dca046addf6969e8b5b1..063375ef59dbb88cda23e7085b2ac62e633d538c 100755 --- a/lib_enc/lib_enc.c +++ b/lib_enc/lib_enc.c @@ -1406,6 +1406,10 @@ const char *IVAS_ENC_GetErrorMessage( return "mismatched timestamp"; case IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT: return "invalid metadata format"; +#ifdef FIX_ISM_METADATA_READER + case IVAS_ERR_ISM_INVALID_METADATA_VALUE: + return "invalid metadata value provided"; +#endif case IVAS_ERR_FAILED_FILE_READ: return "could not read from file"; case IVAS_ERR_NOT_SUPPORTED_OPTION: diff --git a/lib_util/cmdl_tools.c b/lib_util/cmdl_tools.c index aee640a17ed12523e40b705194f14b445ee6284d..010685f239921508521dbedd602c9395b18d7c64 100644 --- a/lib_util/cmdl_tools.c +++ b/lib_util/cmdl_tools.c @@ -78,3 +78,27 @@ bool is_digits_only( char *str ) return true; } + + +/*---------------------------------------------------------------------* + * is_number() + * + * Check if a string is a number. + *---------------------------------------------------------------------*/ + +bool is_number( char *str ) +{ + int16_t i; + + i = 0; + while ( str[i] != 0 ) + { + if ( ( str[i] < '0' || str[i] > '9' ) && str[i] != '.' && str[i] != '-' && str[i] != '\n' ) + { + return false; + } + i++; + } + + return true; +} diff --git a/lib_util/cmdl_tools.h b/lib_util/cmdl_tools.h index 3bc9cb81f73bd726cfc73e829859489edd1bcae6..829ec985b0314f375f3489447296734754423617 100644 --- a/lib_util/cmdl_tools.h +++ b/lib_util/cmdl_tools.h @@ -38,6 +38,8 @@ bool is_digits_only( char *str ); +bool is_number( char *str ); + char *to_upper( char *str ); diff --git a/lib_util/ism_file_reader.c b/lib_util/ism_file_reader.c index d60c3ec8a82420125290e1324a36329596463284..cc93501571a5ae84a241dec84631c56228b5ba82 100644 --- a/lib_util/ism_file_reader.c +++ b/lib_util/ism_file_reader.c @@ -31,6 +31,9 @@ *******************************************************************************************************/ #include "ism_file_reader.h" +#ifdef FIX_ISM_METADATA_READER +#include "cmdl_tools.h" +#endif #include #include #include @@ -86,6 +89,7 @@ IsmFileReader *IsmFileReader_open( * * Reads ISM metadata from a previously opened file into the provided struct. *---------------------------------------------------------------------*/ + /*! r: error code */ ivas_error IsmFileReader_readNextFrame( IsmFileReader *self, /* i/o: IsmFileReader handle */ @@ -113,8 +117,21 @@ ivas_error IsmFileReader_readNextFrame( char_ptr = strtok( char_buff, "," ); i = 0; meta_prm[i++] = (float) atof( char_ptr ); +#ifdef FIX_ISM_METADATA_READER + if ( is_number( char_ptr ) == false ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } +#endif while ( ( char_ptr = strtok( NULL, "," ) ) != NULL && i < NUM_ISM_METADATA_PER_LINE ) { +#ifdef FIX_ISM_METADATA_READER + if ( is_number( char_ptr ) == false ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } +#endif + meta_prm[i++] = (float) atof( char_ptr ); } @@ -124,12 +141,47 @@ ivas_error IsmFileReader_readNextFrame( return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; } +#ifdef FIX_ISM_METADATA_READER + if ( char_ptr != NULL ) + { + /* Too many values provided in one line */ + return IVAS_ERR_ISM_FILE_READER_INVALID_METADATA_FORMAT; + } +#endif + ismMetadata->azimuth = meta_prm[0]; ismMetadata->elevation = meta_prm[1]; ismMetadata->radius = meta_prm[2]; ismMetadata->spread = meta_prm[3]; ismMetadata->gainFactor = meta_prm[4]; +#ifdef FIX_ISM_METADATA_READER + /* verify whether the read metadata values are in an expected range */ + if ( ismMetadata->azimuth > 180 || ismMetadata->azimuth < -180 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->elevation > 90 || ismMetadata->elevation < -90 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->radius < 0 ) // Ivas_fmToDo: to be reviewed + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->spread > 360 || ismMetadata->spread < 0 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } + + if ( ismMetadata->gainFactor > 1 || ismMetadata->gainFactor < 0 ) + { + return IVAS_ERR_ISM_INVALID_METADATA_VALUE; + } +#endif return IVAS_ERR_OK; } @@ -140,6 +192,7 @@ ivas_error IsmFileReader_readNextFrame( * * De-allocates all underlying memory of an IsmFileReader. *---------------------------------------------------------------------*/ + void IsmFileReader_close( IsmFileReader **selfPtr /* i/o: pointer to IsmFileReader handle */ )