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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.