mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-03 02:11:08 +00:00
27f10a0963
As noted in bug 13888, and as I noted previously in <https://sourceware.org/ml/libc-alpha/2000-10/msg00111.html>, various tests used hardcoded paths in /tmp, so posing issues for simultaneous test runs from different build directories. This patch fixes such uses of hardcoded file names to put them in the build directory instead (in the case of stdio-common/bug5 the file names are changed as well, to avoid a conflict with the name bug5.out also used for the automatic test output redirection). It also fixes test-installation.pl likewise (that was using filenames with $$ in them rather than strictly hardcoded names, but that's still not good practice for temporary file naming). Note that my list of files changed is not identical to that in bug 13888. I added tst-spawn3.c and test-installation.pl, and removed some tests that seem to me (now) to create temporary files securely (simply using /tmp is not itself a problem if the temporary files are handled properly with mkstemp; I haven't checked whether those tests used to do things insecurely). conformtest is not changed because the makefiles always pass a --tmpdir option so the /tmp default is irrelevant, and for the same reason there is no actual problem with nptl/tst-umask1.c because again the makefiles always override the default. nptl/sockperf.c is ignored because there is no code to run it; probably that file should actually be removed. Some tests use the mktemp function, but I think they all use it in a way that *is* secure (for generating names for directories / sockets / fifos / symlinks, where the operation using the name will not follow symlinks and so there is no potential for a symlink attack on the account running the testsuite). Some tests use the tmpnam function to generate temporary file names. This is in principle insecure, but not addressed by this patch (I consider it a separate issue from the fully hardcoded paths). Tested for x86_64. [BZ #13888] * posix/Makefile (CFLAGS-tst-spawn3.c): New variable. * posix/tst-spawn3.c (do_test): Put tst-spwan3.pid in OBJPFX, not /tmp. * scripts/test-installation.pl: Put temporary files in build directory, not /tmp. * stdio-common/Makefile (CFLAGS-bug3.c): New variable. (CFLAGS-bug4.c): Likewise. (CFLAGS-bug5.c): Likewise. (CFLAGS-test-fseek.c): Likewise. (CFLAGS-test-popen.c): Likewise. (CFLAGS-test_rdwr.c): Likewise. * stdio-common/bug3.c (main): Put temporary file in OBJPFX, not /tmp. * stdio-common/bug4.c (main): Likewise. * stdio-common/bug5.c (main): Likewise. * stdio-common/test-fseek.c (TESTFILE): Likewise. * stdio-common/test-popen.c (do_test): Likewise. * stdio-common/test_rdwr.c (main): Likewise.
222 lines
6.5 KiB
Perl
Executable File
222 lines
6.5 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
# Copyright (C) 1997-2018 Free Software Foundation, Inc.
|
|
# This file is part of the GNU C Library.
|
|
# Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1997.
|
|
|
|
# The GNU C Library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
|
|
# The GNU C Library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with the GNU C Library; if not, see
|
|
# <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
$PACKAGE = "libc";
|
|
$progname = $0;
|
|
if ($ENV{CC}) {
|
|
$CC = $ENV{CC};
|
|
} else {
|
|
$CC= "gcc";
|
|
}
|
|
if ($ENV{LD_SO}) {
|
|
$LD_SO = $ENV{LD_SO};
|
|
} else {
|
|
$LD_SO = "";
|
|
}
|
|
|
|
sub usage {
|
|
print "Usage: test-installation [soversions.mk]\n";
|
|
print " --help print this help, then exit\n";
|
|
print " --version print version number, then exit\n";
|
|
exit 0;
|
|
}
|
|
|
|
sub installation_problem {
|
|
print "The script has found some problems with your installation!\n";
|
|
print "Please read the FAQ and the README file and check the following:\n";
|
|
print "- Did you change the gcc specs file (necessary after upgrading from\n";
|
|
print " Linux libc5)?\n";
|
|
print "- Are there any symbolic links of the form libXXX.so to old libraries?\n";
|
|
print " Links like libm.so -> libm.so.5 (where libm.so.5 is an old library) are wrong,\n";
|
|
print " libm.so should point to the newly installed glibc file - and there should be\n";
|
|
print " only one such link (check e.g. /lib and /usr/lib)\n";
|
|
print "You should restart this script from your build directory after you've\n";
|
|
print "fixed all problems!\n";
|
|
print "Btw. the script doesn't work if you're installing GNU libc not as your\n";
|
|
print "primary library!\n";
|
|
exit 1;
|
|
}
|
|
|
|
arglist: while (@ARGV) {
|
|
if ($ARGV[0] eq "--v" || $ARGV[0] eq "--ve" || $ARGV[0] eq "--ver" ||
|
|
$ARGV[0] eq "--vers" || $ARGV[0] eq "--versi" ||
|
|
$ARGV[0] eq "--versio" || $ARGV[0] eq "--version") {
|
|
print "test-installation (GNU $PACKAGE)\n";
|
|
print "Copyright (C) 2018 Free Software Foundation, Inc.\n";
|
|
print "This is free software; see the source for copying conditions. There is NO\n";
|
|
print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
|
|
print "Written by Andreas Jaeger <aj\@arthur.rhein-neckar.de>\n";
|
|
|
|
exit 0;
|
|
} elsif ($ARGV[0] eq "--h" || $ARGV[0] eq "--he" || $ARGV[0] eq "--hel" ||
|
|
$ARGV[0] eq "--help") {
|
|
&usage;
|
|
} elsif ($ARGV[0] =~ /^-/) {
|
|
print "$progname: unrecognized option `$ARGV[0]'\n";
|
|
print "Try `$progname --help' for more information.\n";
|
|
exit 1;
|
|
} else {
|
|
last arglist;
|
|
}
|
|
}
|
|
|
|
# We expect none or one argument.
|
|
if ($#ARGV == -1) {
|
|
$dir = ".";
|
|
$soversions="soversions.mk";
|
|
$config="config.make";
|
|
} elsif ($#ARGV == 0) {
|
|
if (-d $ARGV[0]) {
|
|
$dir = $ARGV[0];
|
|
$soversions = "$ARGV[0]/soversions.mk";
|
|
$config = "$ARGV[0]/config.make";
|
|
} else {
|
|
$soversions = $dir = $ARGV[0];
|
|
$dir =~ s!/?[^/]*/*$!!;
|
|
$config = $dir . "/config.make";
|
|
}
|
|
} else {
|
|
die "Wrong number of arguments.";
|
|
}
|
|
|
|
if (system ("grep -q \"build-mathvec = yes\" $config") == 0) {
|
|
$build_mathvec = 1;
|
|
} else {
|
|
$build_mathvec = 0;
|
|
}
|
|
|
|
# Read names and versions of all shared libraries that are part of
|
|
# glibc
|
|
open SOVERSIONS, $soversions
|
|
or die ("Couldn't open $soversions in build directory!");
|
|
|
|
$link_libs = "";
|
|
%versions = ();
|
|
|
|
while (<SOVERSIONS>) {
|
|
next if (/^all-sonames/);
|
|
chop;
|
|
if (/^lib/) {
|
|
($name, $version)= /^lib(.*)\.so-version=\.(.*)$/;
|
|
# Filter out some libraries we don't want to link:
|
|
# - nss_ldap since it's not yet available
|
|
# - libdb1 since it conflicts with libdb
|
|
# - libthread_db since it contains unresolved references
|
|
# - it's just a test NSS module
|
|
# - We don't provide the libgcc so we don't test it
|
|
# - libmvec if it wasn't built
|
|
next if ($build_mathvec == 0 && $name eq "mvec");
|
|
if ($name ne "nss_ldap" && $name ne "db1"
|
|
&& $name ne "thread_db"
|
|
&& $name ne "nss_test1" && $name ne "libgcc_s") {
|
|
$link_libs .= " -l$name";
|
|
$versions{$name} = $version;
|
|
}
|
|
} elsif ($LD_SO ne "") {
|
|
($ld_so_name, $ld_so_version) = split ('\.so\.', $LD_SO);
|
|
} else {
|
|
if (/^ld\.so/) {
|
|
($ld_so_name, $ld_so_version)= /=(.*)\.so\.(.*)$/;
|
|
}
|
|
}
|
|
}
|
|
|
|
close SOVERSIONS;
|
|
|
|
# Create test program and link it against all
|
|
# shared libraries
|
|
|
|
open PRG, ">$dir/test-prg$$.c"
|
|
or die ("Couldn't write test file $dir/test-prg$$.c");
|
|
|
|
print PRG '
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
int main(void) {
|
|
printf ("Your new glibc installation seems to be ok.\n");
|
|
exit (0);
|
|
}
|
|
';
|
|
close PRG;
|
|
|
|
open GCC, "$CC $dir/test-prg$$.c $link_libs -o $dir/test-prg$$ 2>&1 |"
|
|
or die ("Couldn't execute $CC!");
|
|
|
|
while (<GCC>) {
|
|
print $_ if (! /warning/);
|
|
}
|
|
close GCC;
|
|
if ($?) {
|
|
print "Execution of $CC failed!\n";
|
|
&installation_problem;
|
|
}
|
|
|
|
# Test if test program is linked against the right versions of
|
|
# shared libraries
|
|
|
|
$ok = 1;
|
|
%found = ();
|
|
|
|
open LDD, "ldd $dir/test-prg$$ |"
|
|
or die ("Couldn't execute ldd");
|
|
while (<LDD>) {
|
|
if (/^\s*lib/) {
|
|
($name, $version1, $version2) =
|
|
/^\s*lib(\w*)\.so\.([0-9\.]*)\s*=>.*\.so\.([0-9\.]*)/;
|
|
$found{$name} = 1;
|
|
if ($versions{$name} ne $version1 || $version1 ne $version2) {
|
|
print "Library lib$name is not correctly installed.\n";
|
|
print "Please check your installation!\n";
|
|
print "Offending line of ldd output: $_\n";
|
|
$ok = 0;
|
|
}
|
|
}
|
|
if (/$ld_so_name/) {
|
|
($version1) = /$ld_so_name\.so\.([0-9\.]*)/;
|
|
if ($version1 ne $ld_so_version) {
|
|
print "The dynamic linker $ld_so_name.so is not correctly installed.\n";
|
|
print "Please check your installation!\n";
|
|
print "Offending line of ldd output: $_\n";
|
|
$ok = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
close LDD;
|
|
die "ldd execution failed" if $?;
|
|
|
|
foreach (keys %versions) {
|
|
unless ($found{$_}) {
|
|
print "Library lib$_ is not correctly installed since the test program\n";
|
|
print "was not linked dynamically against it.\n";
|
|
print "Do you have a file/link lib$_.so?\n";
|
|
$ok = 0;
|
|
}
|
|
}
|
|
|
|
&installation_problem unless $ok;
|
|
|
|
# Finally execute the test program
|
|
system ("$dir/test-prg$$") == 0
|
|
or die ("Execution of test program failed");
|
|
|
|
# Clean up after ourselves
|
|
unlink ("$dir/test-prg$$", "$dir/test-prg$$.c");
|