From 1cf940a87af99849714600b5348dfa0f67f75184 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Thu, 18 Dec 2014 11:51:22 +0000 Subject: [PATCH] Added some protection against out of range values getting into golay decoder look up table. Haven't repeated problem or found root cause. freedv unit tests work OK with changes git-svn-id: https://svn.code.sf.net/p/freetel/code@1976 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/freedv_api.c | 8 ++++---- codec2-dev/src/golay23.c | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index db3f72f1..70258b24 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -89,7 +89,7 @@ struct freedv *freedv_open(int mode) { nbit = 2*fdmdv_bits_per_frame(f->fdmdv); f->tx_bits = (int*)malloc(nbit*sizeof(int)); f->rx_bits = (int*)malloc(nbit*sizeof(int)); - + nbit = fdmdv_bits_per_frame(f->fdmdv); f->fdmdv_bits = (int*)malloc(nbit*sizeof(int)); @@ -333,15 +333,15 @@ int freedv_floatrx(struct freedv *f, short speech_out[], float demod_in[]) { recd_codeword = 0; for(i=0; i<8; i++) { recd_codeword <<= 1; - recd_codeword |= f->rx_bits[i]; + recd_codeword |= (f->rx_bits[i] & 0x1); } for(i=11; i<15; i++) { recd_codeword <<= 1; - recd_codeword |= f->rx_bits[i]; + recd_codeword |= (f->rx_bits[i] & 0x1); } for(i=bits_per_codec_frame; irx_bits[i]; + recd_codeword |= (f->rx_bits[i] & 0x1); } codeword1 = golay23_decode(recd_codeword); f->total_bit_errors += golay23_count_errors(recd_codeword, codeword1); diff --git a/codec2-dev/src/golay23.c b/codec2-dev/src/golay23.c index cc6c4194..ada17c31 100644 --- a/codec2-dev/src/golay23.c +++ b/codec2-dev/src/golay23.c @@ -6,7 +6,7 @@ To test: - src$ gcc golay23.c -o golay23 -Wall -DGOLAY23_UNITTEST + src$ gcc golay23.c -o golay23 -Wall -DGOLAY23_UNITTEST -DRUN_TIME_TABLES src$ ./golay23 To generate tables: @@ -257,9 +257,9 @@ void golay23_init(void) { int golay23_encode(int data) { assert(inited); + assert(data <= 0xfff); //printf("data: 0x%x\n", data); - assert(data <= 0xfff); return encoding_table[data]; } @@ -275,6 +275,7 @@ int golay23_encode(int data) { int golay23_decode(int received_codeword) { assert(inited); + assert((received_codeword < (1<<23)) && (received_codeword >= 0)); //printf("syndrome: 0x%x\n", get_syndrome(received_codeword)); return received_codeword ^= decoding_table[get_syndrome(received_codeword)]; -- 2.25.1