Commit bf4ed58a authored by multrus's avatar multrus
Browse files

Merge branch...

Merge branch '635-ubsan-undefined-behaviour-in-ivas_qmetadata_entropy_encode_dir-for-masa-selftest-cases' into 'main'

fix ubsan error in ivas_qmetadata_entropy_encoder_dir

See merge request !877
parents 234f74d2 4bdb67d9
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -183,6 +183,7 @@
#define FIX_621_MSVQ_UBSAN_NULL_PTR_OFFSET              /* Eri: Issue 621 :  UBSAN:  applying non-zero offset 7200 to null pointer in lsf_msvq_ma_enc.c  */
#define FIX_600_CLEANUP_OF_MANUAL_INSTRUMENTATION       /* Eri: Issue 600 :  removed manual WMCtool instrumentation outside of WMC_TOOL_SKIP defines     */
#define NONBE_FIX_539_MASA_384K_CHIRP                   /* Nokia: issue 539, puts the normalization of the energy ratios at the correct place, affect MASA 384k only */
#define FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA         /* Nokia: issue 635 adding cast to uint16_t in q_metadata_enc */

/* Fixes for bugs found during split rendering contribution development */
#define TD_TDREND_FIX_NULLPTR_ACCESS                    /* FhG: avoid nullptr access in ivas_rend_TDObjRendOpen */
+40 −4
Original line number Diff line number Diff line
@@ -2550,9 +2550,15 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
    float avg_direction_vector[3], direction_vector[3], avg_azimuth, avg_elevation;
    int16_t avg_azimuth_alphabet, avg_elevation_alphabet;
    uint16_t avg_azimuth_index, avg_elevation_index;
#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
    int16_t avg_elevation_index_projected;
    int16_t avg_azimuth_index_projected;
    uint16_t avg_elevation_index_initial, avg_elevation_offset;
    uint16_t avg_azimuth_index_initial, avg_azimuth_offset;
#else
    int16_t avg_elevation_index_initial, avg_elevation_offset, avg_elevation_index_projected;
    int16_t avg_azimuth_index_initial, avg_azimuth_offset, avg_azimuth_index_projected;

#endif
    int16_t elevation_bits_ec_best, azimuth_bits_ec_best;

    int16_t gr_param_elevation_best = 0, avg_elevation_index_best = 0;
@@ -2672,15 +2678,30 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
    }
    else
    {
#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
        if ( sign_th < 0 )
        {
            avg_elevation_index = ( avg_elevation_alphabet >> 1 ) - avg_elevation_index;
        }
        else
        {
            avg_elevation_index += ( avg_elevation_alphabet >> 1 );
        }
        avg_elevation *= sign_th;
#else
        if ( sign_th < 0 )
        {
            avg_elevation_index = -avg_elevation_index;
        }
        avg_elevation *= sign_th;
        avg_elevation_index += ( avg_elevation_alphabet >> 1 );
#endif
    }
#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
    avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) );
#else
    avg_azimuth_index = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet );

#endif
    /* Elevation only if not 2D */
    if ( q_direction->not_in_2D > 0 )
    {
@@ -2697,10 +2718,17 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
            }
            else
            {
#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
                avg_elevation_index = (uint16_t) ( avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset ) );
#else
                avg_elevation_index = avg_elevation_index_initial + ivas_qmetadata_dereorder_generic( avg_elevation_offset );
#endif
            }

#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
            avg_elevation_index = (uint16_t) ( ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet );
#else
            avg_elevation_index = ( avg_elevation_index + avg_elevation_alphabet ) % avg_elevation_alphabet;
#endif

            all_zero_dist_elevation_indexes = 1;
            if ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID )
@@ -2803,7 +2831,11 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
    if ( ( nbands - start_band >= 5 ) && ( q_direction->cfg.mc_ls_setup != MC_LS_SETUP_INVALID ) && ( nblocks > 1 ) )
    {
        use_adapt_avg = calc_var_azi( q_direction, diffuseness_index_max_ec_frame, avg_azimuth - 180, &avg_azimuth );
#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
        avg_azimuth_index = (uint16_t) ( quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet ) );
#else
        avg_azimuth_index = quantize_phi( avg_azimuth + 180, 0, &avg_azimuth, avg_azimuth_alphabet );
#endif
    }
    avg_azimuth_index_initial = avg_azimuth_index; /* avg_azimuth_index;*/
    azimuth_bits_ec_best = MAX16B;
@@ -2813,9 +2845,13 @@ static int16_t ivas_qmetadata_entropy_encode_dir(
    for ( avg_azimuth_offset = 0; avg_azimuth_offset < q_direction->cfg.search_effort; avg_azimuth_offset++ )
    {
        set_zero( avg_direction_vector, 3 );
#ifdef FIX_635_UBSAN_UNDEFINED_BEHAVIOUR_QMETA
        avg_azimuth_index = (uint16_t) ( avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset ) );
        avg_azimuth_index = (uint16_t) ( ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet );
#else
        avg_azimuth_index = avg_azimuth_index_initial + ivas_qmetadata_dereorder_generic( avg_azimuth_offset );
        avg_azimuth_index = ( avg_azimuth_index + avg_azimuth_alphabet ) % avg_azimuth_alphabet;

#endif
        all_zero_dist_azimuth_indexes = 1;
        azimuth_bits_ec = ivas_qmetadata_encode_quasi_uniform_length( ivas_qmetadata_reorder_generic( avg_azimuth_index - ( avg_azimuth_alphabet >> 1 ) ), avg_azimuth_alphabet );

+0 −1
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ implicit-signed-integer-truncation:cng_dec.c
implicit-signed-integer-truncation:cod_tcx.c
implicit-signed-integer-truncation:dec_tcx.c
implicit-signed-integer-truncation:hdecnrm.c
implicit-signed-integer-truncation:ivas_qmetadata_enc.c
implicit-signed-integer-truncation:lib_dec.c
implicit-signed-integer-truncation:longarith.c
implicit-signed-integer-truncation:pvq_core_dec.c