Index: easy.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/easy.c,v
retrieving revision 1.142
diff -u -r1.142 easy.c
--- easy.c	12 Jun 2009 02:41:16 -0000	1.142
+++ easy.c	12 Jun 2009 16:15:06 -0000
@@ -85,6 +85,7 @@
 #include "http_ntlm.h"
 #include "connect.h" /* for Curl_getconnectinfo */
 #include "slist.h"
+#include "formdata.h"   /* For Curl_srand(). */
 
 #define _MPRINTF_REPLACE /* use our functions only */
 #include <curl/mprintf.h>
@@ -289,6 +290,10 @@
 
   init_flags  = flags;
 
+  /* Preset pseudo-random number sequence. */
+
+  Curl_srand();
+
   return CURLE_OK;
 }
 
Index: formdata.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/formdata.c,v
retrieving revision 1.118
diff -u -r1.118 formdata.c
--- formdata.c	9 Jun 2009 00:49:34 -0000	1.118
+++ formdata.c	12 Jun 2009 17:01:37 -0000
@@ -108,6 +108,12 @@
 /* Length of the random boundary string. */
 #define BOUNDARY_LENGTH 40
 
+/* Private pseudo-random number seed. Unsigned integer >= 32bit. Threads
+   mutual exclusion is not implemented to acess it since we do not require
+   high quality random numbers (only used in form boudary generation). */
+
+static unsigned int     randseed;
+
 #if !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY)
 
 #include <stdio.h>
@@ -1597,6 +1603,8 @@
   (void) argc;
   (void) argv;
 
+  Curl_srand();         /* Because we do not call curl_global_init() here. */
+
   if(FormAddTest("simple COPYCONTENTS test", &httppost, &last_post,
                   CURLFORM_COPYNAME, name1, CURLFORM_COPYCONTENTS, value1,
                   CURLFORM_END))
@@ -1733,8 +1741,6 @@
 char *Curl_FormBoundary(void)
 {
   char *retstring;
-  static int randomizer;   /* this is just so that two boundaries within
-                              the same form won't be identical */
   size_t i;
 
   static const char table16[]="0123456789abcdef";
@@ -1744,12 +1750,10 @@
   if(!retstring)
     return NULL; /* failed */
 
-  srand((unsigned int)time(NULL)+randomizer++); /* seed */
-
   strcpy(retstring, "----------------------------");
 
   for(i=strlen(retstring); i<BOUNDARY_LENGTH; i++)
-    retstring[i] = table16[rand()%16];
+    retstring[i] = table16[Curl_rand()%16];
 
   /* 28 dashes and 12 hexadecimal digits makes 12^16 (184884258895036416)
      combinations */
@@ -1759,3 +1763,24 @@
 }
 
 #endif  /* !defined(CURL_DISABLE_HTTP) || defined(USE_SSLEAY) */
+
+/* Pseudo-random number support. This is always enabled, since called from
+   curl_global_init(). */
+
+unsigned int Curl_rand(void)
+{
+  unsigned int r;
+  /* Return an unsigned 32-bit pseudo-random number. */
+  r = randseed = randseed * 1103515245 + 12345;
+  return (r << 16) | ((r >> 16) & 0xFFFF);
+}
+
+void Curl_srand(void)
+{
+  /* Randomize pseudo-random number sequence. */
+
+  randseed = (unsigned int) time(NULL);
+  Curl_rand();
+  Curl_rand();
+  Curl_rand();
+}
Index: formdata.h
===================================================================
RCS file: /cvsroot/curl/curl/lib/formdata.h,v
retrieving revision 1.27
diff -u -r1.27 formdata.h
--- formdata.h	31 Mar 2008 10:02:25 -0000	1.27
+++ formdata.h	12 Jun 2009 16:14:13 -0000
@@ -97,5 +97,8 @@
 
 CURLcode Curl_formconvert(struct SessionHandle *, struct FormData *);
 
+void Curl_srand(void);
+unsigned int Curl_rand(void);
+
 #endif
 

