mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-23 15:16:29 +00:00
Move out string operations to another file, and introduce a frontend to snprintf for various situations. This change is important for catching and eliminating sprintf overflows, which are as of now many times silently corrupting memory. Signed-off-by: Dan Farina <drfarina@acm.org> Signed-off-by: Peter van Hardenberg <pvh@heroku.com>
73 lines
1.1 KiB
C
73 lines
1.1 KiB
C
/*
|
|
* strutil.c
|
|
*
|
|
* Copyright (c) Heroku, 2010
|
|
*
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "strutil.h"
|
|
|
|
static int xvsnprintf(char *str, size_t size, const char *format, va_list ap);
|
|
|
|
|
|
static int
|
|
xvsnprintf(char *str, size_t size, const char *format, va_list ap)
|
|
{
|
|
int retval;
|
|
|
|
retval = vsnprintf(str, size, format, ap);
|
|
|
|
if (retval >= size)
|
|
{
|
|
fprintf(stderr, "Buffer not large enough to format entire string\n");
|
|
exit(255);
|
|
}
|
|
|
|
return retval;
|
|
}
|
|
|
|
|
|
int
|
|
xsnprintf(char *str, size_t size, const char *format, ...)
|
|
{
|
|
va_list arglist;
|
|
int retval;
|
|
|
|
va_start(arglist, format);
|
|
retval = xvsnprintf(str, size, format, arglist);
|
|
va_end(arglist);
|
|
|
|
return retval;
|
|
}
|
|
|
|
|
|
int
|
|
sqlquery_snprintf(char *str, const char *format, ...)
|
|
{
|
|
va_list arglist;
|
|
int retval;
|
|
|
|
va_start(arglist, format);
|
|
retval = xvsnprintf(str, QUERY_STR_LEN, format, arglist);
|
|
va_end(arglist);
|
|
|
|
return retval;
|
|
}
|
|
|
|
|
|
int maxlen_snprintf(char *str, const char *format, ...)
|
|
{
|
|
va_list arglist;
|
|
int retval;
|
|
|
|
va_start(arglist, format);
|
|
retval = xvsnprintf(str, MAXLEN, format, arglist);
|
|
va_end(arglist);
|
|
|
|
return retval;
|
|
}
|