RE: [PHP-DEV] Memory leak and possible cause of bug #15333

From: Date: Mon, 08 Apr 2002 20:24:35 +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-82287@lists.php.net to get a copy of this message
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/

« previous php.dev (#82287) next »