summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-08-21 17:58:41 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:38:44 -0500
commit8d0d3a864b93766415f93d3dcabf9f61e6b1ccad (patch)
tree15f296275cc828220bb8a7a7f2353c5af415b164
parent0ff47065829abc1478353cae367a5340561f7bd5 (diff)
downloadsamba-8d0d3a864b93766415f93d3dcabf9f61e6b1ccad.tar.gz
samba-8d0d3a864b93766415f93d3dcabf9f61e6b1ccad.tar.bz2
samba-8d0d3a864b93766415f93d3dcabf9f61e6b1ccad.zip
r17667: Merge snprintf fixes from tridge (Samba4).
Jeremy. ---------- several replacement snprintf() fixes. 1) when running the testsuite, actually test against the system sprintf(), not against ourselves (doh!) 2) fix the buffer termination to terminate buf2 as well 3) fix handling of %llu, and add a simple test This fixes a bug with password expiry on solaris ---------- (This used to be commit 64fd96666f391101c41b7a564fd20ab2e93e3923)
-rw-r--r--source3/lib/snprintf.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/source3/lib/snprintf.c b/source3/lib/snprintf.c
index 5d89aa841f..8e1a463b77 100644
--- a/source3/lib/snprintf.c
+++ b/source3/lib/snprintf.c
@@ -247,7 +247,7 @@ static size_t dopr(char *buffer, size_t maxlen, const char *format,
static void fmtstr(char *buffer, size_t *currlen, size_t maxlen,
char *value, int flags, int min, int max);
static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
- long value, int base, int min, int max, int flags);
+ LLONG value, int base, int min, int max, int flags);
static void fmtfp(char *buffer, size_t *currlen, size_t maxlen,
LDOUBLE fvalue, int min, int max, int flags);
static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c);
@@ -799,10 +799,10 @@ static void fmtstr(char *buffer, size_t *currlen, size_t maxlen,
/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */
static void fmtint(char *buffer, size_t *currlen, size_t maxlen,
- long value, int base, int min, int max, int flags)
+ LLONG value, int base, int min, int max, int flags)
{
int signvalue = 0;
- unsigned long uvalue;
+ unsigned LLONG uvalue;
char convert[20];
int place = 0;
int spadlen = 0; /* amount to space pad */
@@ -920,7 +920,7 @@ static LLONG ROUND(LDOUBLE value)
static double my_modf(double x0, double *iptr)
{
int i;
- long l;
+ LLONG l;
double x = x0;
double f = 1.0;
@@ -1114,7 +1114,7 @@ static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c)
static struct pr_chunk *new_chunk(void) {
struct pr_chunk *new_c = (struct pr_chunk *)malloc(sizeof(struct pr_chunk));
- if ( !new_c )
+ if (!new_c)
return NULL;
new_c->type = 0;
@@ -1301,7 +1301,7 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
"%d",
NULL
};
- long int_nums[] = { -1, 134, 91340, 341, 0203, 0, 1234567890};
+ long int_nums[] = { -1, 134, 91340, 341, 0203, 1234567890, 0};
char *str_fmt[] = {
"%10.5s",
"%-10.5s",
@@ -1318,6 +1318,13 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
NULL
};
char *str_vals[] = {"hello", "a", "", "a longer string", NULL};
+#ifdef HAVE_LONG_LONG
+ char *ll_fmt[] = {
+ "%llu",
+ NULL
+ };
+ LLONG ll_nums[] = { 134, 91340, 341, 0203, 1234567890, 128006186140000000LL, 0};
+#endif
int x, y;
int fail = 0;
int num = 0;
@@ -1329,9 +1336,9 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
for (y = 0; fp_nums[y] != 0 ; y++) {
buf1[0] = buf2[0] = '\0';
l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]);
- l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]);
+ l2 = sprintf(buf1, fp_fmt[x], fp_nums[y]);
sprintf (buf2, fp_fmt[x], fp_nums[y]);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp (buf1, buf2) || (l1 != l2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
fp_fmt[x], l1, buf1, l2, buf2);
@@ -1345,9 +1352,9 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
for (y = 0; int_nums[y] != 0 ; y++) {
buf1[0] = buf2[0] = '\0';
l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]);
- l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]);
+ l2 = sprintf(buf1, int_fmt[x], int_nums[y]);
sprintf (buf2, int_fmt[x], int_nums[y]);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp (buf1, buf2) || (l1 != l2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
int_fmt[x], l1, buf1, l2, buf2);
@@ -1361,9 +1368,9 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
for (y = 0; str_vals[y] != 0 ; y++) {
buf1[0] = buf2[0] = '\0';
l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]);
- l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]);
+ l2 = sprintf(buf1, str_fmt[x], str_vals[y]);
sprintf (buf2, str_fmt[x], str_vals[y]);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp (buf1, buf2) || (l1 != l2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
str_fmt[x], l1, buf1, l2, buf2);
@@ -1373,6 +1380,24 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
}
}
+#ifdef HAVE_LONG_LONG
+ for (x = 0; ll_fmt[x] ; x++) {
+ for (y = 0; ll_nums[y] != 0 ; y++) {
+ buf1[0] = buf2[0] = '\0';
+ l1 = snprintf(NULL, 0, ll_fmt[x], ll_nums[y]);
+ l2 = sprintf(buf1, ll_fmt[x], ll_nums[y]);
+ sprintf (buf2, ll_fmt[x], ll_nums[y]);
+ buf1[1023] = buf2[1023] = '\0';
+ if (strcmp (buf1, buf2) || (l1 != l2)) {
+ printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
+ ll_fmt[x], l1, buf1, l2, buf2);
+ fail++;
+ }
+ num++;
+ }
+ }
+#endif
+
#define BUFSZ 2048
buf1[0] = buf2[0] = '\0';
@@ -1392,7 +1417,7 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
buf1[0] = buf2[0] = '\0';
l1 = snprintf(buf1, sizeof(buf1), "%4$*1$d %2$s %3$*1$.*1$f", 3, "pos test", 12.3456, 9);
l2 = sprintf(buf2, "%4$*1$d %2$s %3$*1$.*1$f", 3, "pos test", 12.3456, 9);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp(buf1, buf2) || (l1 != l2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
"%4$*1$d %2$s %3$*1$.*1$f", l1, buf1, l2, buf2);
@@ -1402,7 +1427,7 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
buf1[0] = buf2[0] = '\0';
l1 = snprintf(buf1, sizeof(buf1), "%4$*4$d %2$s %3$*4$.*4$f", 3, "pos test", 12.3456, 9);
l2 = sprintf(buf2, "%4$*4$d %2$s %3$*4$.*4$f", 3, "pos test", 12.3456, 9);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp(buf1, buf2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
"%4$*1$d %2$s %3$*1$.*1$f", l1, buf1, l2, buf2);
@@ -1412,7 +1437,7 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
buf1[0] = buf2[0] = '\0';
l1 = snprintf(buf1, sizeof(buf1), "%lld", (LLONG)1234567890);
l2 = sprintf(buf2, "%lld", (LLONG)1234567890);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp(buf1, buf2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
"%lld", l1, buf1, l2, buf2);
@@ -1422,7 +1447,7 @@ int smb_snprintf(char *str,size_t count,const char *fmt,...)
buf1[0] = buf2[0] = '\0';
l1 = snprintf(buf1, sizeof(buf1), "%Lf", (LDOUBLE)890.1234567890123);
l2 = sprintf(buf2, "%Lf", (LDOUBLE)890.1234567890123);
- buf1[1023] = buf1[1023] = '\0';
+ buf1[1023] = buf2[1023] = '\0';
if (strcmp(buf1, buf2)) {
printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n",
"%Lf", l1, buf1, l2, buf2);