diff -r 7a0f1bf86516 tools/xenstore/hashtable.c --- a/tools/xenstore/hashtable.c Tue Jun 10 09:27:01 2008 +0100 +++ b/tools/xenstore/hashtable.c Tue Jun 10 11:51:05 2008 +0200 @@ -33,17 +33,22 @@ create_hashtable(unsigned int minsize, { struct hashtable *h; unsigned int pindex, size = primes[0]; + /* Check requested hashtable isn't too large */ if (minsize > (1u << 30)) return NULL; + /* Enforce size as prime */ for (pindex=0; pindex < prime_table_length; pindex++) { if (primes[pindex] > minsize) { size = primes[pindex]; break; } } - h = (struct hashtable *)malloc(sizeof(struct hashtable)); - if (NULL == h) return NULL; /*oom*/ - h->table = (struct entry **)malloc(sizeof(struct entry*) * size); - if (NULL == h->table) { free(h); return NULL; } /*oom*/ - memset(h->table, 0, size * sizeof(struct entry *)); + + h = (struct hashtable *)calloc(1, sizeof(struct hashtable)); + if (NULL == h) + goto err0; + h->table = (struct entry **)calloc(size, sizeof(struct entry *)); + if (NULL == h->table) + goto err1; + h->tablelength = size; h->primeindex = pindex; h->entrycount = 0; @@ -51,6 +56,11 @@ create_hashtable(unsigned int minsize, h->eqfn = eqf; h->loadlimit = (unsigned int)(((uint64_t)size * max_load_factor) / 100); return h; + +err0: + free(h); +err1: + return NULL; } /*****************************************************************************/ @@ -80,10 +90,9 @@ hashtable_expand(struct hashtable *h) if (h->primeindex == (prime_table_length - 1)) return 0; newsize = primes[++(h->primeindex)]; - newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize); + newtable = (struct entry **)calloc(newsize, sizeof(struct entry*)); if (NULL != newtable) { - memset(newtable, 0, newsize * sizeof(struct entry *)); /* This algorithm is not 'stable'. ie. it reverses the list * when it transfers entries between the tables */ for (i = 0; i < h->tablelength; i++) { @@ -149,7 +158,7 @@ hashtable_insert(struct hashtable *h, vo * element may be ok. Next time we insert, we'll try expanding again.*/ hashtable_expand(h); } - e = (struct entry *)malloc(sizeof(struct entry)); + e = (struct entry *)calloc(1, sizeof(struct entry)); if (NULL == e) { --(h->entrycount); return 0; } /*oom*/ e->h = hash(h,k); index = indexFor(h->tablelength,e->h); diff -r 7a0f1bf86516 tools/xenstore/list.h --- a/tools/xenstore/list.h Tue Jun 10 09:27:01 2008 +0100 +++ b/tools/xenstore/list.h Tue Jun 10 11:51:05 2008 +0200 @@ -2,6 +2,10 @@ #define _LINUX_LIST_H /* Taken from Linux kernel code, but de-kernelized for userspace. */ #include + +#undef LIST_HEAD_INIT +#undef LIST_HEAD +#undef INIT_LIST_HEAD /* * These are non-NULL pointers that will result in page faults