Skip to content

fix gettimeofday() on alpha (see https://bugs.debian.org/890813)#147

Merged
wolfcw merged 1 commit intowolfcw:masterfrom
dkg:fixalpha
Feb 19, 2018
Merged

fix gettimeofday() on alpha (see https://bugs.debian.org/890813)#147
wolfcw merged 1 commit intowolfcw:masterfrom
dkg:fixalpha

Conversation

@dkg
Copy link
Copy Markdown
Collaborator

@dkg dkg commented Feb 19, 2018

In https://bugs.debian.org/890813, Michael Cree mcree@orcon.net.nz
reports:

The faketime package fails to work correctly on the Alpha
architecture. This failure of faketime to work correctly is the
reason for the mbedtls FTBFS, which uses faketime in its test
suite [1].

Consider the following test program (which I call "time-test"):

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>

int main(void)
{
struct timeval tv;

 for (int j=0; j<5; j++) {
     usleep(10000);
     gettimeofday(&tv, NULL);
     printf("s=%ld    us=%ld\n", tv.tv_sec, tv.tv_usec);
 }
 return 0;

}

When run it produces output like:

s=1519025990 us=838219
s=1519025990 us=848965
s=1519025990 us=859711
s=1519025990 us=870456
s=1519025990 us=881202

But when run as (with faketime built in its source directory):

LD_PRELOAD=faketime-0.9.7/src/libfaketime.so.1 FAKETIME="-1d" ./time-test

the output is:

s=2199023743604 us=0
s=2199023657204 us=0
s=2199023570804 us=0
s=2199023484404 us=0
s=2199023398004 us=0

which is definitely not correct.

The reason for the incorrect behaviour is that there are two
gettimeofday symbols in libc on Alpha and the dlsym() call to link
to the gettimeofday() is picking up the function with the wrong ABI.
I attach a patch to fix that. Faketime built with the attached
patch works correctly and with a fixed faketime the mbedtls source
package builds to completion on Alpha.

In https://bugs.debian.org/890813, Michael Cree <mcree@orcon.net.nz>
reports:

>  The faketime package fails to work correctly on the Alpha
>  architecture. This failure of faketime to work correctly is the
>  reason for the mbedtls FTBFS, which uses faketime in its test
>  suite [1].
>
>  Consider the following test program (which I call "time-test"):
>
>  #include <stdio.h>
>  #include <sys/time.h>
>  #include <unistd.h>
>
>  int main(void)
>  {
>      struct timeval tv;
>
>      for (int j=0; j<5; j++) {
>          usleep(10000);
>          gettimeofday(&tv, NULL);
>          printf("s=%ld    us=%ld\n", tv.tv_sec, tv.tv_usec);
>      }
>      return 0;
>  }
>
>  When run it produces output like:
>
>  s=1519025990    us=838219
>  s=1519025990    us=848965
>  s=1519025990    us=859711
>  s=1519025990    us=870456
>  s=1519025990    us=881202
>
>  But when run as (with faketime built in its source directory):
>
>  LD_PRELOAD=faketime-0.9.7/src/libfaketime.so.1 FAKETIME="-1d" ./time-test
>
>  the output is:
>
>  s=2199023743604    us=0
>  s=2199023657204    us=0
>  s=2199023570804    us=0
>  s=2199023484404    us=0
>  s=2199023398004    us=0
>
>  which is definitely not correct.
>
>  The reason for the incorrect behaviour is that there are two
>  gettimeofday symbols in libc on Alpha and the dlsym() call to link
>  to the gettimeofday() is picking up the function with the wrong ABI.
>  I attach a patch to fix that.  Faketime built with the attached
>  patch works correctly and with a fixed faketime the mbedtls source
>  package builds to completion on Alpha.
@wolfcw wolfcw merged commit 8c22d91 into wolfcw:master Feb 19, 2018
@dkg dkg deleted the fixalpha branch February 19, 2018 22:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants