<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type"
 content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#ffffff" text="#000000">
Hi,<br>
<br>
As requested by LetoTo I have forwarded my IRC message to email.<br>
<br>
<br>
I came across a bug in Openswan.&nbsp; The box starts up.&nbsp; Openswan
connects.&nbsp; The date is set back to 1970, NTPD is started and sets the
date to be 2011.<br>
<br>
After this, the command "ipsec auto --status" blocks indefinitely.<br>
<br>
Analysis (based on 2.4 and verified in 2.6) is that in
timer.c:next_event(), the expression <b>evlist-&gt;ev_time - now()</b>
is negative (ev_time is 40 years ago).&nbsp; Hence next_event() returns 0,
causing the event to be triggered.<br>
<br>
But when handle_timer_event() is called, the expression <b>now() &lt;
ev-&gt;ev_time</b> evaluates to TRUE (due to long wrapping???), meaning
that the event is not removed from the event list.<br>
<br>
Looking at <i>server.c</i>, the code becomes stuck in the loop ... <span
 style="color: rgb(0, 0, 0);">in <i>call_server()</i> &nbsp;next_event()
returns 0. &nbsp;This then sets ndes to 0 (and osw_select() is NOT called).</span><span
 style="color: rgb(0, 0, 0);">&nbsp; But when handle_timer_event() is
called, the function believes that there are no events to handle, so
the event queue does not change. &nbsp;So when call_server() loops it calls
next_event() which returns 0 again.<br>
<br>
</span>
<p style="margin: 0px; text-indent: 0px;"><!--EndFragment--></p>
This blocks the thread from calling the select() function to handle all
the file descriptors. Hence <b>ipsec auto --status</b> never gets a
reply to its request, and will block forever.&nbsp; Likewise, all
communications into Openswan never gets a reply.<br>
<br>
A proposed solution (that I have tested successfully in version 2.4) is
to change now() to use the systems uptime instead.&nbsp; This solution also
has the benefit that timing jitter is not introduced by people setting
the time on a device or programs such as ntpd.<br>
<br>
Let me know if you have any questions.<br>
<br>
<br>
Thanks,<br>
Antony.<br>
<br>
<br>
<b>Proposed diff ...<br>
</b><br>
diff --git a/lib/libopenswan/oswtime.c b/lib/libopenswan/oswtime.c<br>
index 6440258..7e17529 100644<br>
--- a/lib/libopenswan/oswtime.c<br>
+++ b/lib/libopenswan/oswtime.c<br>
@@ -22,6 +22,7
@@&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>
&nbsp;#include &lt;unistd.h&gt;<br>
&nbsp;#include &lt;netinet/in.h&gt;<br>
&nbsp;#include &lt;arpa/inet.h&gt;<br>
+#include &lt;sys/sysinfo.h&gt;<br>
&nbsp;<br>
&nbsp;#include &lt;openswan.h&gt;<br>
&nbsp;<br>
@@ -34,18 +35,18 @@<br>
&nbsp;time_t<br>
&nbsp;now(void)<br>
&nbsp;{<br>
-&nbsp;&nbsp;&nbsp; static time_t delta = 0<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , last_time = 0;<br>
-&nbsp;&nbsp;&nbsp; time_t n = time(NULL);<br>
+&nbsp; /*<br>
+&nbsp;&nbsp; * Use uptime as it cannot jump unexpentantly,<br>
+&nbsp;&nbsp; * for example, when the time is changed forwards or backwards.<br>
+&nbsp;&nbsp; */<br>
+&nbsp;&nbsp;&nbsp; struct sysinfo info;<br>
&nbsp;<br>
-&nbsp;&nbsp;&nbsp; passert(n != (time_t)-1);<br>
-&nbsp;&nbsp;&nbsp; if (last_time &gt; n)<br>
+&nbsp;&nbsp;&nbsp; if (sysinfo(&amp;info) == 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp; {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; openswan_log("time moved backwards %ld seconds",
(long)(last_time - n));<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delta += last_time - n;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (time_t)info.uptime;<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>
-&nbsp;&nbsp;&nbsp; last_time = n;<br>
-&nbsp;&nbsp;&nbsp; return n + delta;<br>
+&nbsp;&nbsp;&nbsp; passert(0);<br>
+&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;}<br>
&nbsp;<br>
&nbsp;/* Names of the months */<br>
<br>
<br>
</body>
</html>