Hi

Vim-7.3.107 crashes when I try to create the Esperanto
dictionary from OpenOffice-3.

Steps to reproduce:

$ wget http://extensions.services.openoffice.org/e-files/3377/1/1.0-dev.oxt
$ unzip 1.0-dev.oxt
$ vim -u NONE --noplugin -c 'set nomore' -c 'mkspell! /tmp/eo literumilo'
Vim: Caught deadly signal SEGV

Vim: Finished.
Segmentation fault (core dumped)


Valgrind memory checker gives errors:

==3877== Invalid write of size 1
==3877==    at 0x4026087: strcat (mc_replace_strmem.c:176)
==3877==    by 0x818AF60: spell_read_aff (spell.c:5493)
==3877==    by 0x819359D: mkspell (spell.c:9234)
==3877==    by 0x8191F53: ex_mkspell (spell.c:8557)
==3877==    by 0x80A81AC: do_one_cmd (ex_docmd.c:2657)
==3877==    by 0x80A5A85: do_cmdline (ex_docmd.c:1123)
==3877==    by 0x80A513F: do_cmdline_cmd (ex_docmd.c:728)
==3877==    by 0x80EAEE5: exe_commands (main.c:2803)
==3877==    by 0x80E85CA: main (main.c:881)
==3877==  Address 0x7e3b434 is 0 bytes after a block of size 16,012 alloc'd
==3877==    at 0x4025230: malloc (vg_replace_malloc.c:236)
==3877==    by 0x8117B93: lalloc (misc2.c:918)
==3877==    by 0x8117ACB: alloc_clear (misc2.c:829)
==3877==    by 0x818F951: getroom (spell.c:7368)
==3877==    by 0x818AEFA: spell_read_aff (spell.c:5485)
==3877==    by 0x819359D: mkspell (spell.c:9234)
==3877==    by 0x8191F53: ex_mkspell (spell.c:8557)
==3877==    by 0x80A81AC: do_one_cmd (ex_docmd.c:2657)
==3877==    by 0x80A5A85: do_cmdline (ex_docmd.c:1123)
==3877==    by 0x80A513F: do_cmdline_cmd (ex_docmd.c:728)
==3877==    by 0x80EAEE5: exe_commands (main.c:2803)
==3877==    by 0x80E85CA: main (main.c:881)
(several other errors after that)

spell.c:

  5478     else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
  5479     {
  5480         /* Concatenate this string to previously defined ones, using a
  5481          * slash to separate them. */
  5482         l = (int)STRLEN(items[1]) + 1;
  5483         if (compflags != NULL)
  5484             l += (int)STRLEN(compflags) + 1;
  5485         p = getroom(spin, l, FALSE);
  5486         if (p != NULL)
  5487         {
  5488             if (compflags != NULL)
  5489             {
  5490                 STRCPY(p, compflags);
  5491                 STRCAT(p, "/");
  5492             }
!!5493             STRCAT(p, items[1]);
  5494             compflags = p;
  5495         }
  5496     }

When it crashes, I notice that variable l reaches 16005 which is just
slightly bigger than SBLOCKSIZE (#define  SBLOCKSIZE 16000 at
spell.c:4885).

I changed SBLOCKSIZE from 16000 to 1024000 at spell.c:4885
and it longer crashes but that's quite a dramatic increase so I
doubt whether that's right.  While creating the dictionary,
l variable at spell.c:5485 reached l=564,458.

Vim temporary used 12.5 Gb of memory while creating the
dictionary which is quite a lot.

Size of the created dictionary file 'eo.utf-8.spl' is 587,214 bytes
and it does not work.  Trying to use it with...

  $ cp /tmp/eo.utf-8.spl ~/.vim/spell/.

... then in Vim...
  :setlocal spell spelllang=eo

  ... gives errors after waiting for ~10 sec or so:

  Error detected while processing /home/pel/.vim/spell/eo.utf-8.spl:
  E339: Pattern too long
  E759: Format error in spell file

":help E339" says: "This only happens on systems with 16 bit ints".

Well, that's not true since I get E339 on Linux x86_64 where
sizeof(int) is 4 (32 bits).

E339 at regexp.c:1059 is in between SMALL_MALLOC
but E339 at regexp.c:1077 is not in between SMALL_MALLOC.

Either help file needs to be updated for E339 or regexp.c
needs to handle longer regexes.

Problem is triggered by the fact that file 'literumilo.aff' contains
many COMPOUNDRULE lines (Esperanto being an agglutinative
language).

Esperanto dictionary from OpenOffice-2.x as currently used by
Vim works fine.

Regards
-- Dominique

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui