diff --git a/src/libespeak-ng/compiledict.c b/src/libespeak-ng/compiledict.c index 48c72797..7a0c3314 100644 --- a/src/libespeak-ng/compiledict.c +++ b/src/libespeak-ng/compiledict.c @@ -372,7 +372,7 @@ typedef enum LINE_PARSER_END_OF_PRONUNCIATION = 5, } LINE_PARSER_STATES; -static int compile_line(char *linebuf, char *dict_line, int *hash) +static int compile_line(char *linebuf, char *dict_line, int n_dict_line, int *hash) { // Compile a line in the language_list file unsigned char c; @@ -621,7 +621,15 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) length = len_word + 2; } else { length = len_word + len_phonetic + 3; - strcpy(&dict_line[(len_word)+2], encoded_ph); + if (length < n_dict_line) { + strcpy(&dict_line[(len_word)+2], encoded_ph); + } else { + fprintf(f_log, "%5d: Dictionary line length would overflow the data buffer: %d\n", linenum, length); + error_count++; + // no phonemes specified. set bit 7 + dict_line[1] |= 0x80; + length = len_word + 2; + } } for (ix = 0; ix < n_flag_codes; ix++) @@ -714,7 +722,7 @@ static int compile_dictlist_file(const char *path, const char *filename) while (fgets(buf, sizeof(buf), f_in) != NULL) { linenum++; - length = compile_line(buf, dict_line, &hash); + length = compile_line(buf, dict_line, sizeof(dict_line), &hash); if (length == 0) continue; // blank line hash_counts[hash]++;