RE: [PHP-DEV] Memory leak and possible cause of bug #15333
| From: | Joseph Tate | Date: | Mon, 08 Apr 2002 20:32:49 +0000 |
| Subject: | RE: [PHP-DEV] Memory leak and possible cause of bug #15333 | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-82288@lists.php.net to get a copy of this message | ||
Gotcha. Guess I missed that there was another copy somewhere. I'm trying
to track down a problem with ISAPI that causes php to die and take down
everything with it. Thought I might have a handle on it. Thanks for the
clarification.
Joseph
> -----Original Message-----
> From: brad lafountain [mailto:rodif_bl@yahoo.com]
> Sent: Monday, April 08, 2002 4:25 PM
> To: Joseph Tate; Php-Dev List
> Subject: RE: [PHP-DEV] Memory leak and possible cause of bug #15333
>
>
> hmm
> ok
>
> zend_constant *c, *b;
> char *sname = "myname";
>
> c->name = name; // the c->name is just a pointer to the sname
> //c->name = strdup(sname); // c->name would have it's own memory
>
> b = c; //now b->name points to sname
>
> free(b->name); // would try and free b->name which can't be done,
> segfault!
>
> so now you do this:
>
> zend_constant *c, *b;
> char *sname = "myname";
> c->name = strdup(sname); // c->name would have it's own memory
>
> b = c; //now b->name points to a copy of sname
> copy_zend_constant(b); //now b->name has its own memory
>
> free(b->name); // now this will work no segfaults here
>
> and if you look where copy_zend_constant it is only called when
> you want to
> copy constants from one hash to another.
>
>
> - Brad
> --- Joseph Tate <jtate@mi-corporation.com> wrote:
> > I don't follow you. Why does it need to be copied? c->name already
> > contains the value. Old? New? c is c is c. Commenting out the code
> > causes other problems elsewhere (or seems to). I just don't
> understand why
> > it has to be done.
> >
> > > -----Original Message-----
> > > --- Joseph Tate <jtate@mi-corporation.com> wrote:
> > > > in the copy_zend_constant function it reads:
> > > >
> > > > void copy_zend_constant(zend_constant *c)
> > > > {
> > > > c->name = zend_strndup(c->name, c->name_len);
> > > > if (!(c->flags & CONST_PERSISTENT)) {
> > > > zval_copy_ctor(&c->value);
> > > > if (c->flags & CONST_EFREE_PERSISTENT) { /*
> > > persist_alloc()'d data */
> > > > persist_alloc(&c->value);
> > > > }
> > > > }
> > > > }
> > > >
> > > > I draw your attention to the first line in the function:
> > > > c->name = zend_strndup(c->name, c->name_len);
> > > >
> > > > First of all, why is this string duplicated only to store
> it to the same
> > > > location? Secondly, is c->name freed somewhere else? Cause I
> > > can't see it
> > > > being freed. Seems like this line can be removed...
> > > >
> > >
> > > So c points to the "old" value and you need to copy the name and
> > > the value to
> > > the "new" one, name and value. and the way hashes and emalloc
> > > works the memory
> > > will be freed automatically.
> > >
> > >
> >
>
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Tax Center - online filing with TurboTax
> http://taxes.yahoo.com/
>
> --
> PHP Development Mailing List <http://www.php.net/>
> To unsubscribe, visit: http://www.php.net/unsub.php