BUF_MEM_grow(buf,(strlen(p)+len-(e-from)));
BUF_MEM_grow_clean(buf,(strlen(p)+len-(e-from)));
static int str_copy(CONF *conf, char *section, char **pto, char *from)	{	int q,r,rr=0,to=0,len=0;	char *s,*e,*rp,*p,*rrp,*np,*cp,v;	BUF_MEM *buf;	if ((buf=BUF_MEM_new()) == NULL) return(0);	len=strlen(from)+1;	if (!BUF_MEM_grow(buf,len)) goto err;	for (;;)		{		if (IS_QUOTE(conf,*from))			{			q= *from;			from++;			while (!IS_EOF(conf,*from) && (*from != q))				{				if (IS_ESC(conf,*from))					{					from++;					if (IS_EOF(conf,*from)) break;					}				buf->data[to++]= *(from++);				}			if (*from == q) from++;			}		else if (IS_DQUOTE(conf,*from))			{			q= *from;			from++;			while (!IS_EOF(conf,*from))				{				if (*from == q)					{					if (*(from+1) == q)						{						from++;						}					else						{						break;						}					}				buf->data[to++]= *(from++);				}			if (*from == q) from++;			}		else if (IS_ESC(conf,*from))			{			from++;			v= *(from++);			if (IS_EOF(conf,v)) break;			else if (v == 'r') v='\r';			else if (v == 'n') v='\n';			else if (v == 'b') v='\b';			else if (v == 't') v='\t';			buf->data[to++]= v;			}		else if (IS_EOF(conf,*from))			break;		else if (*from == '$')			{			/* try to expand it */			rrp=NULL;			s= &(from[1]);			if (*s == '{')				q='}';			else if (*s == '(')				q=')';			else q=0;			if (q) s++;			cp=section;			e=np=s;			while (IS_ALPHA_NUMERIC(conf,*e))				e++;			if ((e[0] == ':') && (e[1] == ':'))				{				cp=np;				rrp=e;				rr= *e;				*rrp='\0';				e+=2;				np=e;				while (IS_ALPHA_NUMERIC(conf,*e))					e++;				}			r= *e;			*e='\0';			rp=e;			if (q)				{				if (r != q)					{					CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE);					goto err;					}				e++;				}			/* So at this point we have			 * ns which is the start of the name string which is			 *   '\0' terminated. 			 * cs which is the start of the section string which is			 *   '\0' terminated.			 * e is the 'next point after'.			 * r and s are the chars replaced by the '\0'			 * rp and sp is where 'r' and 's' came from.			 */			p=_CONF_get_string(conf,cp,np);			if (rrp != NULL) *rrp=rr;			*rp=r;			if (p == NULL)				{				CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE);				goto err;				}			BUF_MEM_grow(buf,(strlen(p)+len-(e-from)));			while (*p)				buf->data[to++]= *(p++);			from=e;			}		else			buf->data[to++]= *(from++);		}	buf->data[to]='\0';	if (*pto != NULL) OPENSSL_free(*pto);	*pto=buf->data;	OPENSSL_free(buf);	return(1);err:	if (buf != NULL) BUF_MEM_free(buf);	return(0);	}