summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2003-09-29 18:54:38 +0000
committerBruce Momjian2003-09-29 18:54:38 +0000
commit6000e3280540701e56d347c60a0afc35e4fd96ae (patch)
tree3b0e2865e56a6988d20db95c49d8c97ce60a4431
parent4b4c43b14600b63e23271cf904d14d54406205a9 (diff)
I've not changed any malloc/calloc to palloc. It looks to me that these memory
areas are for the lifetime of the backend and in the interests of not breaking something that's not broken I left alone. Note for anyone reading this and wanting it for tsearch-v2-stable (i.e. for 7.3 backend) this patch probably will not apply cleanly to that source. It should be simple enough to see what's going on and apply the changes by hand if need be. -- Nigel J. Andrews
-rw-r--r--contrib/tsearch2/snowball/api.c42
-rw-r--r--contrib/tsearch2/snowball/utilities.c2
-rw-r--r--contrib/tsearch2/ts_cfg.c3
3 files changed, 38 insertions, 9 deletions
diff --git a/contrib/tsearch2/snowball/api.c b/contrib/tsearch2/snowball/api.c
index 5cbf37d73b..426341a360 100644
--- a/contrib/tsearch2/snowball/api.c
+++ b/contrib/tsearch2/snowball/api.c
@@ -6,39 +6,63 @@ extern struct SN_env *
SN_create_env(int S_size, int I_size, int B_size)
{
struct SN_env *z = (struct SN_env *) calloc(1, sizeof(struct SN_env));
+ struct SN_env *z2 = z;
+
+ if (!z)
+ return z;
z->p = create_s();
- if (S_size)
+ if (!z->p)
+ z = NULL;
+
+ if (z && S_size)
{
- z->S = (symbol * *) calloc(S_size, sizeof(symbol *));
+ if ((z->S = (symbol * *) calloc(S_size, sizeof(symbol *))))
{
int i;
for (i = 0; i < S_size; i++)
- z->S[i] = create_s();
+ {
+ if (!(z->S[i] = create_s()))
+ {
+ z = NULL;
+ break;
+ }
+ }
+ z2->S_size = i;
}
- z->S_size = S_size;
+ else
+ z = NULL;
}
- if (I_size)
+ if (z && I_size)
{
z->I = (int *) calloc(I_size, sizeof(int));
- z->I_size = I_size;
+ if (z->I)
+ z->I_size = I_size;
+ else
+ z = NULL;
}
- if (B_size)
+ if (z && B_size)
{
z->B = (symbol *) calloc(B_size, sizeof(symbol));
- z->B_size = B_size;
+ if (z->B)
+ z->B_size = B_size;
+ else
+ z = NULL;
}
+ if (!z)
+ SN_close_env(z2);
+
return z;
}
extern void
SN_close_env(struct SN_env * z)
{
- if (z->S_size)
+ if (z->S && z->S_size)
{
{
int i;
diff --git a/contrib/tsearch2/snowball/utilities.c b/contrib/tsearch2/snowball/utilities.c
index 4ec71dc793..4d031f1c9c 100644
--- a/contrib/tsearch2/snowball/utilities.c
+++ b/contrib/tsearch2/snowball/utilities.c
@@ -14,6 +14,8 @@ create_s(void)
{
symbol *p = (symbol *) (HEAD + (char *) malloc(HEAD + (CREATE_SIZE + 1) * sizeof(symbol)));
+ if (p == (symbol *) (HEAD))
+ return NULL;
CAPACITY(p) = CREATE_SIZE;
SET_SIZE(p, CREATE_SIZE);
return p;
diff --git a/contrib/tsearch2/ts_cfg.c b/contrib/tsearch2/ts_cfg.c
index 1d3ca86a09..6ff25b2b16 100644
--- a/contrib/tsearch2/ts_cfg.c
+++ b/contrib/tsearch2/ts_cfg.c
@@ -112,6 +112,9 @@ init_cfg(Oid id, TSCfgInfo * cfg)
cfg->map[lexid].len = ARRNELEMS(a);
cfg->map[lexid].dict_id = (Datum *) malloc(sizeof(Datum) * cfg->map[lexid].len);
+ if (!cfg->map[lexid].dict_id)
+ ts_error(ERROR, "No memory");
+
memset(cfg->map[lexid].dict_id, 0, sizeof(Datum) * cfg->map[lexid].len);
ptr = (text *) ARR_DATA_PTR(a);
oldcontext = MemoryContextSwitchTo(TopMemoryContext);