[SCM] Samba Shared Repository - branch v3-5-test updated
Jeremy Allison
jra at samba.org
Mon Oct 19 12:31:54 MDT 2009
The branch, v3-5-test has been updated
via 72ae449... util: fixed generate_unique_strs() to be portable
from 1a300b7... s4:test: Fix typo.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test
- Log -----------------------------------------------------------------
commit 72ae44918a6c8e0a11747441f2bbd5152022f98c
Author: Andrew Tridgell <tridge at samba.org>
Date: Mon Oct 19 22:47:45 2009 +1100
util: fixed generate_unique_strs() to be portable
'place' was going negative, and giving undefined results. The result
was duplicate names which gave errors in SMB2-DIR on PPC and other
systems.
-----------------------------------------------------------------------
Summary of changes:
lib/util/genrand.c | 44 +++++++++++++-------------------------------
1 files changed, 13 insertions(+), 31 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/util/genrand.c b/lib/util/genrand.c
index 8c7d88a..6002c06 100644
--- a/lib/util/genrand.c
+++ b/lib/util/genrand.c
@@ -362,24 +362,6 @@ again:
}
/**
- * Define our own pow() function to avoid linking in libm
- */
-static double s_pow(double x, double y)
-{
- int i;
- double ret = x;
-
- if (y == 0)
- return 1;
-
- for (i = 1; i < y; i++)
- ret *= x;
-
- return ret;
-}
-
-
-/**
* Generate an array of unique text strings all of the same length.
* The returned string will be allocated.
* Returns NULL if the number of unique combinations cannot be created.
@@ -390,30 +372,30 @@ _PUBLIC_ char** generate_unique_strs(TALLOC_CTX *mem_ctx, size_t len,
uint32_t num)
{
const char *c_list = "abcdefghijklmnopqrstuvwxyz0123456789+_-#.,";
- const int c_size = 42;
- int i, j, rem;
+ const unsigned c_size = 42;
+ int i, j;
+ unsigned rem;
long long place;
char ** strs = NULL;
if (num == 0 || len == 0)
return NULL;
- /* We'll never return more than UINT32_MAX strings. Since 42^6 is more
- * than UINT32_MAX, we only have to check if we've been asked to return
- * more than the total number of permutations for lengths less than 6.*/
- if ((len < 6) && (num > s_pow(c_size, len)))
- return NULL;
-
strs = talloc_array(mem_ctx, char *, num);
+ if (strs == NULL) return NULL;
for (i = 0; i < num; i++) {
- char *retstr = (char *)talloc_zero_size(mem_ctx, len + 1);
+ char *retstr = (char *)talloc_size(strs, len + 1);
+ if (retstr == NULL) {
+ talloc_free(strs);
+ return NULL;
+ }
rem = i;
- for (j = len - 1; j >= 0; j--) {
- place = s_pow(c_size, j);
- retstr[j] = c_list[rem / place];
- rem = rem % place;
+ for (j = 0; j < len; j++) {
+ retstr[j] = c_list[rem % c_size];
+ rem = rem / c_size;
}
+ retstr[j] = 0;
strs[i] = retstr;
}
--
Samba Shared Repository
More information about the samba-cvs
mailing list