<div dir="ltr"><div><div>For the record, the following patch identically triggers the faults on my x86_64 Arch installation (where time_t normally is a quad word).<br><br></div>Subject: [PATCH] test-squeue: trigger y2038 bug<br>
<br>Signed-off-by: Anton Lofgren <<a href="mailto:alofgren@op5.com">alofgren@op5.com</a>><br>---<br> lib/test-squeue.c | 3 ++-<br> 1 file changed, 2 insertions(+), 1 deletion(-)<br><br>diff --git a/lib/test-squeue.c b/lib/test-squeue.c<br>
index 556952d..faf0b5d 100644<br>--- a/lib/test-squeue.c<br>+++ b/lib/test-squeue.c<br>@@ -11,6 +11,7 @@<br> #include <sys/time.h><br> #include "squeue.c"<br> #include "t-utils.h"<br>+#include <stdint.h><br>
 <br> static void squeue_foreach(squeue_t *q, int (*walker)(squeue_event *, void *), void *arg)<br> {<br>@@ -116,7 +117,7 @@ int main(int argc, char **argv)<br>        sq_test_random(sq);<br>        t(squeue_size(sq) == 0, "Size should be 0 after first sq_test_random");<br>
 <br>-       t((a.evt = squeue_add(sq, time(NULL) + 9, &a)) != NULL);<br>+       t((a.evt = squeue_add(sq, (int32_t)(time(NULL) * 2), &a)) != NULL);<br>        t(squeue_size(sq) == 1);<br>        t((b.evt = squeue_add(sq, time(NULL) + 3, &b)) != NULL);<br>
        t(squeue_size(sq) == 2);<br>-- <br>1.8.2<br><br><br><br><br>test-squeue:<br>### squeue tests<br>  FAIL max <= *d @test-squeue.c:87<br>  FAIL x == &b @test-squeue.c:134<br>  FAIL x->id == <a href="http://b.id">b.id</a> @test-squeue.c:135<br>
  FAIL x == &c @test-squeue.c:142<br>about to fail pretty fucking hard...<br>ea: 0x7fffe6dd1e50; &b: 0x7fffe6dd1e60; &c: 0x7fffe6dd1e70; ed: 0x7fffe6dd1e80; x: 0x7fffe6d83de0<br>  FAIL x == &b @test-squeue.c:153<br>
  FAIL x->id == <a href="http://b.id">b.id</a> @test-squeue.c:154<br>  FAIL x == &b @test-squeue.c:161<br>  FAIL x->id == <a href="http://b.id">b.id</a> @test-squeue.c:162<br>  FAIL x == &c @test-squeue.c:167<br>
  FAIL x->id == <a href="http://c.id">c.id</a> @test-squeue.c:168<br>Test results: 390637 passed, 10 failed<br>make[1]: *** [test] Error 1<br><br><br></div>/Anton<br><div><br><div class="gmail_extra"><div class="gmail_quote">
On Thu, Apr 4, 2013 at 11:55 PM, Andreas Ericsson <span dir="ltr"><<a href="mailto:ae@op5.se" target="_blank">ae@op5.se</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 04/04/2013 06:32 PM, Ton Voon wrote:<br>
> Hi!<br>
><br>
> We've come across a problem in an upgrade of Nagios 3 to Nagios 4 which we can't work out where the fix is. It occurs when an event is scheduled in the future beyond 2038.<br>
><br>
<br>
</div>Why on earth would you want to schedule something to end beyond 2038?<br>
It sounds like you're using a patch on a workaround for something that<br>
was the wrong solution in the first place.<br>
<div class="im"><br>
> Recreation steps:<br>
>    * Set a downtime on a service to end next day<br>
>    * Stop Nagios<br>
>    * Edit the retention.dat so that the end_date=4514791088 (some other values seem to work)<br>
>    * Start Nagios<br>
><br>
> When Nagios starts, it will not run any scheduled events in the events queue.<br>
><br>
<br>
</div>Ouch. That's pretty bad.<br>
<div><div class="h5"><br>
> This fails on CentOS 5 64bit, though appears to work on Debian Squeeze 32bit, so it maybe a 64 bit only issue.<br>
><br>
> We think this is an issue when the event is scheduled via squeue_add(). We've managed to get the test-squeue to fail by changing the time value to be greater than 2038 with the following:<br>
><br>
> Index: test-squeue.c<br>
> ===================================================================<br>
> --- test-squeue.c     (revision 2716)<br>
> +++ test-squeue.c     (working copy)<br>
> @@ -116,7 +116,7 @@<br>
>       sq_test_random(sq);<br>
>       t(squeue_size(sq) == 0, "Size should be 0 after first sq_test_random");<br>
><br>
> -     t((a.evt = squeue_add(sq, time(NULL) + 9, &a)) != NULL);<br>
> +     t((a.evt = squeue_add(sq, time(NULL)*2, &a)) != NULL);<br>
>       t(squeue_size(sq) == 1);<br>
>       t((b.evt = squeue_add(sq, time(NULL) + 3, &b)) != NULL);<br>
>       t(squeue_size(sq) == 2);<br>
><br>
> This gives the test result of:<br>
><br>
> ### squeue tests<br>
>    FAIL max <= *d @test-squeue.c:86<br>
>    FAIL x == &b @test-squeue.c:133<br>
>    FAIL x->id == <a href="http://b.id" target="_blank">b.id</a> @test-squeue.c:134<br>
>    FAIL x == &c @test-squeue.c:141<br>
> about to fail pretty fucking hard...<br>
> ea: 0xbfe065e0; &b: 0xbfe065d8; &c: 0xbfe065d0; ed: 0xbfe065c8; x: 0xbfde9b80<br>
>    FAIL x == &b @test-squeue.c:152<br>
>    FAIL x->id == <a href="http://b.id" target="_blank">b.id</a> @test-squeue.c:153<br>
>    FAIL x == &b @test-squeue.c:160<br>
>    FAIL x->id == <a href="http://b.id" target="_blank">b.id</a> @test-squeue.c:161<br>
>    FAIL x == &c @test-squeue.c:166<br>
>    FAIL x->id == <a href="http://c.id" target="_blank">c.id</a> @test-squeue.c:167<br>
> Test results: 390637 passed, 10 failed<br>
><br>
> Changing to a factor of 1.1 instead of 2 passes:<br>
><br>
<br>
</div></div>I'm not surprised. 1.1 would mean it's still within the unix timeframe.<br>
<br>
What's the size of time_t, long and struct timeval on systems where it<br>
fails?<br>
What's the sizes on systems where it succeeds?<br>
Does time_t differ in signedness on them?<br>
<br>
I think a runtime check based on those sizes should work just fine, and<br>
also be optimized away so we don't actually have to pay for it, but I'm<br>
curious to see where it actually goes wrong. If it's before we get to<br>
see the number in squeue.c we're pretty much fscked, as the only option<br>
then is a macro which does voodoo-casting so the squeue api sees the<br>
right number.<br>
<div class="im"><br>
> ### squeue tests<br>
> Test results: 390647 passed, 0 failed<br>
><br>
> This worked in Nagios 3, so we're guessing that the change to use the squeue library for events is probably where this limitation has come in.<br>
><br>
> Any thoughts?<br>
><br>
<br>
</div>Well, modifying the evt_compute_pri() algorithm to discard<br>
everything but the 21 least significant bits of the tv->tv_usec<br>
would allow us to use 43 bits for the seconds value. That would<br>
land us somewhere in the year 141234 before we run out of seconds.<br>
It's not a real fix though, since we could live with discarding<br>
events that are patently absurd, but blocking the entire scheduler<br>
because we get a bogus date is just plain wrong.<br>
<br>
Besides, with 43 bits for the seconds we could still get too<br>
large a number for us to handle and we'd still be back at square 1.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Andreas Ericsson                   <a href="mailto:andreas.ericsson@op5.se">andreas.ericsson@op5.se</a><br>
OP5 AB                             <a href="http://www.op5.se" target="_blank">www.op5.se</a><br>
Tel: <a href="tel:%2B46%208-230225" value="+468230225">+46 8-230225</a>                  Fax: <a href="tel:%2B46%208-230231" value="+468230231">+46 8-230231</a><br>
<br>
Considering the successes of the wars on alcohol, poverty, drugs and<br>
terror, I think we should give some serious thought to declaring war<br>
on peace.<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
------------------------------------------------------------------------------<br>
Minimize network downtime and maximize team effectiveness.<br>
Reduce network management and security costs.Learn how to hire<br>
the most talented Cisco Certified professionals. Visit the<br>
Employer Resources Portal<br>
<a href="http://www.cisco.com/web/learning/employer_resources/index.html" target="_blank">http://www.cisco.com/web/learning/employer_resources/index.html</a><br>
_______________________________________________<br>
Nagios-devel mailing list<br>
<a href="mailto:Nagios-devel@lists.sourceforge.net">Nagios-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/nagios-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/nagios-devel</a><br>
</div></div></blockquote></div><br></div></div></div>