This replaces the previous patch in this thread.
On Wed, 17 Sep 2003, Nigel J. Andrews wrote:
On Wed, 17 Sep 2003 [EMAIL PROTECTED] wrote:
On Wed, 17 Sep 2003 [EMAIL PROTECTED] wrote:
#0 SN_create_env (S_size=0, I_size=2, B_size=1) at api.c:6
6 z-p = create_s();
(gdb) bt
#0 SN_create_env (S_size=0, I_size=2, B_size=1) at api.c:6
#1 0x226be870 in SN_create_env (S_size=40770504, I_size=
40509856,
B_size=1034) at api.c:6
...
Having said that the z in the z-p = create_s() line mentioned as the place of
the fault is the result of a calloc without checking for a null return from
calloc. Here's a[nother simple] patch to fix that.
It's not going to fix whatever is putting you into the situation that makes
calloc fail though. It'll just make the failure less disasterous.
Here's a slightly more paranoid patch, i.e. it checks all the allocations done
in the routine instead of just the specific instance from the stack trace the
previous patch checked.
On a matter of style, it's been a while since I've seriously considered cross
platform C. Is it the done thing to expect:
int *i = (int *)calloc(1,sizeof(int));
to give the condition *i == 0 (assuming the memory allocation worked)?
Also, I've not tested the amended code since I don't know that much about the
configuration of tsearch2 and specifically what this snowball stuff
is. However, it builds for me and a test query didn't break. I'd appreciate if
someone could give the changes a quick once over for correctness and if someone
could actually test this (maybe [EMAIL PROTECTED]). In the meantime I'll
see if I can get the regression test to run.
--
Nigel J. Andrews
Only in /tmp/postgresql-7.3.4/contrib/tsearch2/snowball: SUBSYS.o
diff -rc tsearch2/snowball/api.c /tmp/postgresql-7.3.4/contrib/tsearch2/snowball/api.c
*** tsearch2/snowball/api.c Mon Jul 7 15:29:46 2003
--- /tmp/postgresql-7.3.4/contrib/tsearch2/snowball/api.c Wed Sep 17 23:35:34
2003
***
*** 2,33
#include header.h
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));
z-p = create_s();
! if (S_size)
! { z-S = (symbol * *) calloc(S_size, sizeof(symbol *));
{ int i;
! for (i = 0; i S_size; i++) z-S[i] = create_s();
}
! z-S_size = S_size;
}
! if (I_size)
{ z-I = (int *) calloc(I_size, sizeof(int));
! z-I_size = I_size;
}
! if (B_size)
{ z-B = (symbol *) calloc(B_size, sizeof(symbol));
! z-B_size = B_size;
}
return z;
}
extern void SN_close_env(struct SN_env * z)
{
! if (z-S_size)
{
{ int i;
for (i = 0; i z-S_size; i++) lose_s(z-S[i]);
--- 2,51
#include header.h
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 (!z-p) z = NULL;
!
! if (z S_size)
! { if ((z-S = (symbol * *) calloc(S_size, sizeof(symbol *
{ int i;
! for (i = 0; i S_size; i++)
! { if (!(z-S[i] = create_s()))
! { z = NULL;
! break;
! }
! }
! z2-S_size = i;
}
! else
! z = NULL;
}
! if (z I_size)
{ z-I = (int *) calloc(I_size, sizeof(int));
! if (z-I) z-I_size = I_size;
! else z = NULL;
}
! if (z B_size)
{ z-B = (symbol *) calloc(B_size, sizeof(symbol));
! 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 z-S_size)
{
{ int i;
for (i = 0; i z-S_size; i++) lose_s(z-S[i]);
Only in /tmp/postgresql-7.3.4/contrib/tsearch2/snowball: api.o
Only in /tmp/postgresql-7.3.4/contrib/tsearch2/snowball: english_stem.o
diff -rc tsearch2/snowball/header.h
/tmp/postgresql-7.3.4/contrib/tsearch2/snowball/header.h
*** tsearch2/snowball/header.h Mon Jul 7 15:29:46 2003
--- /tmp/postgresql-7.3.4/contrib/tsearch2/snowball/header.hWed Sep 17 23:20:55
2003
***
*** 6,11
--- 6,15
#define MAXINT INT_MAX
#define MININT INT_MIN
+ #ifndef NULL
+ #define NULL ((void *)0)
+ #endif
+
#define HEAD 2*sizeof(int)
#define SIZE(p)((int *)(p))[-1]
Only in /tmp/postgresql-7.3.4/contrib/tsearch2/snowball: russian_stem.o
diff -rc tsearch2/snowball/utilities.c
/tmp/postgresql-7.3.4/contrib/tsearch2/snowball/utilities.c
*** tsearch2/snowball/utilities.c Mon Jul 7 15:29:46 2003
---