diff --git a/ChangeLog b/ChangeLog index 26186d2cc7b03719740a869b88cbcb648acbd38b..25e8d05cec4901db9c07ba7d0421eab8f2295f62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,13 @@ -Thu Jan 21 19:04:12 GMT 2009 Daniel P. Berrange +Thu Jan 21 19:44:12 GMT 2009 Daniel P. Berrange + + Use the GNULIB random_r function + * Makefile.maint: print 4 lines of context when complaining + about prohibited POSIX apis + * src/libvirt.c: Initialize random number generator + * src/util.c, src/util.h: Generate API for random number gen + * src/uuid.: Use generic random number generator API + +Thu Jan 21 19:41:12 GMT 2009 Daniel P. Berrange Remove use of non-reentrant POSIX api calls * configure.in: Check for strtok_r getmntent_r getgrnam_r getpwuid_r diff --git a/Makefile.maint b/Makefile.maint index ee80fcf0f85ba6625a0fdb4157febd760197e489..43675f6582ec88bdc9fd1549ff02177d11a7c833 100644 --- a/Makefile.maint +++ b/Makefile.maint @@ -117,7 +117,7 @@ sc_prohibit_nonreentrant: @fail=0 ; \ for i in $(NON_REENTRANT) ; \ do \ - grep -nE "\<$$i\>[:space:]*\(" $$($(VC_LIST_EXCEPT)) && \ + grep --before 2 --after 1 -nE "\<$$i\>[:space:]*\(" $$($(VC_LIST_EXCEPT)) && \ fail=1 && echo "$(ME): use $${i}_r, not $${i}" || : ; \ done ; \ exit $$fail diff --git a/src/libvirt.c b/src/libvirt.c index 2bb46e4ba2a2ac6f3ec68d58b281e44ae8cd6c5e..95f33b4dd9947237146010e20b6062287b96b456 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -21,6 +21,7 @@ #ifdef HAVE_SYS_WAIT_H #include #endif +#include #include #include @@ -257,7 +258,8 @@ virInitialize(void) initialized = 1; if (virThreadInitialize() < 0 || - virErrorInitialize() < 0) + virErrorInitialize() < 0 || + virRandomInitialize(time(NULL) ^ getpid())) return -1; #ifdef ENABLE_DEBUG @@ -332,23 +334,19 @@ DllMain (HINSTANCE instance ATTRIBUTE_UNUSED, { switch (reason) { case DLL_PROCESS_ATTACH: - fprintf(stderr, "Initializing DLL\n"); virInitialize(); break; case DLL_THREAD_ATTACH: - fprintf(stderr, "Thread start\n"); /* Nothing todo in libvirt yet */ break; case DLL_THREAD_DETACH: - fprintf(stderr, "Thread exit\n"); /* Release per-thread local data */ virThreadOnExit(); break; case DLL_PROCESS_DETACH: - fprintf(stderr, "Process exit\n"); /* Don't bother releasing per-thread data since (hopefully) windows cleans up everything on process exit */ diff --git a/src/util.c b/src/util.c index e4524d9517722755f243edc96ae844da86024516..b51355918a1373b48361ade2982098657648fa7e 100644 --- a/src/util.c +++ b/src/util.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,7 @@ #include "buf.h" #include "util.h" #include "memory.h" +#include "threads.h" #ifndef NSIG # define NSIG 32 @@ -1285,9 +1287,9 @@ void virGenerateMacAddr(const unsigned char *prefix, addr[0] = prefix[0]; addr[1] = prefix[1]; addr[2] = prefix[2]; - addr[3] = (int)(256*(rand()/(RAND_MAX+1.0))); - addr[4] = (int)(256*(rand()/(RAND_MAX+1.0))); - addr[5] = (int)(256*(rand()/(RAND_MAX+1.0))); + addr[3] = virRandom(256); + addr[4] = virRandom(256); + addr[5] = virRandom(256); } @@ -1436,6 +1438,36 @@ int virKillProcess(pid_t pid, int sig) } +static char randomState[128]; +static struct random_data randomData; +static virMutex randomLock; + +int virRandomInitialize(unsigned int seed) +{ + if (virMutexInit(&randomLock) < 0) + return -1; + + if (initstate_r(seed, + randomState, + sizeof(randomState), + &randomData) < 0) + return -1; + + return 0; +} + +int virRandom(int max) +{ + int32_t ret; + + virMutexLock(&randomLock); + random_r(&randomData, &ret); + virMutexUnlock(&randomLock); + + return (int) ((double)max * ((double)ret / (double)RAND_MAX)); +} + + #ifdef HAVE_GETPWUID_R char *virGetUserDirectory(virConnectPtr conn, uid_t uid) diff --git a/src/util.h b/src/util.h index a94212e016fa8fead0299d4d117b00b50eef923b..e731ba49b451807017d7140983e5bf9771646149 100644 --- a/src/util.h +++ b/src/util.h @@ -177,4 +177,7 @@ char *virGetUserDirectory(virConnectPtr conn, uid_t uid); #endif +int virRandomInitialize(unsigned int seed); +int virRandom(int max); + #endif /* __VIR_UTIL_H__ */ diff --git a/src/uuid.c b/src/uuid.c index 95d4bbcb968124cf5e00ba12ab4c37cea45a2fef..9d263de4266cd7381f8b510b81ecef875c5e284b 100644 --- a/src/uuid.c +++ b/src/uuid.c @@ -35,6 +35,7 @@ #include "c-ctype.h" #include "internal.h" +#include "util.h" #define qemudLog(level, msg...) fprintf(stderr, msg) @@ -74,9 +75,8 @@ static int virUUIDGeneratePseudoRandomBytes(unsigned char *buf, int buflen) { - srand(time(NULL)); while (buflen > 0) { - *buf = (int) (255.0 * (rand() / (double) RAND_MAX)); + *buf = virRandom(256); buflen--; }