get rid of a big stack allocation
we were allocating 100kb in the C stack for a temporary string, instead format directly to the destination area some libc have very limited space on the C stack and can't afford this see https://github.com/lovell/sharp/issues/242
This commit is contained in:
parent
c2e8406ca0
commit
96ed5eb684
@ -73,10 +73,6 @@
|
|||||||
* ]|
|
* ]|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Largest string we can append in one operation.
|
|
||||||
*/
|
|
||||||
#define MAX_STRSIZE (100000)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VIPS_BUF_STATIC:
|
* VIPS_BUF_STATIC:
|
||||||
* @TEXT: the storage area to use
|
* @TEXT: the storage area to use
|
||||||
@ -320,7 +316,6 @@ vips_buf_appends( VipsBuf *buf, const char *str )
|
|||||||
*
|
*
|
||||||
* Returns: %FALSE on overflow, %TRUE otherwise.
|
* Returns: %FALSE on overflow, %TRUE otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
vips_buf_appendc( VipsBuf *buf, char ch )
|
vips_buf_appendc( VipsBuf *buf, char ch )
|
||||||
{
|
{
|
||||||
@ -342,7 +337,6 @@ vips_buf_appendc( VipsBuf *buf, char ch )
|
|||||||
*
|
*
|
||||||
* Returns: %FALSE on overflow, %TRUE otherwise.
|
* Returns: %FALSE on overflow, %TRUE otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
vips_buf_change( VipsBuf *buf, const char *old, const char *new )
|
vips_buf_change( VipsBuf *buf, const char *old, const char *new )
|
||||||
{
|
{
|
||||||
@ -399,29 +393,6 @@ vips_buf_removec( VipsBuf *buf, char ch )
|
|||||||
return( TRUE );
|
return( TRUE );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* vips_buf_appendf:
|
|
||||||
* @buf: the buffer
|
|
||||||
* @fmt: <function>printf()</function>-style format string
|
|
||||||
* @...: arguments to format string
|
|
||||||
*
|
|
||||||
* Format the string and append to @buf.
|
|
||||||
*
|
|
||||||
* Returns: %FALSE on overflow, %TRUE otherwise.
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
vips_buf_appendf( VipsBuf *buf, const char *fmt, ... )
|
|
||||||
{
|
|
||||||
char str[MAX_STRSIZE];
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start( ap, fmt );
|
|
||||||
(void) vips_vsnprintf( str, MAX_STRSIZE, fmt, ap );
|
|
||||||
va_end( ap );
|
|
||||||
|
|
||||||
return( vips_buf_appends( buf, str ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vips_buf_vappendf:
|
* vips_buf_vappendf:
|
||||||
* @buf: the buffer
|
* @buf: the buffer
|
||||||
@ -435,11 +406,48 @@ vips_buf_appendf( VipsBuf *buf, const char *fmt, ... )
|
|||||||
gboolean
|
gboolean
|
||||||
vips_buf_vappendf( VipsBuf *buf, const char *fmt, va_list ap )
|
vips_buf_vappendf( VipsBuf *buf, const char *fmt, va_list ap )
|
||||||
{
|
{
|
||||||
char str[MAX_STRSIZE];
|
int avail;
|
||||||
|
char *p;
|
||||||
|
|
||||||
(void) vips_vsnprintf( str, MAX_STRSIZE, fmt, ap );
|
if( buf->full )
|
||||||
|
return( FALSE );
|
||||||
|
|
||||||
return( vips_buf_appends( buf, str ) );
|
avail = buf->mx - buf->i - 4;
|
||||||
|
p = buf->base + buf->i;
|
||||||
|
(void) vips_vsnprintf( p, avail, fmt, ap );
|
||||||
|
buf->i += strlen( p );
|
||||||
|
|
||||||
|
if( buf->i >= buf->mx - 4 ) {
|
||||||
|
buf->full = TRUE;
|
||||||
|
strcpy( buf->base + buf->mx - 4, "..." );
|
||||||
|
buf->i = buf->mx - 1;
|
||||||
|
return( FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vips_buf_appendf:
|
||||||
|
* @buf: the buffer
|
||||||
|
* @fmt: <function>printf()</function>-style format string
|
||||||
|
* @...: arguments to format string
|
||||||
|
*
|
||||||
|
* Format the string and append to @buf.
|
||||||
|
*
|
||||||
|
* Returns: %FALSE on overflow, %TRUE otherwise.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
vips_buf_appendf( VipsBuf *buf, const char *fmt, ... )
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
va_start( ap, fmt );
|
||||||
|
result = vips_buf_vappendf( buf, fmt, ap );
|
||||||
|
va_end( ap );
|
||||||
|
|
||||||
|
return( result );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user