[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#4467) snprintf is consistenly used wrongly



Pierangelo Masarati writes:
> In many cases, especially when used to compute the length of a berval,
> snprintf is used under the assumption the buffer is large enough to
> contain the formatted output, based on the knowledge of the value that
> is about to be printed.  For example, when used to format integers,
> the buffer is usually created as
>
> char buf[] = "18446744073709551615UL";
>
> which is the string representation of ULONG_MAX, or anything like that.

Ah, so that's what these weird string constants are for.  That's wrong
too - whether or not that's big enough for ULONG_MAX depends on the
width of unsigned long.

We can use something like this.
Not sure if ldap_pvt or some other file is the best place for the macro:

ldap_pvt.h:

#include <limits.h>

/* Buffer space for sign, decimal digits and \0. Note: log10(2) < 146/485. */
#define LDAP_PVT_INTTYPE_CHARS(type) (((sizeof(type)*CHAR_BIT-1)*146)/485 + 3)

(Did I post that before?  Or was that to some other project?)

whatever.c:

  char buf[LDAP_PVT_INTTYPE_CHARS(unsigned long)];

Also, I think any remaining 'char buf[] = "unused text"; code should
be changed to
  char buf[sizeof("whatever")];
so that one can tell from reading the code that the initial contents
is irrelevant.  (As long as it's irrelevant even at failure :-)
I've been staring at some of that code and wondered WTF was going on.

-- 
Hallvard