Re: Suggest modu Working class functions misuse ObjStack buffer.
Kevin Atkinson <[email protected]>
| Newsgroups | gmane.comp.gnu.aspell.devel |
|---|---|
| Message-ID | <Pine.LNX.4.44.0501111352570.11940-200000@kevin-p3.atkinson.dhs.org> |
On Tue, 11 Jan 2005, Gary Setter wrote: > In the suggest module, Wording class we use the ObjStack buffer > member to accumulate a suggestion (aka nearmiss). See functions > form_word, try_word_n, and try_word_c. We append to buffer more > then once. We assume that the size of the buffer is the end of > the last memory location allocated minus the start of the first > memory allocation. That will fail when one of the appends results > in a reallocation due to exceeding the memory available in the > current block. > > I haven't desided what to do. I may suggest a patch that uses the > String class to accumulate the suggestion, since ObjStack doesn't > seem to be a good choice for the task at hand. No need for anything that drastic. Attached is a patch to fix the problem. -- http://kevin.atkinson.dhs.org _______________________________________________ Aspell-devel mailing list [email protected] http://lists.gnu.org/mailman/listinfo/aspell-devel
suggest-fix.diff
(text/plain, 1.1 KB)
Index: modules/speller/default/suggest.cpp
===================================================================
RCS file: /cvsroot/aspell/aspell/modules/speller/default/suggest.cpp,v
retrieving revision 1.57
diff -u -r1.57 suggest.cpp
--- modules/speller/default/suggest.cpp 23 Dec 2004 04:43:12 -0000 1.57
+++ modules/speller/default/suggest.cpp 11 Jan 2005 20:54:35 -0000
@@ -411,8 +411,9 @@
CheckInfo ci; memset(&ci, 0, sizeof(ci));
bool res = lang->affix()->affix_check(LookupInfo(sp, LookupInfo::Clean), str, ci, 0);
if (!res) return;
- char * tmp = form_word(ci);
+ form_word(ci);
char * end = (char *)buffer.grow_temp(1);
+ char * tmp = (char *)buffer.temp_ptr();
*end = '\0';
add_nearmiss(tmp, end - tmp, 0, 0, score, -1, do_count);
}
@@ -475,6 +476,7 @@
t[0] = lang->to_lower(t[0]);
}
char * end = (char *)buffer.grow_temp(1);
+ tmp = (char *)buffer.temp_ptr(); // since the orignal string may of moved
*end = 0;
buffer.commit_temp();
add_nearmiss(tmp, end - tmp, 0, 0, score, -1, do_count);