mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-31 22:11:53 -06:00
* Latest fuzzer patches from Alexander
* Fixes for the qtest bios-tables-test * LGPL information cleanup in qtest code * sh4 acceptance test * Improved submodule handling for the s390x CI test -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAl7oexoRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbVF/A//U2l79c2xM+9u95treESERb8XH7DXq8z0 uB5/3hEorGhF3XcnJoxHjzKlGtwKYdcn+h8fYba3efroT8QRh84D+y+7at5Ag9r9 jDB7MKIIn4pw0Zti4/s26xwccSlL1Sr24dzeJfGMfAXzve7wP4QZkAU9jwOu6TFW 5o5zd8DnPT9IpXnqJZgX0K+A1dLvnkyxqiWAFAok/8PHyhdLx7UPkGG+hIyOezSi j0vadrihUSUO88zChgq1Lfbr2r82YaIUIve9PYCMwMW9gYARH0fDFXKv55wHAmzJ NuO3DNy3FtobrZFPfJ9/x5P9ri806uATLI9ioF7U7tGD0xmsoypORxo8ueFfL1hD V31k052mSOpfYZKMdltMhlBMHxVjNZt7lHu2MEilC1j+cDbBE4JWgipbEkvrKnKR jCO6ur0f1UTrNt93S5xhCH2muGtGoAwv4i96e2/XhRoP4t8x7KyNUwzNbV3Y0Uvf HXBFz8S/J743Pd+j0aSp12ma+z5awtC5L1C0X5DaIu5jR1dQ9VK+G13x7tAjNdT8 wCHoOXwtveYLxWJ235Rx6pzdvk625plDlCYXmhRjyBNbW+XWuLAVwbNBwZSfKcLr Dj+vbHGpWiNpXnPTtnTZS4Lec9w4dCZdNGXq54nypIxDYukTjjPldTc20bbz6JoM 4OcE3na8bMA= =Pdab -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2020-06-16' into staging * Latest fuzzer patches from Alexander * Fixes for the qtest bios-tables-test * LGPL information cleanup in qtest code * sh4 acceptance test * Improved submodule handling for the s390x CI test # gpg: Signature made Tue 16 Jun 2020 08:56:10 BST # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * remotes/huth-gitlab/tags/pull-request-2020-06-16: configure: Let SLOF be initialized by ./scripts/git-submodule.sh tests/acceptance: Add boot tests for sh4 QEMU advent calendar image tests/qtest: Fix LGPL information in the file headers fuzz: add oss-fuzz build-script fuzz: Add support for logging QTest commands fuzz: skip QTest serialization bios-tables-test: Fix "-tpmdev: invalid option" Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
72fc7d7f79
46 changed files with 458 additions and 41 deletions
|
@ -293,7 +293,7 @@ jobs:
|
||||||
- name: "GCC check-acceptance"
|
- name: "GCC check-acceptance"
|
||||||
dist: bionic
|
dist: bionic
|
||||||
env:
|
env:
|
||||||
- CONFIG="--enable-tools --target-list=aarch64-softmmu,alpha-softmmu,arm-softmmu,m68k-softmmu,microblaze-softmmu,mips-softmmu,mips64el-softmmu,nios2-softmmu,or1k-softmmu,ppc-softmmu,ppc64-softmmu,s390x-softmmu,sparc-softmmu,x86_64-softmmu,xtensa-softmmu"
|
- CONFIG="--enable-tools --target-list=aarch64-softmmu,alpha-softmmu,arm-softmmu,m68k-softmmu,microblaze-softmmu,mips-softmmu,mips64el-softmmu,nios2-softmmu,or1k-softmmu,ppc-softmmu,ppc64-softmmu,s390x-softmmu,sh4-softmmu,sparc-softmmu,x86_64-softmmu,xtensa-softmmu"
|
||||||
- TEST_CMD="make check-acceptance"
|
- TEST_CMD="make check-acceptance"
|
||||||
- CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-acceptance"
|
- CACHE_NAME="${TRAVIS_BRANCH}-linux-gcc-acceptance"
|
||||||
after_script:
|
after_script:
|
||||||
|
@ -496,7 +496,6 @@ jobs:
|
||||||
- CONFIG="--disable-containers --target-list=${MAIN_SOFTMMU_TARGETS},s390x-linux-user"
|
- CONFIG="--disable-containers --target-list=${MAIN_SOFTMMU_TARGETS},s390x-linux-user"
|
||||||
- UNRELIABLE=true
|
- UNRELIABLE=true
|
||||||
script:
|
script:
|
||||||
- ( cd ${SRC_DIR} ; git submodule update --init roms/SLOF )
|
|
||||||
- BUILD_RC=0 && make -j${JOBS} || BUILD_RC=$?
|
- BUILD_RC=0 && make -j${JOBS} || BUILD_RC=$?
|
||||||
- |
|
- |
|
||||||
if [ "$BUILD_RC" -eq 0 ] ; then
|
if [ "$BUILD_RC" -eq 0 ] ; then
|
||||||
|
|
|
@ -2339,6 +2339,7 @@ R: Bandan Das <bsd@redhat.com>
|
||||||
R: Stefan Hajnoczi <stefanha@redhat.com>
|
R: Stefan Hajnoczi <stefanha@redhat.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: tests/qtest/fuzz/
|
F: tests/qtest/fuzz/
|
||||||
|
F: scripts/oss-fuzz/
|
||||||
|
|
||||||
Register API
|
Register API
|
||||||
M: Alistair Francis <alistair@alistair23.me>
|
M: Alistair Francis <alistair@alistair23.me>
|
||||||
|
|
5
configure
vendored
5
configure
vendored
|
@ -6600,6 +6600,11 @@ if test "$cpu" = "s390x" ; then
|
||||||
write_c_skeleton
|
write_c_skeleton
|
||||||
if compile_prog "-march=z900" ""; then
|
if compile_prog "-march=z900" ""; then
|
||||||
roms="$roms s390-ccw"
|
roms="$roms s390-ccw"
|
||||||
|
# SLOF is required for building the s390-ccw firmware on s390x,
|
||||||
|
# since it is using the libnet code from SLOF for network booting.
|
||||||
|
if test -e "${source_path}/.git" ; then
|
||||||
|
git_submodules="${git_submodules} roms/SLOF"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
105
scripts/oss-fuzz/build.sh
Executable file
105
scripts/oss-fuzz/build.sh
Executable file
|
@ -0,0 +1,105 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
#
|
||||||
|
# OSS-Fuzz build script. See:
|
||||||
|
# https://google.github.io/oss-fuzz/getting-started/new-project-guide/#buildsh
|
||||||
|
#
|
||||||
|
# The file is consumed by:
|
||||||
|
# https://github.com/google/oss-fuzz/blob/master/projects/qemu/Dockerfiles
|
||||||
|
#
|
||||||
|
# This code is licensed under the GPL version 2 or later. See
|
||||||
|
# the COPYING file in the top-level directory.
|
||||||
|
#
|
||||||
|
|
||||||
|
# build project
|
||||||
|
# e.g.
|
||||||
|
# ./autogen.sh
|
||||||
|
# ./configure
|
||||||
|
# make -j$(nproc) all
|
||||||
|
|
||||||
|
# build fuzzers
|
||||||
|
# e.g.
|
||||||
|
# $CXX $CXXFLAGS -std=c++11 -Iinclude \
|
||||||
|
# /path/to/name_of_fuzzer.cc -o $OUT/name_of_fuzzer \
|
||||||
|
# $LIB_FUZZING_ENGINE /path/to/library.a
|
||||||
|
|
||||||
|
fatal () {
|
||||||
|
echo "Error : ${*}, exiting."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
OSS_FUZZ_BUILD_DIR="./build-oss-fuzz/"
|
||||||
|
|
||||||
|
# There seems to be a bug in clang-11 (used for builds on oss-fuzz) :
|
||||||
|
# accel/tcg/cputlb.o: In function `load_memop':
|
||||||
|
# accel/tcg/cputlb.c:1505: undefined reference to `qemu_build_not_reached'
|
||||||
|
#
|
||||||
|
# When building with optimization, the compiler is expected to prove that the
|
||||||
|
# statement cannot be reached, and remove it. For some reason clang-11 doesn't
|
||||||
|
# remove it, resulting in an unresolved reference to qemu_build_not_reached
|
||||||
|
# Undefine the __OPTIMIZE__ macro which compiler.h relies on to choose whether
|
||||||
|
# to " #define qemu_build_not_reached() g_assert_not_reached() "
|
||||||
|
EXTRA_CFLAGS="$CFLAGS -U __OPTIMIZE__"
|
||||||
|
|
||||||
|
if ! { [ -e "./COPYING" ] &&
|
||||||
|
[ -e "./MAINTAINERS" ] &&
|
||||||
|
[ -e "./Makefile" ] &&
|
||||||
|
[ -e "./docs" ] &&
|
||||||
|
[ -e "./VERSION" ] &&
|
||||||
|
[ -e "./linux-user" ] &&
|
||||||
|
[ -e "./softmmu" ];} ; then
|
||||||
|
fatal "Please run the script from the top of the QEMU tree"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p $OSS_FUZZ_BUILD_DIR || fatal "mkdir $OSS_FUZZ_BUILD_DIR failed"
|
||||||
|
cd $OSS_FUZZ_BUILD_DIR || fatal "cd $OSS_FUZZ_BUILD_DIR failed"
|
||||||
|
|
||||||
|
|
||||||
|
if [ -z ${LIB_FUZZING_ENGINE+x} ]; then
|
||||||
|
LIB_FUZZING_ENGINE="-fsanitize=fuzzer"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z ${OUT+x} ]; then
|
||||||
|
DEST_DIR=$(realpath "./DEST_DIR")
|
||||||
|
else
|
||||||
|
DEST_DIR=$OUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$DEST_DIR/lib/" # Copy the shared libraries here
|
||||||
|
|
||||||
|
# Build once to get the list of dynamic lib paths, and copy them over
|
||||||
|
../configure --disable-werror --cc="$CC" --cxx="$CXX" \
|
||||||
|
--extra-cflags="$EXTRA_CFLAGS"
|
||||||
|
|
||||||
|
if ! make CONFIG_FUZZ=y CFLAGS="$LIB_FUZZING_ENGINE" "-j$(nproc)" \
|
||||||
|
i386-softmmu/fuzz; then
|
||||||
|
fatal "Build failed. Please specify a compiler with fuzzing support"\
|
||||||
|
"using the \$CC and \$CXX environemnt variables, or specify a"\
|
||||||
|
"\$LIB_FUZZING_ENGINE compatible with your compiler"\
|
||||||
|
"\nFor example: CC=clang CXX=clang++ $0"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for i in $(ldd ./i386-softmmu/qemu-fuzz-i386 | cut -f3 -d' '); do
|
||||||
|
cp "$i" "$DEST_DIR/lib/"
|
||||||
|
done
|
||||||
|
rm ./i386-softmmu/qemu-fuzz-i386
|
||||||
|
|
||||||
|
# Build a second time to build the final binary with correct rpath
|
||||||
|
../configure --bindir="$DEST_DIR" --datadir="$DEST_DIR/data/" --disable-werror \
|
||||||
|
--cc="$CC" --cxx="$CXX" --extra-cflags="$EXTRA_CFLAGS" \
|
||||||
|
--extra-ldflags="-Wl,-rpath,'\$\$ORIGIN/lib'"
|
||||||
|
make CONFIG_FUZZ=y CFLAGS="$LIB_FUZZING_ENGINE" "-j$(nproc)" i386-softmmu/fuzz
|
||||||
|
|
||||||
|
# Copy over the datadir
|
||||||
|
cp -r ../pc-bios/ "$DEST_DIR/pc-bios"
|
||||||
|
|
||||||
|
# Run the fuzzer with no arguments, to print the help-string and get the list
|
||||||
|
# of available fuzz-targets. Copy over the qemu-fuzz-i386, naming it according
|
||||||
|
# to each available fuzz target (See 05509c8e6d fuzz: select fuzz target using
|
||||||
|
# executable name)
|
||||||
|
for target in $(./i386-softmmu/qemu-fuzz-i386 | awk '$1 ~ /\*/ {print $2}');
|
||||||
|
do
|
||||||
|
cp ./i386-softmmu/qemu-fuzz-i386 "$DEST_DIR/qemu-fuzz-i386-target-$target"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Done. The fuzzers are located in $DEST_DIR"
|
||||||
|
exit 0
|
|
@ -858,12 +858,12 @@ class BootLinuxConsole(LinuxKernelTest):
|
||||||
console_pattern = 'No filesystem could mount root'
|
console_pattern = 'No filesystem could mount root'
|
||||||
self.wait_for_console_pattern(console_pattern)
|
self.wait_for_console_pattern(console_pattern)
|
||||||
|
|
||||||
def do_test_advcal_2018(self, day, tar_hash, kernel_name):
|
def do_test_advcal_2018(self, day, tar_hash, kernel_name, console=0):
|
||||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||||
'/2018/download/day' + day + '.tar.xz')
|
'/2018/download/day' + day + '.tar.xz')
|
||||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||||
archive.extract(file_path, self.workdir)
|
archive.extract(file_path, self.workdir)
|
||||||
self.vm.set_console()
|
self.vm.set_console(console_index=console)
|
||||||
self.vm.add_args('-kernel',
|
self.vm.add_args('-kernel',
|
||||||
self.workdir + '/day' + day + '/' + kernel_name)
|
self.workdir + '/day' + day + '/' + kernel_name)
|
||||||
self.vm.launch()
|
self.vm.launch()
|
||||||
|
@ -937,6 +937,15 @@ class BootLinuxConsole(LinuxKernelTest):
|
||||||
self.vm.add_args('-M', 'graphics=off')
|
self.vm.add_args('-M', 'graphics=off')
|
||||||
self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
|
self.do_test_advcal_2018('15', tar_hash, 'invaders.elf')
|
||||||
|
|
||||||
|
def test_sh4_r2d(self):
|
||||||
|
"""
|
||||||
|
:avocado: tags=arch:sh4
|
||||||
|
:avocado: tags=machine:r2d
|
||||||
|
"""
|
||||||
|
tar_hash = 'fe06a4fd8ccbf2e27928d64472939d47829d4c7e'
|
||||||
|
self.vm.add_args('-append', 'console=ttySC1')
|
||||||
|
self.do_test_advcal_2018('09', tar_hash, 'zImage', console=1)
|
||||||
|
|
||||||
def test_sparc_ss20(self):
|
def test_sparc_ss20(self):
|
||||||
"""
|
"""
|
||||||
:avocado: tags=arch:sparc
|
:avocado: tags=arch:sparc
|
||||||
|
|
|
@ -882,6 +882,7 @@ uint64_t tpm_tis_base_addr;
|
||||||
static void test_acpi_tcg_tpm(const char *machine, const char *tpm_if,
|
static void test_acpi_tcg_tpm(const char *machine, const char *tpm_if,
|
||||||
uint64_t base)
|
uint64_t base)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_TPM
|
||||||
gchar *tmp_dir_name = g_strdup_printf("qemu-test_acpi_%s_tcg_%s.XXXXXX",
|
gchar *tmp_dir_name = g_strdup_printf("qemu-test_acpi_%s_tcg_%s.XXXXXX",
|
||||||
machine, tpm_if);
|
machine, tpm_if);
|
||||||
char *tmp_path = g_dir_make_tmp(tmp_dir_name, NULL);
|
char *tmp_path = g_dir_make_tmp(tmp_dir_name, NULL);
|
||||||
|
@ -924,6 +925,9 @@ static void test_acpi_tcg_tpm(const char *machine, const char *tpm_if,
|
||||||
g_free(tmp_path);
|
g_free(tmp_path);
|
||||||
g_free(tmp_dir_name);
|
g_free(tmp_dir_name);
|
||||||
free_test_data(&data);
|
free_test_data(&data);
|
||||||
|
#else
|
||||||
|
g_test_skip("TPM disabled");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_acpi_q35_tcg_tpm_tis(void)
|
static void test_acpi_q35_tcg_tpm_tis(void)
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
||||||
* version 2 of the License, or (at your option) any later version.
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,6 +5,7 @@ fuzz-obj-y += $(libqos-obj-y)
|
||||||
fuzz-obj-y += tests/qtest/fuzz/fuzz.o # Fuzzer skeleton
|
fuzz-obj-y += tests/qtest/fuzz/fuzz.o # Fuzzer skeleton
|
||||||
fuzz-obj-y += tests/qtest/fuzz/fork_fuzz.o
|
fuzz-obj-y += tests/qtest/fuzz/fork_fuzz.o
|
||||||
fuzz-obj-y += tests/qtest/fuzz/qos_fuzz.o
|
fuzz-obj-y += tests/qtest/fuzz/qos_fuzz.o
|
||||||
|
fuzz-obj-y += tests/qtest/fuzz/qtest_wrappers.o
|
||||||
|
|
||||||
# Targets
|
# Targets
|
||||||
fuzz-obj-$(CONFIG_PCI_I440FX) += tests/qtest/fuzz/i440fx_fuzz.o
|
fuzz-obj-$(CONFIG_PCI_I440FX) += tests/qtest/fuzz/i440fx_fuzz.o
|
||||||
|
@ -16,3 +17,23 @@ FUZZ_CFLAGS += -I$(SRC_PATH)/tests -I$(SRC_PATH)/tests/qtest
|
||||||
# Linker Script to force coverage-counters into known regions which we can mark
|
# Linker Script to force coverage-counters into known regions which we can mark
|
||||||
# shared
|
# shared
|
||||||
FUZZ_LDFLAGS += -Xlinker -T$(SRC_PATH)/tests/qtest/fuzz/fork_fuzz.ld
|
FUZZ_LDFLAGS += -Xlinker -T$(SRC_PATH)/tests/qtest/fuzz/fork_fuzz.ld
|
||||||
|
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_inb
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_inw
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_inl
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_outb
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_outw
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_outl
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_readb
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_readw
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_readl
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_readq
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_writeb
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_writew
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_writel
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_writeq
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_memread
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_bufread
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_memwrite
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_bufwrite
|
||||||
|
FUZZ_LDFLAGS += -Wl,-wrap,qtest_memset
|
||||||
|
|
|
@ -91,7 +91,12 @@ static void usage(char *path)
|
||||||
printf(" * %s : %s\n", tmp->target->name,
|
printf(" * %s : %s\n", tmp->target->name,
|
||||||
tmp->target->description);
|
tmp->target->description);
|
||||||
}
|
}
|
||||||
printf("Alternatively, add -target-FUZZ_TARGET to the executable name\n");
|
printf("Alternatively, add -target-FUZZ_TARGET to the executable name\n\n"
|
||||||
|
"Set the environment variable FUZZ_SERIALIZE_QTEST=1 to serialize\n"
|
||||||
|
"QTest commands into an ASCII protocol. Useful for building crash\n"
|
||||||
|
"reproducers, but slows down execution.\n\n"
|
||||||
|
"Set the environment variable QTEST_LOG=1 to log all qtest commands"
|
||||||
|
"\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +143,7 @@ int LLVMFuzzerInitialize(int *argc, char ***argv, char ***envp)
|
||||||
|
|
||||||
char *target_name;
|
char *target_name;
|
||||||
char *dir;
|
char *dir;
|
||||||
|
bool serialize = false;
|
||||||
|
|
||||||
/* Initialize qgraph and modules */
|
/* Initialize qgraph and modules */
|
||||||
qos_graph_init();
|
qos_graph_init();
|
||||||
|
@ -172,6 +178,13 @@ int LLVMFuzzerInitialize(int *argc, char ***argv, char ***envp)
|
||||||
usage(**argv);
|
usage(**argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Should we always serialize qtest commands? */
|
||||||
|
if (getenv("FUZZ_SERIALIZE_QTEST")) {
|
||||||
|
serialize = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fuzz_qtest_set_serialize(serialize);
|
||||||
|
|
||||||
/* Identify the fuzz target */
|
/* Identify the fuzz target */
|
||||||
fuzz_target = fuzz_get_target(target_name);
|
fuzz_target = fuzz_get_target(target_name);
|
||||||
if (!fuzz_target) {
|
if (!fuzz_target) {
|
||||||
|
@ -186,6 +199,11 @@ int LLVMFuzzerInitialize(int *argc, char ***argv, char ***envp)
|
||||||
|
|
||||||
/* Run QEMU's softmmu main with the fuzz-target dependent arguments */
|
/* Run QEMU's softmmu main with the fuzz-target dependent arguments */
|
||||||
const char *init_cmdline = fuzz_target->get_init_cmdline(fuzz_target);
|
const char *init_cmdline = fuzz_target->get_init_cmdline(fuzz_target);
|
||||||
|
init_cmdline = g_strdup_printf("%s -qtest /dev/null -qtest-log %s",
|
||||||
|
init_cmdline,
|
||||||
|
getenv("QTEST_LOG") ? "/dev/fd/2"
|
||||||
|
: "/dev/null");
|
||||||
|
|
||||||
|
|
||||||
/* Split the runcmd into an argv and argc */
|
/* Split the runcmd into an argv and argc */
|
||||||
wordexp_t result;
|
wordexp_t result;
|
||||||
|
|
|
@ -82,6 +82,9 @@ typedef struct FuzzTarget {
|
||||||
void flush_events(QTestState *);
|
void flush_events(QTestState *);
|
||||||
void reboot(QTestState *);
|
void reboot(QTestState *);
|
||||||
|
|
||||||
|
/* Use the QTest ASCII protocol or call address_space API directly?*/
|
||||||
|
void fuzz_qtest_set_serialize(bool option);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* makes a copy of *target and adds it to the target-list.
|
* makes a copy of *target and adds it to the target-list.
|
||||||
* i.e. fine to set up target on the caller's stack
|
* i.e. fine to set up target on the caller's stack
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
252
tests/qtest/fuzz/qtest_wrappers.c
Normal file
252
tests/qtest/fuzz/qtest_wrappers.c
Normal file
|
@ -0,0 +1,252 @@
|
||||||
|
/*
|
||||||
|
* qtest function wrappers
|
||||||
|
*
|
||||||
|
* Copyright Red Hat Inc., 2019
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Alexander Bulekov <alxndr@bu.edu>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "exec/ioport.h"
|
||||||
|
|
||||||
|
#include "fuzz.h"
|
||||||
|
|
||||||
|
static bool serialize = true;
|
||||||
|
|
||||||
|
#define WRAP(RET_TYPE, NAME_AND_ARGS)\
|
||||||
|
RET_TYPE __wrap_##NAME_AND_ARGS;\
|
||||||
|
RET_TYPE __real_##NAME_AND_ARGS;
|
||||||
|
|
||||||
|
WRAP(uint8_t , qtest_inb(QTestState *s, uint16_t addr))
|
||||||
|
WRAP(uint16_t , qtest_inw(QTestState *s, uint16_t addr))
|
||||||
|
WRAP(uint32_t , qtest_inl(QTestState *s, uint16_t addr))
|
||||||
|
WRAP(void , qtest_outb(QTestState *s, uint16_t addr, uint8_t value))
|
||||||
|
WRAP(void , qtest_outw(QTestState *s, uint16_t addr, uint16_t value))
|
||||||
|
WRAP(void , qtest_outl(QTestState *s, uint16_t addr, uint32_t value))
|
||||||
|
WRAP(uint8_t , qtest_readb(QTestState *s, uint64_t addr))
|
||||||
|
WRAP(uint16_t , qtest_readw(QTestState *s, uint64_t addr))
|
||||||
|
WRAP(uint32_t , qtest_readl(QTestState *s, uint64_t addr))
|
||||||
|
WRAP(uint64_t , qtest_readq(QTestState *s, uint64_t addr))
|
||||||
|
WRAP(void , qtest_writeb(QTestState *s, uint64_t addr, uint8_t value))
|
||||||
|
WRAP(void , qtest_writew(QTestState *s, uint64_t addr, uint16_t value))
|
||||||
|
WRAP(void , qtest_writel(QTestState *s, uint64_t addr, uint32_t value))
|
||||||
|
WRAP(void , qtest_writeq(QTestState *s, uint64_t addr, uint64_t value))
|
||||||
|
WRAP(void , qtest_memread(QTestState *s, uint64_t addr,
|
||||||
|
void *data, size_t size))
|
||||||
|
WRAP(void , qtest_bufread(QTestState *s, uint64_t addr, void *data,
|
||||||
|
size_t size))
|
||||||
|
WRAP(void , qtest_memwrite(QTestState *s, uint64_t addr, const void *data,
|
||||||
|
size_t size))
|
||||||
|
WRAP(void, qtest_bufwrite(QTestState *s, uint64_t addr,
|
||||||
|
const void *data, size_t size))
|
||||||
|
WRAP(void, qtest_memset(QTestState *s, uint64_t addr,
|
||||||
|
uint8_t patt, size_t size))
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t __wrap_qtest_inb(QTestState *s, uint16_t addr)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
return cpu_inb(addr);
|
||||||
|
} else {
|
||||||
|
return __real_qtest_inb(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t __wrap_qtest_inw(QTestState *s, uint16_t addr)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
return cpu_inw(addr);
|
||||||
|
} else {
|
||||||
|
return __real_qtest_inw(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t __wrap_qtest_inl(QTestState *s, uint16_t addr)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
return cpu_inl(addr);
|
||||||
|
} else {
|
||||||
|
return __real_qtest_inl(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
cpu_outb(addr, value);
|
||||||
|
} else {
|
||||||
|
__real_qtest_outb(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_outw(QTestState *s, uint16_t addr, uint16_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
cpu_outw(addr, value);
|
||||||
|
} else {
|
||||||
|
__real_qtest_outw(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_outl(QTestState *s, uint16_t addr, uint32_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
cpu_outl(addr, value);
|
||||||
|
} else {
|
||||||
|
__real_qtest_outl(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t __wrap_qtest_readb(QTestState *s, uint64_t addr)
|
||||||
|
{
|
||||||
|
uint8_t value;
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 1);
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
return __real_qtest_readb(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t __wrap_qtest_readw(QTestState *s, uint64_t addr)
|
||||||
|
{
|
||||||
|
uint16_t value;
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 2);
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
return __real_qtest_readw(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t __wrap_qtest_readl(QTestState *s, uint64_t addr)
|
||||||
|
{
|
||||||
|
uint32_t value;
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 4);
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
return __real_qtest_readl(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t __wrap_qtest_readq(QTestState *s, uint64_t addr)
|
||||||
|
{
|
||||||
|
uint64_t value;
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 8);
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
return __real_qtest_readq(s, addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 1);
|
||||||
|
} else {
|
||||||
|
__real_qtest_writeb(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 2);
|
||||||
|
} else {
|
||||||
|
__real_qtest_writew(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 4);
|
||||||
|
} else {
|
||||||
|
__real_qtest_writel(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
&value, 8);
|
||||||
|
} else {
|
||||||
|
__real_qtest_writeq(s, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED, data,
|
||||||
|
size);
|
||||||
|
} else {
|
||||||
|
__real_qtest_memread(s, addr, data, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED, data,
|
||||||
|
size);
|
||||||
|
} else {
|
||||||
|
__real_qtest_bufread(s, addr, data, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_memwrite(QTestState *s, uint64_t addr, const void *data,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
data, size);
|
||||||
|
} else {
|
||||||
|
__real_qtest_memwrite(s, addr, data, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __wrap_qtest_bufwrite(QTestState *s, uint64_t addr,
|
||||||
|
const void *data, size_t size)
|
||||||
|
{
|
||||||
|
if (!serialize) {
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
data, size);
|
||||||
|
} else {
|
||||||
|
__real_qtest_bufwrite(s, addr, data, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void __wrap_qtest_memset(QTestState *s, uint64_t addr,
|
||||||
|
uint8_t patt, size_t size)
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
if (!serialize) {
|
||||||
|
data = malloc(size);
|
||||||
|
memset(data, patt, size);
|
||||||
|
address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
|
||||||
|
data, size);
|
||||||
|
} else {
|
||||||
|
__real_qtest_memset(s, addr, patt, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fuzz_qtest_set_serialize(bool option)
|
||||||
|
{
|
||||||
|
serialize = option;
|
||||||
|
}
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License version 2 as published by the Free Software Foundation.
|
* License version 2.1 as published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue