<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jun 24, 2013 at 10:03 PM, Ben Pfaff <span dir="ltr">&lt;<a href="mailto:blp@nicira.com" target="_blank">blp@nicira.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Mon, Jun 24, 2013 at 03:50:45PM -0700, Ansis Atteka wrote:<br>
&gt; On Wed, Jun 19, 2013 at 1:17 PM, Ben Pfaff &lt;<a href="mailto:blp@nicira.com">blp@nicira.com</a>&gt; wrote:<br>
&gt;<br>
&gt; &gt; Signed-off-by: Ben Pfaff &lt;<a href="mailto:blp@nicira.com">blp@nicira.com</a>&gt;<br>
&gt; &gt; ---<br>
&gt; &gt;  lib/random.c |   26 +++++++++++++++++---------<br>
&gt; &gt;  1 files changed, 17 insertions(+), 9 deletions(-)<br>
&gt; &gt;<br>
&gt; &gt; diff --git a/lib/random.c b/lib/random.c<br>
&gt; &gt; index 45d428c..2572c1e 100644<br>
&gt; &gt; --- a/lib/random.c<br>
&gt; &gt; +++ b/lib/random.c<br>
&gt; &gt; @@ -1,5 +1,5 @@<br>
&gt; &gt;  /*<br>
&gt; &gt; - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.<br>
&gt; &gt; + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.<br>
&gt; &gt;   *<br>
&gt; &gt;   * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
&gt; &gt;   * you may not use this file except in compliance with the License.<br>
&gt; &gt; @@ -22,6 +22,8 @@<br>
&gt; &gt;  #include &lt;sys/time.h&gt;<br>
&gt; &gt;<br>
&gt; &gt;  #include &quot;entropy.h&quot;<br>
&gt; &gt; +#include &quot;hash.h&quot;<br>
&gt; &gt; +#include &quot;ovs-thread.h&quot;<br>
&gt; &gt;  #include &quot;timeval.h&quot;<br>
&gt; &gt;  #include &quot;util.h&quot;<br>
&gt; &gt;<br>
&gt; &gt; @@ -37,21 +39,25 @@<br>
&gt; &gt;   * cryptographic-quality randomness. */<br>
&gt; &gt;<br>
&gt; &gt;  /* Current random state. */<br>
&gt; &gt; -static uint32_t seed;<br>
&gt; &gt; +DEFINE_PER_THREAD_DATA(uint32_t, seed, 0);<br>
&gt; &gt;<br>
&gt; &gt;  static uint32_t random_next(void);<br>
&gt; &gt;<br>
&gt; &gt;  void<br>
&gt; &gt;  random_init(void)<br>
&gt; &gt;  {<br>
&gt; &gt; -    while (!seed) {<br>
&gt; &gt;<br>
&gt; +    uint32_t *seedp = seed_get();<br>
&gt;<br>
&gt; +    while (!*seedp) {<br>
&gt; &gt;          struct timeval tv;<br>
&gt; &gt;          uint32_t entropy;<br>
&gt; &gt; +        pthread_t self;<br>
&gt; &gt;<br>
&gt; &gt;          xgettimeofday(&amp;tv);<br>
&gt; &gt;          get_entropy_or_die(&amp;entropy, 4);<br>
&gt; &gt;<br>
&gt; get_entropy() is not thread safe and that makes this function thread unsafe<br>
&gt; as well: get_entropy()-&gt;ovs_retval_to_string() uses &quot;static char<br>
&gt; unknown[48]&quot;.<br>
<br>
</div></div>The patch titled &quot;Replace all uses of strerror() by ovs_strerror(), for<br>
thread safety.&quot;  should make ovs_retval_to_string() thread-safe, so I<br>
believe that that is fixed earlier in the series.<br>
<br></blockquote><div>I think you are right, sorry!<br><br></div><div>Looks good to me.<br></div></div></div></div>