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  0x20000000026be870 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.h    Wed 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
--- /tmp/postgresql-7.3.4/contrib/tsearch2/snowball/utilities.c Wed Sep 17 23:37:52 
2003
***************
*** 11,16 ****
--- 11,17 ----
  
  extern symbol * 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;
Only in /tmp/postgresql-7.3.4/contrib/tsearch2/snowball: utilities.o
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to