The earlier message has been removed and this one has been put up as
memoryleak2. Thanks,
Roy
On Mon, 12 Apr 1999, Rick Beebe wrote:
> Roy Tennant wrote:
> >
> > This is now available in the Patches directory:
> >
> > http://sunsite.berkeley.edu/SWISH-E/Patches/
> >
> > Roy
> >
> > >Date: Fri, 09 Apr 1999 11:26:19 -0400
> > >From: Rick Beebe <richard.beebe@yale.edu>
> > >Subject: bug(?) in swish regex
> > >Organization: Yale University School of Medicine
> > >
> > >I've had regular unexplained crashes in Swish 1.3.1 running under Digital
> > >Unix 4.0D. The crash is always a segmentation fault in matchARegex. After a
> > >bunch of experimentation (I haven't done anything with regex before) I added
> > >regfree calls to the routine and that fixed _most_ of the crashes. I'm not
> > >sure why it should make a difference--I would have thought re would be freed
> > >when leaving the routine--but it did. It still crashes occasionally--once
> > >every three or four days--but it never used to even make it through a night
> > >before.
>
> Hmm. I was just looking through the patches directory (I hadn't realized it
> was there). There's another patch--'memoryleak', submitted Jan 20 by Marc
> Perrin--which details this exact same problem and solution on HPUX. I guess
> it's a common enough problem that these patches ought to end up in 1.3.3,
> eh?
>
> I noticed, also, that the 'memoryleak' also adds some other regfree calls.
> That made me look a little closer--I'd focused on the matchARegex call
> because that's where mine was crashing. The routine directly above
> matchARegex also uses regcomp as does file.c. All are shown in 'memoryleak'
> but I don't agree with placement of a couple of them. So, I've come up with
> a new patch listed below with my versions. This also incorporates the
> previous patch I submitted so it should probably replace it.
>
> Just an FYI. Swish hasn't crashed since I incorporated these patches. I
> currently regenerate 25 index files each night. The largest indexes 25,000
> documents and creates a 38 meg file.
>
> --Rick Beebe
>
> *** file.c.orig Fri Dec 11 13:54:51 1998
> --- file.c Fri Apr 9 11:49:11 1999
> ***************
> *** 452,462 ****
>
> if (tmpReplace->next)
> tmpReplace = tmpReplace->next;
> ! else
> return;
> }
> tmpReplace = tmpReplace->next;
> }
> }
>
> /* This is similar to the previous one, just kept separated because */
> --- 452,465 ----
>
> if (tmpReplace->next)
> tmpReplace = tmpReplace->next;
> ! else {
> ! regfree(&re);
> return;
> + }
> }
> tmpReplace = tmpReplace->next;
> }
> + regfree(&re);
> }
>
> /* This is similar to the previous one, just kept separated because */
> ***************
> *** 481,486 ****
> --- 484,490 ----
> }
> tmpReplace = tmpReplace->next;
> }
> + regfree(&re);
> }/* end of checkListRegex */
>
>
> *** string.c.orig Fri Apr 9 11:08:00 1999
> --- string.c Mon Apr 12 12:25:18 1999
> ***************
> *** 566,577 ****
>
> status = regcomp(&re, pattern, REG_EXTENDED);
> if ( status != 0) {
> return oldStr;
> }
>
> status = regexec(&re,str,(size_t)MAXPAR,pmatch,0);
> ! if (status != 0)
> return oldStr;
>
> tmpstr = str;
> while (!status) {
> --- 566,580 ----
>
> status = regcomp(&re, pattern, REG_EXTENDED);
> if ( status != 0) {
> + regfree(&re);
> return oldStr;
> }
>
> status = regexec(&re,str,(size_t)MAXPAR,pmatch,0);
> + regfree(&re);
> ! if (status != 0)
> return oldStr;
>
> tmpstr = str;
> while (!status) {
> ***************
> *** 599,617 ****
> /*---------------------------------------------------------*/
> /* Match a regex and a string */
>
> ! int matchARegex( char *str, char *pattern)
> {
> int status;
> ! regex_t re;
> !
> status = regcomp(&re, pattern, REG_EXTENDED);
> ! if ( status != 0)
> return 0;
> !
> status = regexec(&re,str,(size_t)0,NULL,0);
> ! if (status != 0)
> return 0;
> !
> return 1;
> }
> /*-----------------------------------------------------*/
> --- 599,622 ---*
> /*---------------------------------------------------------*/
> /* Match a regex and a string */
>
> ! int matchARegex( char *str, char *pattern)
> {
> int status;
> ! regex_t re;
> !
> status = regcomp(&re, pattern, REG_EXTENDED);
> ! if ( status != 0) {
> ! regfree(&re);
> return 0;
> ! }
> !
> status = regexec(&re,str,(size_t)0,NULL,0);
> ! if (status != 0) {
> ! regfree(&re);
> return 0;
> ! }
> !
> ! regfree(&re);
> return 1;
> }
> /*-----------------------------------------------------*/
>
Received on Mon Apr 12 11:52:28 1999