From: Ben Pfaff Date: Fri, 3 Apr 2015 22:10:57 +0000 (-0700) Subject: acinclude: Always assume buggy strtok_r() for glibc < 2.8. X-Git-Tag: v2.3.2~19 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=cbcd9601894007db68d4df20c2a1fbd6421f8c38 acinclude: Always assume buggy strtok_r() for glibc < 2.8. Lately our internal build system has been seeing intermittent failures that I can't explain. With old glibc versions, the "configure" time check will pass, but the equivalent (almost identical) "make check" test will fail. One possibility, I guess, is that occasionally address space randomization will put valid data at the 0xc0ffee address that the test assumes will segfault, and another is that some change in compiler optimization flags is making a difference. At any rate, I think it's safe to just always assume that this strtok_r() bug is present whenever glibc before 2.8 is in use. Specifically we've seen this happen intermittently when building against the XenServer DDK 5.6.100 build 39265, which uses glibc 2.5. Reported-by: Alex Wang Signed-off-by: Ben Pfaff Acked-by: Alex Wang --- diff --git a/acinclude.m4 b/acinclude.m4 index 8d10360ca..ee13e0e7d 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,6 +1,6 @@ # -*- autoconf -*- -# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. +# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -392,7 +392,13 @@ AC_DEFUN([OVS_CHECK_STRTOK_R], [AC_LANG_PROGRAM([#include #include ], - [[char string[] = ":::"; + [[#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 + /* Assume bug is present, because relatively minor + changes in compiler settings (e.g. optimization + level) can make it crop up. */ + return 1; + #else + char string[] = ":::"; char *save_ptr = (char *) 0xc0ffee; char *token1, *token2; token1 = strtok_r(string, ":", &save_ptr); @@ -400,6 +406,7 @@ AC_DEFUN([OVS_CHECK_STRTOK_R], freopen ("/dev/null", "w", stdout); printf ("%s %s\n", token1, token2); return 0; + #endif ]])], [ovs_cv_strtok_r_bug=no], [ovs_cv_strtok_r_bug=yes],