We really only allow 0x7fffffff maximum characters, so we now mask out

everything above (not even in an intelligent way).
Now accepts zero bufferSize and NULL buffer - although it should probably
not catch the latter...


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5408 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2003-11-18 04:12:29 +00:00
parent c29da59747
commit 545237514a
@@ -80,9 +80,9 @@ do_div(uint64 *_number, uint32 base)
static bool
put_padding(char **_buffer, size_t *_bytesLeft, int32 count)
put_padding(char **_buffer, int32 *_bytesLeft, int32 count)
{
int32 left = (int32)*_bytesLeft;
int32 left = *_bytesLeft;
char *string = *_buffer;
int32 written;
bool allWritten;
@@ -104,16 +104,16 @@ put_padding(char **_buffer, size_t *_bytesLeft, int32 count)
*string++ = ' ';
*_buffer = string;
*_bytesLeft = (size_t)(left - written);
*_bytesLeft = left - written;
return allWritten;
}
static inline bool
put_string(char **_buffer, size_t *_bytesLeft, const char *source, size_t length)
put_string(char **_buffer, int32 *_bytesLeft, const char *source, int32 length)
{
size_t left = *_bytesLeft;
int32 left = *_bytesLeft;
char *target = *_buffer;
bool allWritten;
@@ -145,9 +145,9 @@ put_string(char **_buffer, size_t *_bytesLeft, const char *source, size_t length
static inline bool
put_character(char **_buffer, size_t *_bytesLeft, char c)
put_character(char **_buffer, int32 *_bytesLeft, char c)
{
size_t left = *_bytesLeft;
int32 left = *_bytesLeft;
char *string = *_buffer;
if (left > 0) {
@@ -237,8 +237,9 @@ number(char *str, long long num, unsigned base, int size, int precision, int typ
int
vsnprintf(char *buffer, size_t bytesLeft, const char *format, va_list args)
vsnprintf(char *buffer, size_t bufferSize, const char *format, va_list args)
{
int32 bytesLeft;
uint64 num;
int base;
char *string;
@@ -248,8 +249,12 @@ vsnprintf(char *buffer, size_t bytesLeft, const char *format, va_list args)
/* min. # of digits for integers; max number of chars for from string */
int qualifier; /* 'h', 'l', or 'L' for integer fields */
bytesLeft--;
// make space for the terminating '\0' byte
if (buffer == NULL || bufferSize == 0)
return 0;
bytesLeft = ((int32)bufferSize - 1) & 0x7fffffff;
// make space for the terminating '\0' byte, and we
// only allow 2G characters :)
for (string = buffer; format[0] && bytesLeft > 0; format++) {
if (format[0] != '%') {