Skip to content

Commit

Permalink
Fix reported segfault on full-range alpha map
Browse files Browse the repository at this point in the history
* tests/Makefile.am, +tests/test_byte_alpha.c:
  - Add test case
* datrie/alpha-map.c (alpha_map_recalc_work_area()):
  - Redeclare trie_last as TrieIndex, to prevent overflow.

Thanks Xiao Wang for the report, and @nevermatch for the analysis.

Closes: #6
#6
  • Loading branch information
thep committed Apr 21, 2018
1 parent d1dfdb8 commit 3646819
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 1 deletion.
14 changes: 14 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
2018-04-21 Theppitak Karoonboonyanan <[email protected]>

Fix reported segfault on full-range alpha map

* tests/Makefile.am, +tests/test_byte_alpha.c:
- Add test case
* datrie/alpha-map.c (alpha_map_recalc_work_area()):
- Redeclare trie_last as TrieIndex, to prevent overflow.

Thanks Xiao Wang for the report, and @nevermatch for the analysis.

Closes: #6
https://github.com/tlwg/libdatrie/issues/6

2018-03-29 Theppitak Karoonboonyanan <[email protected]>

Fix trie_state_get_data() at a prefix key
Expand Down
2 changes: 1 addition & 1 deletion datrie/alpha-map.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ alpha_map_recalc_work_area (AlphaMap *alpha_map)
const AlphaChar alpha_begin = range->begin;
int n_cells, i;
AlphaChar a;
TrieChar trie_last = 0;
TrieIndex trie_last = 0;
TrieChar tc;

/* reconstruct alpha-to-trie map */
Expand Down
8 changes: 8 additions & 0 deletions tests/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ TESTS = \
test_nonalpha \
test_null_trie \
test_term_state \
test_byte_alpha \
$(NULL)

check_PROGRAMS = \
Expand All @@ -20,6 +21,7 @@ check_PROGRAMS = \
test_nonalpha \
test_null_trie \
test_term_state \
test_byte_alpha \
$(NULL)

noinst_HEADERS = \
Expand Down Expand Up @@ -68,3 +70,9 @@ test_term_state_SOURCES = \
$(NULL)
test_term_state_LDADD = $(top_builddir)/datrie/libdatrie.la

test_byte_alpha_SOURCES = \
test_byte_alpha.c \
utils.c \
$(NULL)
test_byte_alpha_LDADD = $(top_builddir)/datrie/libdatrie.la

94 changes: 94 additions & 0 deletions tests/test_byte_alpha.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* libdatrie - Double-Array Trie Library
* Copyright (C) 2018 Theppitak Karoonboonyanan <[email protected]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

/*
* test_byte_alpha.c - Test byte stream (full-range 0..255) alpha map
* Created: 2018-04-21
* Author: Theppitak Karoonboonyanan <[email protected]>
* Based on test case in issue #6
* https://github.com/tlwg/libdatrie/issues/6
*/

#include <datrie/trie.h>
#include <stdio.h>
#include <stdlib.h>

#define TEST_DATA 255
int
main ()
{
AlphaMap *alpha_map;
Trie *test_trie;
AlphaChar key[3];
TrieData data;

msg_step ("Preparing alpha map");
alpha_map = alpha_map_new ();
if (!alpha_map) {
printf ("Fail to allocate alpha map\n");
goto err_alpha_map_not_created;
}
if (alpha_map_add_range (alpha_map, 0x00, 0xff) != 0) {
printf ("Fail to add full alpha map range\n");
goto err_alpha_map_created;
}

msg_step ("Preparing trie");
test_trie = trie_new (alpha_map);
alpha_map_free (alpha_map);
if (!test_trie) {
printf ("Fail to create test trie\n");
goto err_alpha_map_created;
}

msg_step ("Storing key to test trie");
key[0] = 0xff;
key[1] = 0xff;
key[2] = 0;
if (!trie_store (test_trie, key, TEST_DATA)) {
printf ("Fail to store key to test trie\n");
goto err_trie_created;
}

msg_step ("Retrieving data from test trie");
if (!trie_retrieve (test_trie, key, &data)) {
printf ("Fail to retrieve key from test trie\n");
goto err_trie_created;
}
if (TEST_DATA != data) {
printf ("Retrieved data = %d, not %d\n", data, TEST_DATA);
goto err_trie_created;
}

msg_step ("Freeing test trie");
trie_free (test_trie);
return 0;

err_trie_created:
trie_free (test_trie);
err_alpha_map_created:
alpha_map_free (alpha_map);
err_alpha_map_not_created:
return 1;
}

/*
vi:ts=4:ai:expandtab
*/

0 comments on commit 3646819

Please sign in to comment.