mirror of
https://github.com/upx/upx
synced 2025-10-05 19:20:23 +08:00
all: yet more minor updates
This commit is contained in:
parent
db39f9c4dc
commit
19e84fea62
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
|
@ -384,8 +384,8 @@ jobs:
|
||||||
- { zig_target: x86_64-macos.13-none }
|
- { zig_target: x86_64-macos.13-none }
|
||||||
- { zig_target: x86_64-windows-gnu }
|
- { zig_target: x86_64-windows-gnu }
|
||||||
env:
|
env:
|
||||||
# 2023-06-06
|
# 2023-06-08
|
||||||
ZIG_DIST_VERSION: 0.11.0-dev.3381+9ee0a706d
|
ZIG_DIST_VERSION: 0.11.0-dev.3384+00ff65357
|
||||||
# for zig-cc wrapper scripts (see below):
|
# for zig-cc wrapper scripts (see below):
|
||||||
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
|
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
|
||||||
ZIG_FLAGS: ${{ matrix.zig_flags }}
|
ZIG_FLAGS: ${{ matrix.zig_flags }}
|
||||||
|
|
21
.github/workflows/minimal-ci.yml
vendored
21
.github/workflows/minimal-ci.yml
vendored
|
@ -13,16 +13,25 @@ jobs:
|
||||||
name: ${{ format('container {0}', matrix.container) }}
|
name: ${{ format('container {0}', matrix.container) }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ${{ matrix.container }}
|
container: ${{ matrix.container }}
|
||||||
|
env: { VERBOSE: 1 }
|
||||||
steps:
|
steps:
|
||||||
- name: ${{ format('Install packages {0}', matrix.container) }}
|
- name: ${{ format('Install packages {0}', matrix.container) }}
|
||||||
run: 'apk update && apk upgrade && apk add bash clang cmake g++ git make'
|
run: 'apk update && apk upgrade && apk add clang cmake g++ git make'
|
||||||
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
- name: ${{ format('Check out UPX {0} source code', github.ref_name) }}
|
||||||
run: |
|
run: |
|
||||||
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx
|
git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx
|
||||||
git -C upx submodule update --init
|
git -C upx submodule update --init
|
||||||
|
x="$(apk list -I "$(apk info -Wq "$(which clang)")")"; echo "clang_package=${x%% *}" >> $GITHUB_ENV
|
||||||
|
x="$(apk list -I "$(apk info -Wq "$(which gcc)")")"; echo "gcc_package=${x%% *}" >> $GITHUB_ENV
|
||||||
echo "artifact_name=upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-minimal-ci-${{ matrix.container }}" | sed 's/[^=0-9a-zA-Z_.-]/-/g' >> $GITHUB_ENV
|
echo "artifact_name=upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-minimal-ci-${{ matrix.container }}" | sed 's/[^=0-9a-zA-Z_.-]/-/g' >> $GITHUB_ENV
|
||||||
- { name: 'Build clang', run: 'make -C upx UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static"' }
|
- name: ${{ format('Build clang Release with {0}', env.clang_package) }}
|
||||||
- { name: 'Build gcc', run: 'make -C upx UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static"' }
|
run: 'make -C upx UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static"'
|
||||||
|
- name: ${{ format('Build clang Debug with {0}', env.clang_package) }}
|
||||||
|
run: 'make -C upx UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static" xtarget/debug'
|
||||||
|
- name: ${{ format('Build gcc Release with {0}', env.gcc_package) }}
|
||||||
|
run: 'make -C upx UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static"'
|
||||||
|
- name: ${{ format('Build gcc Debug with {0}', env.gcc_package) }}
|
||||||
|
run: 'make -C upx UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static" xtarget/debug'
|
||||||
- { name: 'Strip release binaries', run: 'strip -p --strip-unneeded upx/build/*/*/release/upx' }
|
- { name: 'Strip release binaries', run: 'strip -p --strip-unneeded upx/build/*/*/release/upx' }
|
||||||
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
|
||||||
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host
|
if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host
|
||||||
|
@ -30,5 +39,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
name: ${{ env.artifact_name }}
|
name: ${{ env.artifact_name }}
|
||||||
path: 'upx*/build/*/*/*/upx'
|
path: 'upx*/build/*/*/*/upx'
|
||||||
- { name: 'Run basic tests clang', run: 'make -C upx/build/xtarget/clang-static/release test' }
|
- { name: 'Run basic tests clang Release', run: 'make -C upx/build/xtarget/clang-static/release test' }
|
||||||
- { name: 'Run basic tests gcc', run: 'make -C upx/build/xtarget/gcc-static/release test' }
|
- { name: 'Run basic tests clang Debug', run: 'make -C upx/build/xtarget/clang-static/debug test' }
|
||||||
|
- { name: 'Run basic tests gcc Release', run: 'make -C upx/build/xtarget/gcc-static/release test' }
|
||||||
|
- { name: 'Run basic tests gcc Debug', run: 'make -C upx/build/xtarget/gcc-static/debug test' }
|
||||||
|
|
|
@ -333,8 +333,8 @@ if(NOT UPX_CONFIG_CMAKE_DISABLE_INSTALL)
|
||||||
|
|
||||||
# installation prefix and directories
|
# installation prefix and directories
|
||||||
if(NOT CMAKE_INSTALL_PREFIX)
|
if(NOT CMAKE_INSTALL_PREFIX)
|
||||||
#message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined.")
|
#message(FATAL_ERROR "ERROR: CMAKE_INSTALL_PREFIX is not defined")
|
||||||
message(WARNING "WARNING: CMAKE_INSTALL_PREFIX is not defined.")
|
message(WARNING "WARNING: CMAKE_INSTALL_PREFIX is not defined")
|
||||||
endif()
|
endif()
|
||||||
if(CMAKE_INSTALL_PREFIX)
|
if(CMAKE_INSTALL_PREFIX)
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -13,7 +13,7 @@
|
||||||
CMAKE = cmake
|
CMAKE = cmake
|
||||||
UPX_CMAKE_BUILD_FLAGS += --parallel
|
UPX_CMAKE_BUILD_FLAGS += --parallel
|
||||||
ifneq ($(VERBOSE),)
|
ifneq ($(VERBOSE),)
|
||||||
UPX_CMAKE_BUILD_FLAGS += --verbose
|
#UPX_CMAKE_BUILD_FLAGS += --verbose # requires CMake >= 3.14
|
||||||
UPX_CMAKE_CONFIG_FLAGS += -DCMAKE_VERBOSE_MAKEFILE=ON
|
UPX_CMAKE_CONFIG_FLAGS += -DCMAKE_VERBOSE_MAKEFILE=ON
|
||||||
endif
|
endif
|
||||||
# enable this if you prefer Ninja for the actual builds:
|
# enable this if you prefer Ninja for the actual builds:
|
||||||
|
|
|
@ -44,7 +44,7 @@ Short overview
|
||||||
Tools needed to build/modify the UPX sources
|
Tools needed to build/modify the UPX sources
|
||||||
--------------------------------------------
|
--------------------------------------------
|
||||||
|
|
||||||
- A C++ compiler that supports C++ 17: clang-5, gcc-8 or msvc-2019 16.11
|
- A C++ compiler that supports C++17: clang-5, gcc-8 or msvc-2019 16.11
|
||||||
(older or other compilers may work but are unsupported, use at your own risk)
|
(older or other compilers may work but are unsupported, use at your own risk)
|
||||||
|
|
||||||
- GNU make
|
- GNU make
|
||||||
|
|
|
@ -133,7 +133,7 @@
|
||||||
.\" ========================================================================
|
.\" ========================================================================
|
||||||
.\"
|
.\"
|
||||||
.IX Title "UPX 1"
|
.IX Title "UPX 1"
|
||||||
.TH UPX 1 "2023-02-05" "upx 4.0.3" " "
|
.TH UPX 1 "2023-05-28" "upx 4.1.0" " "
|
||||||
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||||
.\" way too many mistakes in technical documents.
|
.\" way too many mistakes in technical documents.
|
||||||
.if n .ad l
|
.if n .ad l
|
||||||
|
|
|
@ -16,4 +16,4 @@ echo 'Packages:'
|
||||||
flags=( --read-only --rm --pull=never )
|
flags=( --read-only --rm --pull=never )
|
||||||
flags+=( --cap-drop=all ) # drop all capabilities
|
flags+=( --cap-drop=all ) # drop all capabilities
|
||||||
flags+=( --network=none ) # no network needed
|
flags+=( --network=none ) # no network needed
|
||||||
podman run "${flags[@]}" "$image" bash -c 'dpkg -l | LC_ALL=C sort'
|
podman run "${flags[@]}" "$image" bash -c $'dpkg -l | sed \'s/ *$//\' | LC_ALL=C sort'
|
|
@ -16,4 +16,4 @@ echo 'Packages:'
|
||||||
flags=( --read-only --rm --pull=never )
|
flags=( --read-only --rm --pull=never )
|
||||||
flags+=( --cap-drop=all ) # drop all capabilities
|
flags+=( --cap-drop=all ) # drop all capabilities
|
||||||
flags+=( --network=none ) # no network needed
|
flags+=( --network=none ) # no network needed
|
||||||
podman run "${flags[@]}" "$image" bash -c 'dpkg -l | LC_ALL=C sort'
|
podman run "${flags[@]}" "$image" bash -c $'dpkg -l | sed \'s/ *$//\' | LC_ALL=C sort'
|
|
@ -743,10 +743,10 @@ namespace N_BELE_RTP {
|
||||||
|
|
||||||
// util
|
// util
|
||||||
namespace N_BELE_CTP {
|
namespace N_BELE_CTP {
|
||||||
inline const N_BELE_RTP::AbstractPolicy *getRTP(const BEPolicy * /*dummy*/) {
|
inline const N_BELE_RTP::AbstractPolicy *getRTP(const BEPolicy * /*dummy*/) noexcept {
|
||||||
return &N_BELE_RTP::be_policy;
|
return &N_BELE_RTP::be_policy;
|
||||||
}
|
}
|
||||||
inline const N_BELE_RTP::AbstractPolicy *getRTP(const LEPolicy * /*dummy*/) {
|
inline const N_BELE_RTP::AbstractPolicy *getRTP(const LEPolicy * /*dummy*/) noexcept {
|
||||||
return &N_BELE_RTP::le_policy;
|
return &N_BELE_RTP::le_policy;
|
||||||
}
|
}
|
||||||
} // namespace N_BELE_CTP
|
} // namespace N_BELE_CTP
|
||||||
|
|
|
@ -78,9 +78,10 @@ struct AbstractPolicy {
|
||||||
S u64_compare_signed(const void *a, const void *b) C = 0;
|
S u64_compare_signed(const void *a, const void *b) C = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy, assignment and move assignment
|
// disable copy and move
|
||||||
AbstractPolicy(const AbstractPolicy &) = delete;
|
AbstractPolicy(const AbstractPolicy &) = delete;
|
||||||
AbstractPolicy &operator=(const AbstractPolicy &) = delete;
|
AbstractPolicy &operator=(const AbstractPolicy &) = delete;
|
||||||
|
AbstractPolicy(AbstractPolicy &&) = delete;
|
||||||
AbstractPolicy &operator=(AbstractPolicy &&) = delete;
|
AbstractPolicy &operator=(AbstractPolicy &&) = delete;
|
||||||
// disable dynamic allocation
|
// disable dynamic allocation
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
ACC_CXX_DISABLE_NEW_DELETE
|
||||||
|
@ -145,9 +146,10 @@ struct BEPolicy
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy, assignment and move assignment
|
// disable copy and move
|
||||||
BEPolicy(const BEPolicy &) = delete;
|
BEPolicy(const BEPolicy &) = delete;
|
||||||
BEPolicy &operator=(const BEPolicy &) = delete;
|
BEPolicy &operator=(const BEPolicy &) = delete;
|
||||||
|
BEPolicy(BEPolicy &&) = delete;
|
||||||
BEPolicy &operator=(BEPolicy &&) = delete;
|
BEPolicy &operator=(BEPolicy &&) = delete;
|
||||||
// disable dynamic allocation
|
// disable dynamic allocation
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
ACC_CXX_DISABLE_NEW_DELETE
|
||||||
|
@ -206,9 +208,10 @@ struct LEPolicy
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy, assignment and move assignment
|
// disable copy and move
|
||||||
LEPolicy(const LEPolicy &) = delete;
|
LEPolicy(const LEPolicy &) = delete;
|
||||||
LEPolicy &operator=(const LEPolicy &) = delete;
|
LEPolicy &operator=(const LEPolicy &) = delete;
|
||||||
|
LEPolicy(LEPolicy &&) = delete;
|
||||||
LEPolicy &operator=(LEPolicy &&) = delete;
|
LEPolicy &operator=(LEPolicy &&) = delete;
|
||||||
// disable dynamic allocation
|
// disable dynamic allocation
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
ACC_CXX_DISABLE_NEW_DELETE
|
||||||
|
|
|
@ -742,30 +742,52 @@ TEST_CASE("PtrOrSpan char") {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("PtrOrSpan int") {
|
TEST_CASE("PtrOrSpan int") {
|
||||||
int buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
int buf[8] = {0, 11, 22, 33, 44, 55, 66, 77};
|
||||||
XSPAN_P(int) a(buf, XSpanCount(8));
|
XSPAN_P(const int) a(buf, XSpanCount(8));
|
||||||
CHECK(a.raw_size_in_bytes() == 8 * sizeof(int));
|
CHECK(a.raw_size_in_bytes() == 8 * sizeof(int));
|
||||||
XSPAN_P(int) b = a.subspan(0, 7);
|
XSPAN_P(const int) b = a.subspan(0, 7);
|
||||||
CHECK(b.raw_size_in_bytes() == 7 * sizeof(int));
|
CHECK(b.raw_size_in_bytes() == 7 * sizeof(int));
|
||||||
XSPAN_P(int) c = (b + 1).subspan(0, 6);
|
XSPAN_P(const int) c = (b + 1).subspan(0, 6);
|
||||||
CHECK(c.raw_size_in_bytes() == 6 * sizeof(int));
|
CHECK(c.raw_size_in_bytes() == 6 * sizeof(int));
|
||||||
a += 1;
|
a += 1;
|
||||||
CHECK(*a == 1);
|
CHECK(a == buf + 1);
|
||||||
CHECK(*a++ == 1);
|
CHECK(*a == 11);
|
||||||
CHECK(*++a == 3);
|
CHECK(*a++ == 11);
|
||||||
CHECK(--*a == 2);
|
CHECK(a == buf + 2);
|
||||||
CHECK(*a-- == 2);
|
CHECK(*a == 22);
|
||||||
|
CHECK(*++a == 33);
|
||||||
|
CHECK(a == buf + 3);
|
||||||
|
CHECK(*a == 33);
|
||||||
|
CHECK(*--a == 22);
|
||||||
|
CHECK(a == buf + 2);
|
||||||
|
CHECK(*a == 22);
|
||||||
|
CHECK(*a-- == 22);
|
||||||
|
CHECK(a == buf + 1);
|
||||||
|
CHECK(*a == 11);
|
||||||
CHECK(*b == 0);
|
CHECK(*b == 0);
|
||||||
CHECK(*c == 1);
|
CHECK(*c == 11);
|
||||||
a = buf + 7;
|
a -= 1;
|
||||||
|
a += 7;
|
||||||
#ifdef UPX_VERSION_HEX
|
#ifdef UPX_VERSION_HEX
|
||||||
CHECK(get_le32(a) == ne32_to_le32(7));
|
CHECK(get_le32(a) == ne32_to_le32(77));
|
||||||
#endif
|
#endif
|
||||||
a++;
|
a++;
|
||||||
#ifdef UPX_VERSION_HEX
|
#ifdef UPX_VERSION_HEX
|
||||||
CHECK_THROWS(get_le32(a));
|
CHECK_THROWS(get_le32(a));
|
||||||
#endif
|
#endif
|
||||||
CHECK_THROWS(raw_bytes(a, 1));
|
CHECK_THROWS(raw_bytes(a, 1));
|
||||||
|
CHECK_THROWS(a++);
|
||||||
|
CHECK_THROWS(++a);
|
||||||
|
CHECK_THROWS(a += 1);
|
||||||
|
CHECK(a == buf + 8);
|
||||||
|
a = buf;
|
||||||
|
CHECK_THROWS(a--);
|
||||||
|
CHECK_THROWS(--a);
|
||||||
|
CHECK_THROWS(a -= 1);
|
||||||
|
CHECK_THROWS(a += 9);
|
||||||
|
CHECK(a == buf);
|
||||||
|
a += 8;
|
||||||
|
CHECK(a == buf + 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
|
@ -780,6 +802,9 @@ __acc_static_noinline int foo(T p) {
|
||||||
r += *++p;
|
r += *++p;
|
||||||
p += 3;
|
p += 3;
|
||||||
r += *p;
|
r += *p;
|
||||||
|
r += *--p;
|
||||||
|
r += *p--;
|
||||||
|
r += *p;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -801,11 +826,14 @@ make_span_s(T *ptr, size_t count) {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
TEST_CASE("Span codegen") {
|
TEST_CASE("Span codegen") {
|
||||||
char buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
upx_uint8_t buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};
|
||||||
CHECK(foo(buf) == 0 + 2 + 5);
|
CHECK(foo(buf) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
CHECK(foo(make_span_0(buf, 8)) == 0 + 2 + 5);
|
CHECK(foo(make_span_0(buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
CHECK(foo(make_span_p(buf, 8)) == 0 + 2 + 5);
|
CHECK(foo(make_span_p(buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
CHECK(foo(make_span_s(buf, 8)) == 0 + 2 + 5);
|
CHECK(foo(make_span_s(buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
|
CHECK(foo(XSPAN_0_MAKE(upx_uint8_t, buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
|
CHECK(foo(XSPAN_P_MAKE(upx_uint8_t, buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
|
CHECK(foo(XSPAN_S_MAKE(upx_uint8_t, buf, 8)) == 0 + 2 + 5 + 4 + 4 + 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // WITH_XSPAN >= 2
|
#endif // WITH_XSPAN >= 2
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#pragma warning(disable : 4127) // warning C4127: conditional expression is constant
|
#pragma warning(disable : 4127) // warning C4127: conditional expression is constant
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void lzma_compress_config_t::reset() {
|
void lzma_compress_config_t::reset() noexcept {
|
||||||
pos_bits.reset();
|
pos_bits.reset();
|
||||||
lit_pos_bits.reset();
|
lit_pos_bits.reset();
|
||||||
lit_context_bits.reset();
|
lit_context_bits.reset();
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include <zlib/zlib.h>
|
#include <zlib/zlib.h>
|
||||||
#include <zlib/deflate.h>
|
#include <zlib/deflate.h>
|
||||||
|
|
||||||
void zlib_compress_config_t::reset() {
|
void zlib_compress_config_t::reset() noexcept {
|
||||||
mem_clear(this, sizeof(*this));
|
mem_clear(this, sizeof(*this));
|
||||||
|
|
||||||
mem_level.reset();
|
mem_level.reset();
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
#include "../conf.h"
|
#include "../conf.h"
|
||||||
|
|
||||||
void zstd_compress_config_t::reset() { mem_clear(this, sizeof(*this)); }
|
void zstd_compress_config_t::reset() noexcept { mem_clear(this, sizeof(*this)); }
|
||||||
|
|
||||||
#if WITH_ZSTD
|
#if WITH_ZSTD
|
||||||
#include "compress.h"
|
#include "compress.h"
|
||||||
|
|
35
src/conf.h
35
src/conf.h
|
@ -382,15 +382,14 @@ ACC_COMPILE_TIME_ASSERT_HEADER(usizeof(int) == sizeof(int))
|
||||||
|
|
||||||
// An Array allocates memory on the heap, and automatically
|
// An Array allocates memory on the heap, and automatically
|
||||||
// gets destructed when leaving scope or on exceptions.
|
// gets destructed when leaving scope or on exceptions.
|
||||||
#define Array(type, var, size) \
|
#define Array(type, var, n) \
|
||||||
MemBuffer var ## _membuf(mem_size(sizeof(type), size)); \
|
MemBuffer var ## _membuf(mem_size(sizeof(type), (n))); \
|
||||||
type * const var = ACC_STATIC_CAST(type *, var ## _membuf.getVoidPtr())
|
type * const var = ACC_STATIC_CAST(type *, var ## _membuf.getVoidPtr())
|
||||||
|
|
||||||
#define ByteArray(var, size) Array(byte, var, size)
|
#define ByteArray(var, n) Array(byte, var, (n))
|
||||||
|
|
||||||
|
|
||||||
class noncopyable
|
class noncopyable {
|
||||||
{
|
|
||||||
protected:
|
protected:
|
||||||
inline noncopyable() noexcept {}
|
inline noncopyable() noexcept {}
|
||||||
inline ~noncopyable() noexcept {}
|
inline ~noncopyable() noexcept {}
|
||||||
|
@ -597,12 +596,12 @@ struct upx_callback_t
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
template <class T, T default_value_, T min_value_, T max_value_>
|
template <class T, T default_value_, T min_value_, T max_value_>
|
||||||
struct OptVar
|
struct OptVar {
|
||||||
{
|
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
static constexpr T default_value = default_value_;
|
static constexpr T default_value = default_value_;
|
||||||
static constexpr T min_value = min_value_;
|
static constexpr T min_value = min_value_;
|
||||||
static constexpr T max_value = max_value_;
|
static constexpr T max_value = max_value_;
|
||||||
|
static_assert(min_value <= default_value && default_value <= max_value);
|
||||||
|
|
||||||
static void assertValue(const T &v) {
|
static void assertValue(const T &v) {
|
||||||
// info: this generates annoying warnings "unsigned >= 0 is always true"
|
// info: this generates annoying warnings "unsigned >= 0 is always true"
|
||||||
|
@ -659,12 +658,12 @@ struct lzma_compress_config_t
|
||||||
|
|
||||||
unsigned max_num_probs;
|
unsigned max_num_probs;
|
||||||
|
|
||||||
void reset();
|
void reset() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ucl_compress_config_t : public REAL_ucl_compress_config_t
|
struct ucl_compress_config_t : public REAL_ucl_compress_config_t
|
||||||
{
|
{
|
||||||
void reset() { memset(this, 0xff, sizeof(*this)); }
|
void reset() noexcept { memset(this, 0xff, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zlib_compress_config_t
|
struct zlib_compress_config_t
|
||||||
|
@ -677,14 +676,14 @@ struct zlib_compress_config_t
|
||||||
window_bits_t window_bits; // wb
|
window_bits_t window_bits; // wb
|
||||||
strategy_t strategy; // st
|
strategy_t strategy; // st
|
||||||
|
|
||||||
void reset();
|
void reset() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zstd_compress_config_t
|
struct zstd_compress_config_t
|
||||||
{
|
{
|
||||||
unsigned dummy;
|
unsigned dummy;
|
||||||
|
|
||||||
void reset();
|
void reset() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct upx_compress_config_t
|
struct upx_compress_config_t
|
||||||
|
@ -693,7 +692,7 @@ struct upx_compress_config_t
|
||||||
ucl_compress_config_t conf_ucl;
|
ucl_compress_config_t conf_ucl;
|
||||||
zlib_compress_config_t conf_zlib;
|
zlib_compress_config_t conf_zlib;
|
||||||
zstd_compress_config_t conf_zstd;
|
zstd_compress_config_t conf_zstd;
|
||||||
void reset() { conf_lzma.reset(); conf_ucl.reset(); conf_zlib.reset(); conf_zstd.reset(); }
|
void reset() noexcept { conf_lzma.reset(); conf_ucl.reset(); conf_zlib.reset(); conf_zstd.reset(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NULL_cconf ((upx_compress_config_t *) nullptr)
|
#define NULL_cconf ((upx_compress_config_t *) nullptr)
|
||||||
|
@ -714,28 +713,28 @@ struct lzma_compress_result_t
|
||||||
unsigned match_finder_cycles;
|
unsigned match_finder_cycles;
|
||||||
unsigned num_probs; // (computed result)
|
unsigned num_probs; // (computed result)
|
||||||
|
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() noexcept { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ucl_compress_result_t
|
struct ucl_compress_result_t
|
||||||
{
|
{
|
||||||
ucl_uint result[16];
|
ucl_uint result[16];
|
||||||
|
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() noexcept { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zlib_compress_result_t
|
struct zlib_compress_result_t
|
||||||
{
|
{
|
||||||
unsigned dummy;
|
unsigned dummy;
|
||||||
|
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() noexcept { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct zstd_compress_result_t
|
struct zstd_compress_result_t
|
||||||
{
|
{
|
||||||
unsigned dummy;
|
unsigned dummy;
|
||||||
|
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() noexcept { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct upx_compress_result_t
|
struct upx_compress_result_t
|
||||||
|
@ -751,7 +750,7 @@ struct upx_compress_result_t
|
||||||
zlib_compress_result_t result_zlib;
|
zlib_compress_result_t result_zlib;
|
||||||
zstd_compress_result_t result_zstd;
|
zstd_compress_result_t result_zstd;
|
||||||
|
|
||||||
void reset() {
|
void reset() noexcept {
|
||||||
memset(&this->debug, 0, sizeof(this->debug));
|
memset(&this->debug, 0, sizeof(this->debug));
|
||||||
result_lzma.reset(); result_ucl.reset(); result_zlib.reset(); result_zstd.reset();
|
result_lzma.reset(); result_ucl.reset(); result_zlib.reset(); result_zstd.reset();
|
||||||
}
|
}
|
||||||
|
@ -796,7 +795,7 @@ void infoWarning(const char *format, ...) attribute_format(1, 2);
|
||||||
void infoHeader(const char *format, ...) attribute_format(1, 2);
|
void infoHeader(const char *format, ...) attribute_format(1, 2);
|
||||||
void info(const char *format, ...) attribute_format(1, 2);
|
void info(const char *format, ...) attribute_format(1, 2);
|
||||||
void infoHeader();
|
void infoHeader();
|
||||||
void infoWriting(const char *what, long size);
|
void infoWriting(const char *what, upx_int64_t size);
|
||||||
|
|
||||||
// work.cpp
|
// work.cpp
|
||||||
void do_one_file(const char *iname, char *oname);
|
void do_one_file(const char *iname, char *oname);
|
||||||
|
|
18
src/except.h
18
src/except.h
|
@ -49,12 +49,11 @@ public:
|
||||||
private:
|
private:
|
||||||
char *msg = nullptr;
|
char *msg = nullptr;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool is_warning = false; // can be set by subclasses
|
bool is_warning = false; // can be set by subclasses
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable assignment
|
// disable copy assignment
|
||||||
Throwable &operator=(const Throwable &) = delete;
|
Throwable &operator=(const Throwable &) = delete;
|
||||||
// disable dynamic allocation => force throwing by value
|
// disable dynamic allocation => force throwing by value
|
||||||
ACC_CXX_DISABLE_NEW_DELETE
|
ACC_CXX_DISABLE_NEW_DELETE
|
||||||
|
@ -66,7 +65,6 @@ private:
|
||||||
// Exceptions can/should be caught
|
// Exceptions can/should be caught
|
||||||
class Exception : public Throwable {
|
class Exception : public Throwable {
|
||||||
typedef Throwable super;
|
typedef Throwable super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Exception(const char *m = nullptr, int e = 0, bool w = false) noexcept : super(m, e, w) {}
|
Exception(const char *m = nullptr, int e = 0, bool w = false) noexcept : super(m, e, w) {}
|
||||||
};
|
};
|
||||||
|
@ -74,7 +72,6 @@ public:
|
||||||
// Errors should not be caught (or re-thrown)
|
// Errors should not be caught (or re-thrown)
|
||||||
class Error : public Throwable {
|
class Error : public Throwable {
|
||||||
typedef Throwable super;
|
typedef Throwable super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Error(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
Error(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||||
};
|
};
|
||||||
|
@ -85,35 +82,30 @@ public:
|
||||||
|
|
||||||
class OutOfMemoryException : public Exception {
|
class OutOfMemoryException : public Exception {
|
||||||
typedef Exception super;
|
typedef Exception super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OutOfMemoryException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
OutOfMemoryException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class IOException : public Exception {
|
class IOException : public Exception {
|
||||||
typedef Exception super;
|
typedef Exception super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
IOException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
IOException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class EOFException : public IOException {
|
class EOFException : public IOException {
|
||||||
typedef IOException super;
|
typedef IOException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EOFException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
EOFException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class FileNotFoundException : public IOException {
|
class FileNotFoundException : public IOException {
|
||||||
typedef IOException super;
|
typedef IOException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FileNotFoundException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
FileNotFoundException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class FileAlreadyExistsException : public IOException {
|
class FileAlreadyExistsException : public IOException {
|
||||||
typedef IOException super;
|
typedef IOException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FileAlreadyExistsException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
FileAlreadyExistsException(const char *m = nullptr, int e = 0) noexcept : super(m, e) {}
|
||||||
};
|
};
|
||||||
|
@ -124,21 +116,18 @@ public:
|
||||||
|
|
||||||
class OverlayException : public Exception {
|
class OverlayException : public Exception {
|
||||||
typedef Exception super;
|
typedef Exception super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OverlayException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
OverlayException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CantPackException : public Exception {
|
class CantPackException : public Exception {
|
||||||
typedef Exception super;
|
typedef Exception super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CantPackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
CantPackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class UnknownExecutableFormatException : public CantPackException {
|
class UnknownExecutableFormatException : public CantPackException {
|
||||||
typedef CantPackException super;
|
typedef CantPackException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UnknownExecutableFormatException(const char *m = nullptr, bool w = false) noexcept
|
UnknownExecutableFormatException(const char *m = nullptr, bool w = false) noexcept
|
||||||
: super(m, w) {}
|
: super(m, w) {}
|
||||||
|
@ -146,28 +135,24 @@ public:
|
||||||
|
|
||||||
class AlreadyPackedException : public CantPackException {
|
class AlreadyPackedException : public CantPackException {
|
||||||
typedef CantPackException super;
|
typedef CantPackException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AlreadyPackedException(const char *m = nullptr) noexcept : super(m) { is_warning = true; }
|
AlreadyPackedException(const char *m = nullptr) noexcept : super(m) { is_warning = true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class NotCompressibleException : public CantPackException {
|
class NotCompressibleException : public CantPackException {
|
||||||
typedef CantPackException super;
|
typedef CantPackException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NotCompressibleException(const char *m = nullptr) noexcept : super(m) {}
|
NotCompressibleException(const char *m = nullptr) noexcept : super(m) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CantUnpackException : public Exception {
|
class CantUnpackException : public Exception {
|
||||||
typedef Exception super;
|
typedef Exception super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CantUnpackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
CantUnpackException(const char *m = nullptr, bool w = false) noexcept : super(m, 0, w) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class NotPackedException : public CantUnpackException {
|
class NotPackedException : public CantUnpackException {
|
||||||
typedef CantUnpackException super;
|
typedef CantUnpackException super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NotPackedException(const char *m = nullptr) noexcept : super(m, true) {}
|
NotPackedException(const char *m = nullptr) noexcept : super(m, true) {}
|
||||||
};
|
};
|
||||||
|
@ -178,7 +163,6 @@ public:
|
||||||
|
|
||||||
class InternalError : public Error {
|
class InternalError : public Error {
|
||||||
typedef Error super;
|
typedef Error super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
InternalError(const char *m = nullptr) noexcept : super(m, 0) {}
|
InternalError(const char *m = nullptr) noexcept : super(m, 0) {}
|
||||||
};
|
};
|
||||||
|
|
40
src/file.cpp
40
src/file.cpp
|
@ -29,10 +29,10 @@
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// static functions
|
// static file-related util functions; will throw on error
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void FileBase::chmod(const char *name, int mode) {
|
/*static*/ void FileBase::chmod(const char *name, int mode) {
|
||||||
#if (HAVE_CHMOD)
|
#if (HAVE_CHMOD)
|
||||||
if (::chmod(name, mode) != 0)
|
if (::chmod(name, mode) != 0)
|
||||||
throwIOException(name, errno);
|
throwIOException(name, errno);
|
||||||
|
@ -42,7 +42,7 @@ void FileBase::chmod(const char *name, int mode) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileBase::rename(const char *old_, const char *new_) {
|
/*static*/ void FileBase::rename(const char *old_, const char *new_) {
|
||||||
#if (ACC_OS_DOS32) && defined(__DJGPP__)
|
#if (ACC_OS_DOS32) && defined(__DJGPP__)
|
||||||
if (::_rename(old_, new_) != 0)
|
if (::_rename(old_, new_) != 0)
|
||||||
#else
|
#else
|
||||||
|
@ -51,7 +51,7 @@ void FileBase::rename(const char *old_, const char *new_) {
|
||||||
throwIOException("rename error", errno);
|
throwIOException("rename error", errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileBase::unlink(const char *name) {
|
/*static*/ void FileBase::unlink(const char *name) {
|
||||||
if (::unlink(name) != 0)
|
if (::unlink(name) != 0)
|
||||||
throwIOException(name, errno);
|
throwIOException(name, errno);
|
||||||
}
|
}
|
||||||
|
@ -60,11 +60,6 @@ void FileBase::unlink(const char *name) {
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
FileBase::FileBase()
|
|
||||||
: _fd(-1), _flags(0), _shflags(0), _mode(0), _name(nullptr), _offset(0), _length(0) {
|
|
||||||
memset(&st, 0, sizeof(st));
|
|
||||||
}
|
|
||||||
|
|
||||||
FileBase::~FileBase() {
|
FileBase::~FileBase() {
|
||||||
#if 0 && defined(__GNUC__) // debug
|
#if 0 && defined(__GNUC__) // debug
|
||||||
if (isOpen())
|
if (isOpen())
|
||||||
|
@ -160,8 +155,6 @@ upx_off_t FileBase::st_size() const { return _length; }
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
InputFile::InputFile() {}
|
|
||||||
|
|
||||||
void InputFile::sopen(const char *name, int flags, int shflags) {
|
void InputFile::sopen(const char *name, int flags, int shflags) {
|
||||||
close();
|
close();
|
||||||
_name = name;
|
_name = name;
|
||||||
|
@ -212,8 +205,6 @@ upx_off_t InputFile::st_size_orig() const { return _length_orig; }
|
||||||
//
|
//
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
OutputFile::OutputFile() : bytes_written(0) {}
|
|
||||||
|
|
||||||
void OutputFile::sopen(const char *name, int flags, int shflags, int mode) {
|
void OutputFile::sopen(const char *name, int flags, int shflags, int mode) {
|
||||||
close();
|
close();
|
||||||
_name = name;
|
_name = name;
|
||||||
|
@ -261,10 +252,8 @@ void OutputFile::write(SPAN_0(const void) buf, int len) {
|
||||||
return;
|
return;
|
||||||
mem_size_assert(1, len); // sanity check
|
mem_size_assert(1, len); // sanity check
|
||||||
errno = 0;
|
errno = 0;
|
||||||
#if 0
|
NO_fprintf(stderr, "write %p %zd (%p) %d\n", buf.raw_ptr(), buf.raw_size_in_bytes(),
|
||||||
fprintf(stderr, "write %p %zd (%p) %d\n", buf.raw_ptr(), buf.raw_size_in_bytes(),
|
buf.raw_base(), len);
|
||||||
buf.raw_base(), len);
|
|
||||||
#endif
|
|
||||||
long l = acc_safe_hwrite(_fd, raw_bytes(buf, len), len);
|
long l = acc_safe_hwrite(_fd, raw_bytes(buf, len), len);
|
||||||
if (l != len)
|
if (l != len)
|
||||||
throwIOException("write error", errno);
|
throwIOException("write error", errno);
|
||||||
|
@ -347,7 +336,7 @@ upx_off_t OutputFile::unset_extent() {
|
||||||
return _length;
|
return _length;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputFile::dump(const char *name, SPAN_P(const void) buf, int len, int flags) {
|
/*static*/ void OutputFile::dump(const char *name, SPAN_P(const void) buf, int len, int flags) {
|
||||||
if (flags < 0)
|
if (flags < 0)
|
||||||
flags = O_CREAT | O_TRUNC;
|
flags = O_CREAT | O_TRUNC;
|
||||||
flags |= O_WRONLY | O_BINARY;
|
flags |= O_WRONLY | O_BINARY;
|
||||||
|
@ -357,4 +346,19 @@ void OutputFile::dump(const char *name, SPAN_P(const void) buf, int len, int fla
|
||||||
f.closex();
|
f.closex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
//
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
TEST_CASE("file") {
|
||||||
|
InputFile fi;
|
||||||
|
CHECK(!fi.isOpen());
|
||||||
|
CHECK(fi.getFd() == -1);
|
||||||
|
CHECK(fi.st_size() == 0);
|
||||||
|
OutputFile fo;
|
||||||
|
CHECK(!fo.isOpen());
|
||||||
|
CHECK(fo.getFd() == -1);
|
||||||
|
CHECK(fo.getBytesWritten() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
class FileBase {
|
class FileBase {
|
||||||
protected:
|
protected:
|
||||||
FileBase();
|
FileBase() = default;
|
||||||
virtual ~FileBase();
|
virtual ~FileBase();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -49,7 +49,7 @@ public:
|
||||||
virtual void set_extent(upx_off_t offset, upx_off_t length);
|
virtual void set_extent(upx_off_t offset, upx_off_t length);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// static file-related util functions
|
// static file-related util functions; will throw on error
|
||||||
static void chmod(const char *name, int mode);
|
static void chmod(const char *name, int mode);
|
||||||
static void rename(const char *old_, const char *new_);
|
static void rename(const char *old_, const char *new_);
|
||||||
static void unlink(const char *name);
|
static void unlink(const char *name);
|
||||||
|
@ -76,7 +76,7 @@ class InputFile final : public FileBase {
|
||||||
typedef FileBase super;
|
typedef FileBase super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
InputFile();
|
InputFile() = default;
|
||||||
virtual ~InputFile() {}
|
virtual ~InputFile() {}
|
||||||
|
|
||||||
void sopen(const char *name, int flags, int shflags);
|
void sopen(const char *name, int flags, int shflags);
|
||||||
|
@ -100,7 +100,7 @@ class OutputFile final : public FileBase {
|
||||||
typedef FileBase super;
|
typedef FileBase super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OutputFile();
|
OutputFile() = default;
|
||||||
virtual ~OutputFile() {}
|
virtual ~OutputFile() {}
|
||||||
|
|
||||||
void sopen(const char *name, int flags, int shflags, int mode);
|
void sopen(const char *name, int flags, int shflags, int mode);
|
||||||
|
|
|
@ -44,7 +44,7 @@ static void initFilter(Filter *f, byte *buf, unsigned buf_len) {
|
||||||
// get a FilterEntry
|
// get a FilterEntry
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
const FilterImpl::FilterEntry *FilterImpl::getFilter(int id) {
|
/*static*/ const FilterImpl::FilterEntry *FilterImpl::getFilter(int id) {
|
||||||
static upx_uint8_t filter_map[256];
|
static upx_uint8_t filter_map[256];
|
||||||
static upx_std_once_flag init_done;
|
static upx_std_once_flag init_done;
|
||||||
|
|
||||||
|
@ -69,12 +69,12 @@ const FilterImpl::FilterEntry *FilterImpl::getFilter(int id) {
|
||||||
return &filters[index];
|
return &filters[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Filter::isValidFilter(int filter_id) {
|
/*static*/ bool Filter::isValidFilter(int filter_id) {
|
||||||
const FilterImpl::FilterEntry *const fe = FilterImpl::getFilter(filter_id);
|
const FilterImpl::FilterEntry *const fe = FilterImpl::getFilter(filter_id);
|
||||||
return fe != nullptr;
|
return fe != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Filter::isValidFilter(int filter_id, const int *allowed_filters) {
|
/*static*/ bool Filter::isValidFilter(int filter_id, const int *allowed_filters) {
|
||||||
if (!isValidFilter(filter_id))
|
if (!isValidFilter(filter_id))
|
||||||
return false;
|
return false;
|
||||||
if (filter_id == 0)
|
if (filter_id == 0)
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if !(__cplusplus + 0 >= 201703L)
|
#if !(__cplusplus + 0 >= 201703L)
|
||||||
#error "C++ 17 is required"
|
#error "C++17 is required"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_FILE_OFFSET_BITS)
|
#if !defined(_FILE_OFFSET_BITS)
|
||||||
|
|
|
@ -222,9 +222,11 @@ protected:
|
||||||
unsigned soentries;
|
unsigned soentries;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy and assignment
|
// disable copy and move
|
||||||
LeFile(const LeFile &) = delete;
|
LeFile(const LeFile &) = delete;
|
||||||
LeFile &operator=(const LeFile &) = delete;
|
LeFile &operator=(const LeFile &) = delete;
|
||||||
|
LeFile(LeFile &&) = delete;
|
||||||
|
LeFile &operator=(LeFile &&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* already included */
|
#endif /* already included */
|
||||||
|
|
|
@ -211,10 +211,10 @@ void infoWarning(const char *format, ...) {
|
||||||
info("[WARNING] %s\n", buf);
|
info("[WARNING] %s\n", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void infoWriting(const char *what, long size) {
|
void infoWriting(const char *what, upx_int64_t size) {
|
||||||
if (opt->info_mode <= 0)
|
if (opt->info_mode <= 0)
|
||||||
return;
|
return;
|
||||||
info("Writing %s: %ld bytes", what, size);
|
info("Writing %s: %lld bytes", what, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|
|
@ -38,7 +38,7 @@ std::mutex opt_lock_mutex;
|
||||||
// reset
|
// reset
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void Options::reset() {
|
void Options::reset() noexcept {
|
||||||
Options *const o = this;
|
Options *const o = this;
|
||||||
mem_clear(o, sizeof(*o));
|
mem_clear(o, sizeof(*o));
|
||||||
o->crp.reset();
|
o->crp.reset();
|
||||||
|
|
|
@ -110,7 +110,7 @@ struct Options final {
|
||||||
ucl_compress_config_t crp_ucl;
|
ucl_compress_config_t crp_ucl;
|
||||||
zlib_compress_config_t crp_zlib;
|
zlib_compress_config_t crp_zlib;
|
||||||
zstd_compress_config_t crp_zstd;
|
zstd_compress_config_t crp_zstd;
|
||||||
void reset() {
|
void reset() noexcept {
|
||||||
crp_lzma.reset();
|
crp_lzma.reset();
|
||||||
crp_ucl.reset();
|
crp_ucl.reset();
|
||||||
crp_zlib.reset();
|
crp_zlib.reset();
|
||||||
|
@ -169,7 +169,7 @@ struct Options final {
|
||||||
const char *keep_resource;
|
const char *keep_resource;
|
||||||
} win32_pe;
|
} win32_pe;
|
||||||
|
|
||||||
void reset();
|
void reset() noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|
|
@ -99,7 +99,7 @@ protected:
|
||||||
unsigned clear_dirty_stack_len;
|
unsigned clear_dirty_stack_len;
|
||||||
unsigned copy_to_stack_len;
|
unsigned copy_to_stack_len;
|
||||||
|
|
||||||
void reset() { memset(this, 0, sizeof(*this)); }
|
void reset() noexcept { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
LinkerSymbols symbols;
|
LinkerSymbols symbols;
|
||||||
};
|
};
|
||||||
|
|
|
@ -501,7 +501,7 @@ unsigned Packer::findOverlapOverhead(const byte *buf, const byte *tbuf, unsigned
|
||||||
// file i/o utils
|
// file i/o utils
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void Packer::handleStub(InputFile *fif, OutputFile *fo, unsigned size) {
|
/*static*/ void Packer::handleStub(InputFile *fif, OutputFile *fo, unsigned size) {
|
||||||
if (fo) {
|
if (fo) {
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
// copy stub from exe
|
// copy stub from exe
|
||||||
|
|
14
src/packer.h
14
src/packer.h
|
@ -329,9 +329,9 @@ protected:
|
||||||
upx_uint64_t file_size_u; // explicitly unsigned
|
upx_uint64_t file_size_u; // explicitly unsigned
|
||||||
};
|
};
|
||||||
|
|
||||||
PackHeader ph; // must be filled by canUnpack()
|
PackHeader ph = {}; // must be filled by canUnpack()
|
||||||
int ph_format;
|
int ph_format = 0;
|
||||||
int ph_version;
|
int ph_version = 0;
|
||||||
|
|
||||||
// compression buffers
|
// compression buffers
|
||||||
MemBuffer ibuf; // input
|
MemBuffer ibuf; // input
|
||||||
|
@ -347,13 +347,15 @@ protected:
|
||||||
private:
|
private:
|
||||||
// private to checkPatch()
|
// private to checkPatch()
|
||||||
void *last_patch = nullptr;
|
void *last_patch = nullptr;
|
||||||
int last_patch_len;
|
int last_patch_len = 0;
|
||||||
int last_patch_off;
|
int last_patch_off = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// disable copy and assignment
|
// disable copy and move
|
||||||
Packer(const Packer &) = delete;
|
Packer(const Packer &) = delete;
|
||||||
Packer &operator=(const Packer &) = delete;
|
Packer &operator=(const Packer &) = delete;
|
||||||
|
Packer(Packer &&) = delete;
|
||||||
|
Packer &operator=(Packer &&) = delete;
|
||||||
};
|
};
|
||||||
|
|
||||||
int force_method(int method); // (0x80ul<<24)|method
|
int force_method(int method); // (0x80ul<<24)|method
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
// compression method util
|
// compression method util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
bool Packer::isValidCompressionMethod(int method)
|
/*static*/ bool Packer::isValidCompressionMethod(int method)
|
||||||
{
|
{
|
||||||
if (M_IS_LZMA(method))
|
if (M_IS_LZMA(method))
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
// returns number of bytes written to 'out'
|
// returns number of bytes written to 'out'
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*static*/
|
||||||
unsigned Packer::optimizeReloc(unsigned relocnum, SPAN_P(byte) relocs, SPAN_S(byte) out,
|
unsigned Packer::optimizeReloc(unsigned relocnum, SPAN_P(byte) relocs, SPAN_S(byte) out,
|
||||||
SPAN_P(byte) image, unsigned image_size, int bits, bool bswap,
|
SPAN_P(byte) image, unsigned image_size, int bits, bool bswap,
|
||||||
int *big) {
|
int *big) {
|
||||||
|
@ -92,6 +93,7 @@ unsigned Packer::optimizeReloc(unsigned relocnum, SPAN_P(byte) relocs, SPAN_S(by
|
||||||
// allocates 'out' and returns number of relocs written to 'out'
|
// allocates 'out' and returns number of relocs written to 'out'
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*static*/
|
||||||
unsigned Packer::unoptimizeReloc(SPAN_S(const byte) & in, MemBuffer &out, SPAN_P(byte) image,
|
unsigned Packer::unoptimizeReloc(SPAN_S(const byte) & in, MemBuffer &out, SPAN_P(byte) image,
|
||||||
unsigned image_size, int bits, bool bswap) {
|
unsigned image_size, int bits, bool bswap) {
|
||||||
assert(bits == 32 || bits == 64);
|
assert(bits == 32 || bits == 64);
|
||||||
|
|
|
@ -38,17 +38,17 @@
|
||||||
PackHeader::PackHeader() : version(-1), format(-1) {}
|
PackHeader::PackHeader() : version(-1), format(-1) {}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// simple checksum for the header itself (since version 10)
|
// very simple checksum for the header itself (since version 10)
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
static byte get_packheader_checksum(SPAN_S(const byte) buf, int len) {
|
static byte get_packheader_checksum(SPAN_S(const byte) buf, int blen) {
|
||||||
assert(len >= 4);
|
assert(blen >= 4);
|
||||||
assert(get_le32(buf) == UPX_MAGIC_LE32);
|
assert(get_le32(buf) == UPX_MAGIC_LE32);
|
||||||
// printf("1 %d\n", len);
|
// printf("1 %d\n", blen);
|
||||||
buf += 4;
|
buf += 4;
|
||||||
len -= 4;
|
blen -= 4;
|
||||||
unsigned c = 0;
|
unsigned c = 0;
|
||||||
while (len-- > 0)
|
while (blen-- > 0)
|
||||||
c += *buf++;
|
c += *buf++;
|
||||||
c %= 251;
|
c %= 251;
|
||||||
// printf("2 %d\n", c);
|
// printf("2 %d\n", c);
|
||||||
|
|
|
@ -99,9 +99,9 @@ protected:
|
||||||
MemBuffer mb_oimport;
|
MemBuffer mb_oimport;
|
||||||
SPAN_0(byte) oimport = nullptr;
|
SPAN_0(byte) oimport = nullptr;
|
||||||
unsigned soimport;
|
unsigned soimport;
|
||||||
byte *oimpdlls;
|
byte *oimpdlls = nullptr;
|
||||||
unsigned soimpdlls;
|
unsigned soimpdlls;
|
||||||
ImportLinker *ilinker;
|
ImportLinker *ilinker = nullptr;
|
||||||
virtual const char *kernelDll() const { return "KERNEL32.DLL"; }
|
virtual const char *kernelDll() const { return "KERNEL32.DLL"; }
|
||||||
void addKernelImport(const char *);
|
void addKernelImport(const char *);
|
||||||
virtual void addStubImports();
|
virtual void addStubImports();
|
||||||
|
|
21
src/ui.cpp
21
src/ui.cpp
|
@ -352,6 +352,7 @@ void UiPacker::endCallback(bool done) {
|
||||||
// the callback
|
// the callback
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*static*/
|
||||||
void __acc_cdecl UiPacker::progress_callback(upx_callback_p cb, unsigned isize, unsigned osize) {
|
void __acc_cdecl UiPacker::progress_callback(upx_callback_p cb, unsigned isize, unsigned osize) {
|
||||||
// printf("%6d %6d %d\n", isize, osize, state);
|
// printf("%6d %6d %d\n", isize, osize, state);
|
||||||
UiPacker *self = (UiPacker *) cb->user;
|
UiPacker *self = (UiPacker *) cb->user;
|
||||||
|
@ -471,7 +472,7 @@ void UiPacker::uiPackEnd(const OutputFile *fo) {
|
||||||
printSetNl(0);
|
printSetNl(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiPacker::uiPackTotal() {
|
/*static*/ void UiPacker::uiPackTotal() {
|
||||||
uiListTotal();
|
uiListTotal();
|
||||||
uiFooter("Packed");
|
uiFooter("Packed");
|
||||||
}
|
}
|
||||||
|
@ -502,7 +503,7 @@ void UiPacker::uiUnpackEnd(const OutputFile *fo) {
|
||||||
printSetNl(0);
|
printSetNl(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiPacker::uiUnpackTotal() {
|
/*static*/ void UiPacker::uiUnpackTotal() {
|
||||||
uiListTotal(true);
|
uiListTotal(true);
|
||||||
uiFooter("Unpacked");
|
uiFooter("Unpacked");
|
||||||
}
|
}
|
||||||
|
@ -523,7 +524,7 @@ void UiPacker::uiList() {
|
||||||
|
|
||||||
void UiPacker::uiListEnd() { uiUpdate(); }
|
void UiPacker::uiListEnd() { uiUpdate(); }
|
||||||
|
|
||||||
void UiPacker::uiListTotal(bool decompress) {
|
/*static*/ void UiPacker::uiListTotal(bool decompress) {
|
||||||
if (opt->verbose >= 1 && total_files >= 2) {
|
if (opt->verbose >= 1 && total_files >= 2) {
|
||||||
char name[32];
|
char name[32];
|
||||||
upx_safe_snprintf(name, sizeof(name), "[ %u file%s ]", total_files_done,
|
upx_safe_snprintf(name, sizeof(name), "[ %u file%s ]", total_files_done,
|
||||||
|
@ -558,7 +559,7 @@ void UiPacker::uiTestEnd() {
|
||||||
uiUpdate();
|
uiUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiPacker::uiTestTotal() { uiFooter("Tested"); }
|
/*static*/ void UiPacker::uiTestTotal() { uiFooter("Tested"); }
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// info
|
// info
|
||||||
|
@ -585,14 +586,14 @@ bool UiPacker::uiFileInfoStart() {
|
||||||
|
|
||||||
void UiPacker::uiFileInfoEnd() { uiUpdate(); }
|
void UiPacker::uiFileInfoEnd() { uiUpdate(); }
|
||||||
|
|
||||||
void UiPacker::uiFileInfoTotal() {}
|
/*static*/ void UiPacker::uiFileInfoTotal() {}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// util
|
// util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
void UiPacker::uiHeader() {
|
/*static*/ void UiPacker::uiHeader() {
|
||||||
static bool done = false;
|
static upx_std_atomic(bool) done;
|
||||||
if (done)
|
if (done)
|
||||||
return;
|
return;
|
||||||
done = true;
|
done = true;
|
||||||
|
@ -603,8 +604,8 @@ void UiPacker::uiHeader() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiPacker::uiFooter(const char *t) {
|
/*static*/ void UiPacker::uiFooter(const char *t) {
|
||||||
static bool done = false;
|
static upx_std_atomic(bool) done;
|
||||||
if (done)
|
if (done)
|
||||||
return;
|
return;
|
||||||
done = true;
|
done = true;
|
||||||
|
@ -628,7 +629,7 @@ void UiPacker::uiUpdate(upx_off_t fc_len, upx_off_t fu_len) {
|
||||||
update_u_len = p->ph.u_len;
|
update_u_len = p->ph.u_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UiPacker::uiConfirmUpdate() {
|
/*static*/ void UiPacker::uiConfirmUpdate() {
|
||||||
total_files_done++;
|
total_files_done++;
|
||||||
total_fc_len += update_fc_len;
|
total_fc_len += update_fc_len;
|
||||||
total_fu_len += update_fu_len;
|
total_fu_len += update_fu_len;
|
||||||
|
|
6
src/ui.h
6
src/ui.h
|
@ -79,15 +79,15 @@ public:
|
||||||
static void uiHeader();
|
static void uiHeader();
|
||||||
static void uiFooter(const char *n);
|
static void uiFooter(const char *n);
|
||||||
|
|
||||||
int ui_pass;
|
int ui_pass = 0;
|
||||||
int ui_total_passes;
|
int ui_total_passes = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void printInfo(int nl = 0);
|
virtual void printInfo(int nl = 0);
|
||||||
const Packer *p = nullptr;
|
const Packer *p = nullptr;
|
||||||
|
|
||||||
// callback
|
// callback
|
||||||
upx_callback_t cb;
|
upx_callback_t cb = {};
|
||||||
|
|
||||||
// internal state
|
// internal state
|
||||||
struct State;
|
struct State;
|
||||||
|
|
|
@ -130,7 +130,7 @@ inline typename MemBufferBase<T>::pointer raw_index_bytes(const MemBufferBase<T>
|
||||||
#undef XSPAN_REQUIRES_CONVERTIBLE_ANY_DIRECTION
|
#undef XSPAN_REQUIRES_CONVERTIBLE_ANY_DIRECTION
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
//
|
// MemBuffer
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
class MemBuffer final : public MemBufferBase<byte> {
|
class MemBuffer final : public MemBufferBase<byte> {
|
||||||
|
@ -185,7 +185,7 @@ private:
|
||||||
void *last_return_address_dealloc;
|
void *last_return_address_dealloc;
|
||||||
void *last_return_address_fill;
|
void *last_return_address_fill;
|
||||||
void *last_return_address_subref;
|
void *last_return_address_subref;
|
||||||
Debug() { memset(this, 0, sizeof(*this)); }
|
Debug() noexcept { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
Debug debug;
|
Debug debug;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,8 +26,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#ifndef UPX_SNPRINTF_H__
|
|
||||||
#define UPX_SNPRINTF_H__ 1
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// UPX version of string functions, with assertions and sane limits
|
// UPX version of string functions, with assertions and sane limits
|
||||||
|
@ -87,6 +85,4 @@ forceinline upx_rsize_t upx_safe_strlen(const uchar *s) {
|
||||||
return upx_safe_strlen((const char *) s);
|
return upx_safe_strlen((const char *) s);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|
|
@ -445,7 +445,7 @@ int __acc_cdecl_qsort le64_compare_signed(const void *e1, const void *e2) {
|
||||||
// find and mem_replace util
|
// find and mem_replace util
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int find(const void *buf, int blen, const void *what, int wlen) {
|
int find(const void *buf, int blen, const void *what, int wlen) noexcept {
|
||||||
// nullptr is explicitly allowed here
|
// nullptr is explicitly allowed here
|
||||||
if (buf == nullptr || blen < wlen || what == nullptr || wlen <= 0)
|
if (buf == nullptr || blen < wlen || what == nullptr || wlen <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -461,37 +461,37 @@ int find(const void *buf, int blen, const void *what, int wlen) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int find_be16(const void *b, int blen, unsigned what) {
|
int find_be16(const void *b, int blen, unsigned what) noexcept {
|
||||||
byte w[2];
|
byte w[2];
|
||||||
set_be16(w, what);
|
set_be16(w, what);
|
||||||
return find(b, blen, w, 2);
|
return find(b, blen, w, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int find_be32(const void *b, int blen, unsigned what) {
|
int find_be32(const void *b, int blen, unsigned what) noexcept {
|
||||||
byte w[4];
|
byte w[4];
|
||||||
set_be32(w, what);
|
set_be32(w, what);
|
||||||
return find(b, blen, w, 4);
|
return find(b, blen, w, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
int find_be64(const void *b, int blen, upx_uint64_t what) {
|
int find_be64(const void *b, int blen, upx_uint64_t what) noexcept {
|
||||||
byte w[8];
|
byte w[8];
|
||||||
set_be64(w, what);
|
set_be64(w, what);
|
||||||
return find(b, blen, w, 8);
|
return find(b, blen, w, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
int find_le16(const void *b, int blen, unsigned what) {
|
int find_le16(const void *b, int blen, unsigned what) noexcept {
|
||||||
byte w[2];
|
byte w[2];
|
||||||
set_le16(w, what);
|
set_le16(w, what);
|
||||||
return find(b, blen, w, 2);
|
return find(b, blen, w, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int find_le32(const void *b, int blen, unsigned what) {
|
int find_le32(const void *b, int blen, unsigned what) noexcept {
|
||||||
byte w[4];
|
byte w[4];
|
||||||
set_le32(w, what);
|
set_le32(w, what);
|
||||||
return find(b, blen, w, 4);
|
return find(b, blen, w, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
int find_le64(const void *b, int blen, upx_uint64_t what) {
|
int find_le64(const void *b, int blen, upx_uint64_t what) noexcept {
|
||||||
byte w[8];
|
byte w[8];
|
||||||
set_le64(w, what);
|
set_le64(w, what);
|
||||||
return find(b, blen, w, 8);
|
return find(b, blen, w, 8);
|
||||||
|
@ -518,7 +518,7 @@ TEST_CASE("find") {
|
||||||
CHECK(find_le64(b, 15, 0x0f0e0d0c0b0a0908ULL) == -1);
|
CHECK(find_le64(b, 15, 0x0f0e0d0c0b0a0908ULL) == -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mem_replace(void *buf, int blen, const void *what, int wlen, const void *replacement) {
|
int mem_replace(void *buf, int blen, const void *what, int wlen, const void *replacement) noexcept {
|
||||||
byte *b = (byte *) buf;
|
byte *b = (byte *) buf;
|
||||||
int boff = 0;
|
int boff = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
|
@ -26,8 +26,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#ifndef UPX_UTIL_H__
|
|
||||||
#define UPX_UTIL_H__ 1
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
// assert sane memory buffer sizes to protect against integer overflows
|
// assert sane memory buffer sizes to protect against integer overflows
|
||||||
|
@ -80,13 +78,13 @@ template <class T>
|
||||||
T *NewArray(upx_uint64_t n) {
|
T *NewArray(upx_uint64_t n) {
|
||||||
size_t bytes = mem_size(sizeof(T), n); // assert size
|
size_t bytes = mem_size(sizeof(T), n); // assert size
|
||||||
T *array = new T[size_t(n)];
|
T *array = new T[size_t(n)];
|
||||||
if (array) {
|
if (array != nullptr && bytes > 0) {
|
||||||
memset(array, 0xfb, bytes);
|
memset(array, 0xfb, bytes);
|
||||||
(void) VALGRIND_MAKE_MEM_UNDEFINED(array, bytes);
|
(void) VALGRIND_MAKE_MEM_UNDEFINED(array, bytes);
|
||||||
}
|
}
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
#define New(type, n) (NewArray<type>(n))
|
#define New(type, n) (NewArray<type>((n)))
|
||||||
#else
|
#else
|
||||||
#define New(type, n) new type[mem_size_get_n(sizeof(type), (n))]
|
#define New(type, n) new type[mem_size_get_n(sizeof(type), (n))]
|
||||||
#endif
|
#endif
|
||||||
|
@ -142,15 +140,15 @@ void upx_stable_sort(void *array, size_t n, size_t element_size,
|
||||||
// misc. support functions
|
// misc. support functions
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
int find(const void *b, int blen, const void *what, int wlen);
|
int find(const void *b, int blen, const void *what, int wlen) noexcept;
|
||||||
int find_be16(const void *b, int blen, unsigned what);
|
int find_be16(const void *b, int blen, unsigned what) noexcept;
|
||||||
int find_be32(const void *b, int blen, unsigned what);
|
int find_be32(const void *b, int blen, unsigned what) noexcept;
|
||||||
int find_be64(const void *b, int blen, upx_uint64_t what);
|
int find_be64(const void *b, int blen, upx_uint64_t what) noexcept;
|
||||||
int find_le16(const void *b, int blen, unsigned what);
|
int find_le16(const void *b, int blen, unsigned what) noexcept;
|
||||||
int find_le32(const void *b, int blen, unsigned what);
|
int find_le32(const void *b, int blen, unsigned what) noexcept;
|
||||||
int find_le64(const void *b, int blen, upx_uint64_t what);
|
int find_le64(const void *b, int blen, upx_uint64_t what) noexcept;
|
||||||
|
|
||||||
int mem_replace(void *b, int blen, const void *what, int wlen, const void *r);
|
int mem_replace(void *b, int blen, const void *what, int wlen, const void *r) noexcept;
|
||||||
|
|
||||||
char *fn_basename(const char *name);
|
char *fn_basename(const char *name);
|
||||||
int fn_strcmp(const char *n1, const char *n2);
|
int fn_strcmp(const char *n1, const char *n2);
|
||||||
|
@ -166,6 +164,4 @@ unsigned get_ratio(upx_uint64_t u_len, upx_uint64_t c_len);
|
||||||
bool set_method_name(char *buf, size_t size, int method, int level);
|
bool set_method_name(char *buf, size_t size, int method, int level);
|
||||||
void center_string(char *buf, size_t size, const char *s);
|
void center_string(char *buf, size_t size, const char *s);
|
||||||
|
|
||||||
#endif /* already included */
|
|
||||||
|
|
||||||
/* vim:set ts=4 sw=4 et: */
|
/* vim:set ts=4 sw=4 et: */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user