Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5b354d2

Browse files
committed
Fixes:
1 Report error message instead of do nothing in case of error in regex 2 Malloced storage for mask, find and repl part of Affix. This parts may be large enough in real life (for example in czech, thanks to moje <moje@kalhotky.net>)
1 parent e248016 commit 5b354d2

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

contrib/tsearch2/ispell/spell.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#define MAX_NORM 1024
1111
#define MAXNORMLEN 256
1212

13+
#define ERRSTRSIZE 1024
14+
1315
#define STRNCASECMP(x,y) pg_strncasecmp(x, y, strlen(y))
1416
#define GETWCHAR(W,L,N,T) ( ((uint8*)(W))[ ((T)==FF_PREFIX) ? (N) : ( (L) - 1 - (N) ) ] )
1517
#define GETCHAR(A,N,T) GETWCHAR( (A)->repl, (A)->replen, N, T )
@@ -250,30 +252,35 @@ NIAddAffix(IspellDict * Conf, int flag, char flagflags, const char *mask, const
250252
{
251253
Conf->Affix[Conf->naffixes].issimple = 1;
252254
Conf->Affix[Conf->naffixes].isregis = 0;
253-
*(Conf->Affix[Conf->naffixes].mask) = '\0';
255+
Conf->Affix[Conf->naffixes].mask = strdup("");
254256
}
255257
else if (RS_isRegis(mask))
256258
{
257259
Conf->Affix[Conf->naffixes].issimple = 0;
258260
Conf->Affix[Conf->naffixes].isregis = 1;
259-
strcpy(Conf->Affix[Conf->naffixes].mask, mask);
261+
Conf->Affix[Conf->naffixes].mask = strdup(mask);
260262
}
261263
else
262264
{
263265
Conf->Affix[Conf->naffixes].issimple = 0;
264266
Conf->Affix[Conf->naffixes].isregis = 0;
267+
Conf->Affix[Conf->naffixes].mask = (char*)malloc( strlen(mask) + 2 );
265268
if (type == FF_SUFFIX)
266269
sprintf(Conf->Affix[Conf->naffixes].mask, "%s$", mask);
267270
else
268271
sprintf(Conf->Affix[Conf->naffixes].mask, "^%s", mask);
269272
}
273+
MEMOUT(Conf->Affix[Conf->naffixes].mask);
274+
270275
Conf->Affix[Conf->naffixes].compile = 1;
271276
Conf->Affix[Conf->naffixes].flagflags = flagflags;
272277
Conf->Affix[Conf->naffixes].flag = flag;
273278
Conf->Affix[Conf->naffixes].type = type;
274279

275-
strcpy(Conf->Affix[Conf->naffixes].find, find);
276-
strcpy(Conf->Affix[Conf->naffixes].repl, repl);
280+
Conf->Affix[Conf->naffixes].find = strdup(find);
281+
MEMOUT(Conf->Affix[Conf->naffixes].find);
282+
Conf->Affix[Conf->naffixes].repl = strdup(repl);
283+
MEMOUT(Conf->Affix[Conf->naffixes].repl);
277284
Conf->Affix[Conf->naffixes].replen = strlen(repl);
278285
Conf->naffixes++;
279286
return (0);
@@ -794,12 +801,9 @@ CheckAffix(const char *word, size_t len, AFFIX * Affix, char flagflags, char *ne
794801
pfree(mask);
795802
if (err)
796803
{
797-
/*
798-
* regerror(err, &(Affix->reg.regex), regerrstr,
799-
* ERRSTRSIZE);
800-
*/
801-
pg_regfree(&(Affix->reg.regex));
802-
return (NULL);
804+
char regerrstr[ERRSTRSIZE];
805+
pg_regerror(err, &(Affix->reg.regex), regerrstr, ERRSTRSIZE);
806+
elog(ERROR, "Regex error in '%s': %s", Affix->mask, regerrstr);
803807
}
804808
Affix->compile = 0;
805809
}
@@ -1239,6 +1243,9 @@ NIFree(IspellDict * Conf)
12391243
else
12401244
pg_regfree(&(Affix[i].reg.regex));
12411245
}
1246+
free(Affix[i].mask);
1247+
free(Affix[i].find);
1248+
free(Affix[i].repl);
12421249
}
12431250
if (Conf->Spell)
12441251
{

contrib/tsearch2/ispell/spell.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ typedef struct aff_struct
5454
isregis:1,
5555
unused:1,
5656
replen:16;
57-
char mask[32];
58-
char find[16];
59-
char repl[16];
57+
char *mask;
58+
char *find;
59+
char *repl;
6060
union
6161
{
6262
regex_t regex;

0 commit comments

Comments
 (0)