Thread: best place for xstrdup
As suggested by Bruce Mojiman I'm working on substitute some strdup not checked with xstrdup. I seen that in the backend source tree there is no xstrdup ( there is one in bin/psql tree) , I wrote it and inserted temporarelly in backend/utils/mmgr/aset.c I don't know exactly how work the error report mechanism sso before to submit a wrong implementation this was what I wrote: char *xstrdup(const char *string) { char * ret_value; if ( !string ) { elog(ERROR, "xstrdup called with a NULL pointer"); } ret_value = strdup( string ); if ( !ret_value ) { ereport(FATAL, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("strdup out of memory"))); } return ret_value; } if this implementation is ok where is the best place ? Regards Gaetano Mendola
"Mendola Gaetano" <mendola@bigfoot.com> writes: > if ( !ret_value ) { > ereport(FATAL, > (errcode(ERRCODE_OUT_OF_MEMORY), > errmsg("strdup out of memory"))); > } Should be ERROR not FATAL (the places that are insisting on FATAL are special cases that won't be able to use this code). Also the text should just be "out of memory". Per previous discussion, I don't believe in the test for null input, either ... It might be worth creating an xmalloc as well, since I think there are some unchecked malloc's in some places. As for where to put it, mcxt.c may be the best place. aset.c does not contain any routines that are supposed to be globally known. regards, tom lane
"Tom Lane" <tgl@sss.pgh.pa.us> wrote: > "Mendola Gaetano" <mendola@bigfoot.com> writes: > > if ( !ret_value ) { > > ereport(FATAL, > > (errcode(ERRCODE_OUT_OF_MEMORY), > > errmsg("strdup out of memory"))); > > } > > Should be ERROR not FATAL (the places that are insisting on FATAL are > special cases that won't be able to use this code). Also the text > should just be "out of memory". Ok. > Per previous discussion, I don't believe in the test for null input, > either ... Ok ok, I just tried :-) > It might be worth creating an xmalloc as well, since I think there > are some unchecked malloc's in some places. I'll see > As for where to put it, mcxt.c may be the best place. aset.c does > not contain any routines that are supposed to be globally known. Ok Regards Gaetano Mendola