[transliterate] no need to strdup transliterator names if they are lowercased, breaking on NUL byte
This commit is contained in:
@@ -661,17 +661,23 @@ char *transliterate(char *trans_name, char *str, size_t len) {
|
|||||||
log_debug("len = %zu\n", len);
|
log_debug("len = %zu\n", len);
|
||||||
|
|
||||||
str = strdup(str);
|
str = strdup(str);
|
||||||
trans_name = strdup(trans_name);
|
|
||||||
|
|
||||||
// Transliterator names are ASCII strings, so this is fine
|
bool allocated_trans_name = false;
|
||||||
string_lower(trans_name);
|
|
||||||
|
if (!string_is_lower(trans_name)) {
|
||||||
|
trans_name = strdup(trans_name);
|
||||||
|
|
||||||
|
// Transliterator names are ASCII strings, so this is fine
|
||||||
|
string_lower(trans_name);
|
||||||
|
allocated_trans_name = true;
|
||||||
|
}
|
||||||
|
|
||||||
log_debug("lower = %s\n", trans_name);
|
log_debug("lower = %s\n", trans_name);
|
||||||
|
|
||||||
transliterator_t *transliterator = get_transliterator(trans_name);
|
transliterator_t *transliterator = get_transliterator(trans_name);
|
||||||
if (transliterator == NULL) {
|
if (transliterator == NULL) {
|
||||||
log_warn("transliterator \"%s\" does not exist\n", trans_name);
|
log_warn("transliterator \"%s\" does not exist\n", trans_name);
|
||||||
free(trans_name);
|
if (allocated_trans_name) free(trans_name);
|
||||||
free(str);
|
free(str);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -684,7 +690,7 @@ char *transliterate(char *trans_name, char *str, size_t len) {
|
|||||||
|
|
||||||
uint32_t trans_node_id = result.node_id;
|
uint32_t trans_node_id = result.node_id;
|
||||||
|
|
||||||
free(trans_name);
|
if (allocated_trans_name) free(trans_name);
|
||||||
|
|
||||||
result = trie_get_prefix_from_index(trans_table->trie, NAMESPACE_SEPARATOR_CHAR, NAMESPACE_SEPARATOR_CHAR_LEN, result.node_id, result.tail_pos);
|
result = trie_get_prefix_from_index(trans_table->trie, NAMESPACE_SEPARATOR_CHAR, NAMESPACE_SEPARATOR_CHAR_LEN, result.node_id, result.tail_pos);
|
||||||
|
|
||||||
@@ -752,7 +758,7 @@ char *transliterate(char *trans_name, char *str, size_t len) {
|
|||||||
ssize_t char_len = 0;
|
ssize_t char_len = 0;
|
||||||
uint8_t *ptr = (uint8_t *)str;
|
uint8_t *ptr = (uint8_t *)str;
|
||||||
uint64_t idx = 0;
|
uint64_t idx = 0;
|
||||||
|
|
||||||
char *original_str = str;
|
char *original_str = str;
|
||||||
char_array *revisit = NULL;
|
char_array *revisit = NULL;
|
||||||
bool in_revisit = false;
|
bool in_revisit = false;
|
||||||
@@ -776,6 +782,8 @@ char *transliterate(char *trans_name, char *str, size_t len) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ch == 0) break;
|
||||||
|
|
||||||
log_debug("Got char '%.*s' at idx=%zu\n", (int)char_len, str + idx, idx);
|
log_debug("Got char '%.*s' at idx=%zu\n", (int)char_len, str + idx, idx);
|
||||||
|
|
||||||
state = state_transition(trie, str, idx, char_len, prev_state);
|
state = state_transition(trie, str, idx, char_len, prev_state);
|
||||||
|
|||||||
Reference in New Issue
Block a user