Skip to content

Commit

Permalink
acinclude: Always assume buggy strtok_r() for glibc < 2.8.
Browse files Browse the repository at this point in the history
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 <alexw@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Alex Wang <alexw@nicira.com>
  • Loading branch information
blp committed Apr 4, 2015
1 parent 81a82ca commit cbcd960
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions 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.
Expand Down Expand Up @@ -392,14 +392,21 @@ AC_DEFUN([OVS_CHECK_STRTOK_R],
[AC_LANG_PROGRAM([#include <stdio.h>
#include <string.h>
],
[[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);
token2 = strtok_r(NULL, ":", &save_ptr);
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],
Expand Down

0 comments on commit cbcd960

Please sign in to comment.