mirror of
https://github.com/upx/upx
synced 2025-09-28 19:06:07 +08:00
Final 1.10 patches.
committer: mfx <mfx> 977313794 +0000
This commit is contained in:
parent
f6e5623eaa
commit
a24af0ce74
27
BUGS
27
BUGS
|
@ -13,8 +13,12 @@
|
||||||
http://upx.tsx.org
|
http://upx.tsx.org
|
||||||
|
|
||||||
|
|
||||||
Things not (yet) supported:
|
Limitations and other things which are not (yet) supported:
|
||||||
===========================
|
===========================================================
|
||||||
|
|
||||||
|
djgpp2/coff
|
||||||
|
-----------
|
||||||
|
* all overlays (except Allegro pakfiles) are silently stripped
|
||||||
|
|
||||||
dos/exe
|
dos/exe
|
||||||
-------
|
-------
|
||||||
|
@ -22,30 +26,27 @@ dos/exe
|
||||||
* max ~24000 relocation records (...should be enough for everyone ;-)
|
* max ~24000 relocation records (...should be enough for everyone ;-)
|
||||||
* exe + sys combined images
|
* exe + sys combined images
|
||||||
|
|
||||||
wc/le
|
watcom/le
|
||||||
-----
|
---------
|
||||||
* 16-bit selector alias fixups
|
* 16-bit selector alias fixups
|
||||||
* 16-bit offset relocation for objects larger than 4 kbyte
|
* 16-bit offset relocation for objects larger than 4 kB
|
||||||
* 16:16 fixups
|
* 16:16 fixups
|
||||||
|
|
||||||
If you need any of the above (they're very rare), send us an url of a
|
If you need any of the above (they're very rare), send us an URL of a
|
||||||
test file.
|
test file.
|
||||||
|
|
||||||
* 16-bit objects are not loaded into DOS memory
|
* 16-bit objects are not loaded into DOS memory
|
||||||
* There is still a problem with the wdosx extender: if you compress a
|
* There is still a problem with the wdosx extender: if you compress a
|
||||||
wc/le file which does NOT contain the wdosx extender, and after this
|
watcom/le file which does NOT contain the wdosx extender, and after this
|
||||||
you bind the wdosx stub to the compressed file, then it will work.
|
you bind the wdosx stub to the compressed file, then it will work.
|
||||||
Otherwise it won't.
|
Otherwise it won't.
|
||||||
* unpacked pmwlite compressed programs might not work when compressed
|
* unpacked pmwlite compressed programs might not work when compressed
|
||||||
with upx (pmwunlite bug mainly :-)
|
with UPX (this is a bug in pmwunlite)
|
||||||
|
|
||||||
win32/pe
|
win32/pe
|
||||||
--------
|
--------
|
||||||
* writeable shared sections (`--force' *may* work)
|
* writeable shared sections (`--force' *may* work)
|
||||||
* certificates in the image
|
* certificates in the image
|
||||||
* compressing files containing big BSS requires lots of memory
|
* compressing files which contain a big BSS requires lots of memory
|
||||||
|
during compression
|
||||||
djgpp2/coff
|
|
||||||
-----------
|
|
||||||
* all overlays (except Allegro pakfiles) are silently stripped
|
|
||||||
|
|
||||||
|
|
23
README
23
README
|
@ -13,11 +13,27 @@
|
||||||
http://upx.tsx.org
|
http://upx.tsx.org
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WARNING - UNSTABLE BETA VERSION
|
||||||
|
===============================
|
||||||
|
|
||||||
|
All versions 1.1x are unstable beta releases - use them only for testing,
|
||||||
|
and never distribute a program that is packed with them !
|
||||||
|
There will be hidden bugs. Really.
|
||||||
|
|
||||||
|
The current stable release is 1.04, and the next stable release
|
||||||
|
will be called version 1.20.
|
||||||
|
|
||||||
|
The main news since 1.04 are support for bootable Linux kernels ("vmlinuz/386")
|
||||||
|
and direct Linux ELF-to-memory decompression ("linux/elf386"), so there's
|
||||||
|
no reason to use the unstable versions unless you want to try the new formats.
|
||||||
|
|
||||||
|
|
||||||
WELCOME
|
WELCOME
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Welcome to UPX 1.00, the first production release (after almost two years
|
Welcome to UPX 1.0x, the first production release after almost two years
|
||||||
of beta testing).
|
of beta testing.
|
||||||
|
|
||||||
Please don't forget to read the new LICENSE - UPX is now distributed
|
Please don't forget to read the new LICENSE - UPX is now distributed
|
||||||
under the GNU General Public License (GPL) with special exceptions
|
under the GNU General Public License (GPL) with special exceptions
|
||||||
|
@ -38,7 +54,8 @@ and run exactly as before, with no runtime or memory penalty for most
|
||||||
of the supported formats.
|
of the supported formats.
|
||||||
|
|
||||||
UPX supports a number of different executable formats, including
|
UPX supports a number of different executable formats, including
|
||||||
Win95/98/2000/NT programs and DLLs, DOS programs, and Linux executables.
|
Win95/98/ME/NT/2000 programs and DLLs, DOS programs, and Linux
|
||||||
|
executables and kernels.
|
||||||
|
|
||||||
UPX is free software distributed under the term of the GNU General
|
UPX is free software distributed under the term of the GNU General
|
||||||
Public License. Full source code is available.
|
Public License. Full source code is available.
|
||||||
|
|
28
README.1ST
Normal file
28
README.1ST
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
ooooo ooo ooooooooo. ooooooo ooooo
|
||||||
|
`888' `8' `888 `Y88. `8888 d8'
|
||||||
|
888 8 888 .d88' Y888..8P
|
||||||
|
888 8 888ooo88P' `8888'
|
||||||
|
888 8 888 .8PY888.
|
||||||
|
`88. .8' 888 d8' `888b
|
||||||
|
`YbodP' o888o o888o o88888o
|
||||||
|
|
||||||
|
|
||||||
|
The Ultimate Packer for eXecutables
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WARNING - UNSTABLE BETA VERSION
|
||||||
|
===============================
|
||||||
|
|
||||||
|
All versions 1.1x are unstable beta releases - use them only for testing,
|
||||||
|
and never distribute a program that is packed with them !
|
||||||
|
There will be hidden bugs. Really.
|
||||||
|
|
||||||
|
The current stable release is 1.04, and the next stable release
|
||||||
|
will be called version 1.20.
|
||||||
|
|
||||||
|
The main news since 1.04 are support for bootable Linux kernels ("vmlinuz/386")
|
||||||
|
and direct Linux ELF-to-memory decompression ("linux/elf386"), so there's
|
||||||
|
no reason to use the unstable versions unless you want to try the new formats.
|
||||||
|
|
||||||
|
|
|
@ -350,7 +350,7 @@ Introduction
|
||||||
("linux/386").
|
("linux/386").
|
||||||
|
|
||||||
We will start with a general discussion first, but please
|
We will start with a general discussion first, but please
|
||||||
also read the relevant docs for each of the formats.
|
also read the relevant docs for each of the individual formats.
|
||||||
|
|
||||||
Also, there is special support for bootable kernels - see the
|
Also, there is special support for bootable kernels - see the
|
||||||
description of the vmlinuz/386 format.
|
description of the vmlinuz/386 format.
|
||||||
|
@ -537,7 +537,7 @@ How it works:
|
||||||
the file into low memory, then maps the shell (and its PT_INTERP),
|
the file into low memory, then maps the shell (and its PT_INTERP),
|
||||||
and passes control to the shell with the entire decompressed file
|
and passes control to the shell with the entire decompressed file
|
||||||
as the argument after "-c". Known shells are sh, ash, bash, bsh, csh,
|
as the argument after "-c". Known shells are sh, ash, bash, bsh, csh,
|
||||||
ksh, tcsh, pdksh. Restriction: UPX 1.10 cannot use this method
|
ksh, tcsh, pdksh. Restriction: UPX cannot use this method
|
||||||
for shell scripts which use the one optional string argument after
|
for shell scripts which use the one optional string argument after
|
||||||
the shell name in the script (example: "#! /bin/sh option3\n".)
|
the shell name in the script (example: "#! /bin/sh option3\n".)
|
||||||
|
|
||||||
|
|
25
src/Makefile
25
src/Makefile
|
@ -48,6 +48,10 @@ override target = vc6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
# util var for use in the rules - basename of the current target
|
||||||
|
override T = $(basename $@)
|
||||||
|
|
||||||
|
|
||||||
# /***********************************************************************
|
# /***********************************************************************
|
||||||
# // object files
|
# // object files
|
||||||
# ************************************************************************/
|
# ************************************************************************/
|
||||||
|
@ -120,7 +124,7 @@ LDFLAGS = -g
|
||||||
else
|
else
|
||||||
LDFLAGS = -s
|
LDFLAGS = -s
|
||||||
endif
|
endif
|
||||||
LDFLAGS += -Wl,-Map,$(basename $@).map
|
LDFLAGS += -Wl,-Map,$T.map
|
||||||
LDLIBS =
|
LDLIBS =
|
||||||
LDLIBS = -lz
|
LDLIBS = -lz
|
||||||
LIBDIRS =
|
LIBDIRS =
|
||||||
|
@ -230,7 +234,7 @@ CFLAGS = -W4 -WX
|
||||||
CXXFLAGS1 = $(CFLAGS) -GR -GX -EHa
|
CXXFLAGS1 = $(CFLAGS) -GR -GX -EHa
|
||||||
CXXFLAGS2 = $(CFLAGS)
|
CXXFLAGS2 = $(CFLAGS)
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
LINK_LDFLAGS = /link /map:$(basename $@).map
|
LINK_LDFLAGS = /link /map:$T.map
|
||||||
|
|
||||||
ifneq ($(strip $(DOS_LIBDIRS)),)
|
ifneq ($(strip $(DOS_LIBDIRS)),)
|
||||||
LIB := $(DOS_LIBDIRS);$(LIB)
|
LIB := $(DOS_LIBDIRS);$(LIB)
|
||||||
|
@ -245,8 +249,7 @@ ifeq (1,2)
|
||||||
else
|
else
|
||||||
# link against msvcrt.dll
|
# link against msvcrt.dll
|
||||||
CC += -MD
|
CC += -MD
|
||||||
##LDLIBS = $(u).lib zlib.lib setargv.obj
|
LDLIBS = $(DOS_LDLIBS) zlib.lib setargv.obj
|
||||||
LDLIBS = $(u).lib setargv.obj
|
|
||||||
endif
|
endif
|
||||||
ifeq ($(DEBUG),1)
|
ifeq ($(DEBUG),1)
|
||||||
CFLAGS += -Od -ZI
|
CFLAGS += -Od -ZI
|
||||||
|
@ -306,8 +309,7 @@ CXXFLAGS1 = $(CFLAGS)
|
||||||
CXXFLAGS2 = $(CFLAGS)
|
CXXFLAGS2 = $(CFLAGS)
|
||||||
CFLAGS_OUTPUT = -o$@
|
CFLAGS_OUTPUT = -o$@
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
##LDLIBS = $(u).lib zlib.lib
|
LDLIBS = $(DOS_LDLIBS) zlib.lib
|
||||||
LDLIBS = $(u).lib
|
|
||||||
|
|
||||||
ifneq ($(strip $(DOS_LIBDIRS)),)
|
ifneq ($(strip $(DOS_LIBDIRS)),)
|
||||||
LIB := $(DOS_LIBDIRS);$(LIB)
|
LIB := $(DOS_LIBDIRS);$(LIB)
|
||||||
|
@ -363,6 +365,17 @@ $(upx_exe): $(OBJECTS) $(LIBS)
|
||||||
$(LINK_EXE)
|
$(LINK_EXE)
|
||||||
$(STUBEDIT_EXE)
|
$(STUBEDIT_EXE)
|
||||||
|
|
||||||
|
|
||||||
|
ifeq ($(target),djgpp2)
|
||||||
|
cwsbind: $(upx_exe)
|
||||||
|
-rm -f $T.cof
|
||||||
|
$(upx_exe) -1 --coff -o $T.cof $(upx_exe)
|
||||||
|
cat $(DJDIR)/bin/cwsdstub.exe $T.cof > $(upx_exe)
|
||||||
|
$(upx_exe) -d $(upx_exe)
|
||||||
|
$(upx_exe) --best $(upx_exe)
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
unupx:
|
unupx:
|
||||||
$(MAKE) target=vc6 unupx.dll
|
$(MAKE) target=vc6 unupx.dll
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,12 @@ DOS_LIBDIRS := $(DOS_LIBDIRS);$(UDIR)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDLIBS += -l$(u)
|
LDLIBS += -l$(u)
|
||||||
|
DOS_LDLIBS += $(u).lib
|
||||||
|
|
||||||
|
|
||||||
DEFS := $(DEFS)
|
DEFS := $(DEFS)
|
||||||
INCLUDES := $(INCLUDES)
|
INCLUDES := $(INCLUDES)
|
||||||
LIBDIRS := $(LIBDIRS)
|
LIBDIRS := $(LIBDIRS)
|
||||||
LDLIBS := $(LDLIBS)
|
LDLIBS := $(LDLIBS)
|
||||||
|
DOS_LDLIBS := $(DOS_LDLIBS)
|
||||||
|
|
||||||
|
|
11
src/conf.h
11
src/conf.h
|
@ -227,11 +227,6 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
|
||||||
# define MODE_T int
|
# define MODE_T int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_STRCHR)
|
|
||||||
# if defined(HAVE_INDEX)
|
|
||||||
# define strchr index
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
#if !defined(HAVE_STRCASECMP)
|
#if !defined(HAVE_STRCASECMP)
|
||||||
# if defined(HAVE_STRICMP)
|
# if defined(HAVE_STRICMP)
|
||||||
# define strcasecmp stricmp
|
# define strcasecmp stricmp
|
||||||
|
@ -299,8 +294,10 @@ typedef RETSIGTYPE (SIGTYPEENTRY *sig_type)(int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// avoid warnings about shadowing that obsolete index() function
|
// avoid warnings about shadowing global functions
|
||||||
#define index upx_index
|
#define basename upx_basename
|
||||||
|
#define index upx_index
|
||||||
|
#define outp upx_outp
|
||||||
|
|
||||||
// a dummy statement
|
// a dummy statement
|
||||||
#define nop ((void)0)
|
#define nop ((void)0)
|
||||||
|
|
51
src/help.cpp
51
src/help.cpp
|
@ -127,9 +127,21 @@ void show_help(int x)
|
||||||
con_fprintf(f,"Overlay options:\n");
|
con_fprintf(f,"Overlay options:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --overlay=skip don't compress a file with an overlay\n"
|
|
||||||
" --overlay=copy copy any extra data attached to the file [default]\n"
|
" --overlay=copy copy any extra data attached to the file [default]\n"
|
||||||
" --overlay=strip strip any extra data attached to the file [dangerous]\n"
|
" --overlay=strip strip any extra data attached to the file [dangerous]\n"
|
||||||
|
" --overlay=skip don't compress a file with an overlay\n"
|
||||||
|
"\n");
|
||||||
|
fg = con_fg(f,FG_YELLOW);
|
||||||
|
con_fprintf(f,"Options for djgpp2/coff:\n");
|
||||||
|
fg = con_fg(f,fg);
|
||||||
|
con_fprintf(f,
|
||||||
|
" --coff produce COFF output [default: EXE]\n"
|
||||||
|
"\n");
|
||||||
|
fg = con_fg(f,FG_YELLOW);
|
||||||
|
con_fprintf(f,"Options for dos/com:\n");
|
||||||
|
fg = con_fg(f,fg);
|
||||||
|
con_fprintf(f,
|
||||||
|
" --8086 make compressed com work on any 8086\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for dos/exe:\n");
|
con_fprintf(f,"Options for dos/exe:\n");
|
||||||
|
@ -139,24 +151,12 @@ void show_help(int x)
|
||||||
" --no-reloc put no relocations in to the exe header\n"
|
" --no-reloc put no relocations in to the exe header\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for dos/com:\n");
|
|
||||||
fg = con_fg(f,fg);
|
|
||||||
con_fprintf(f,
|
|
||||||
" --8086 make compressed com work on any 8086\n"
|
|
||||||
"\n");
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
|
||||||
con_fprintf(f,"Options for dos/sys:\n");
|
con_fprintf(f,"Options for dos/sys:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --8086 make compressed sys work on any 8086\n"
|
" --8086 make compressed sys work on any 8086\n"
|
||||||
"\n");
|
"\n");
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for djgpp2/coff:\n");
|
|
||||||
fg = con_fg(f,fg);
|
|
||||||
con_fprintf(f,
|
|
||||||
" --coff produce COFF output [default: EXE]\n"
|
|
||||||
"\n");
|
|
||||||
fg = con_fg(f,FG_YELLOW);
|
|
||||||
con_fprintf(f,"Options for watcom/le:\n");
|
con_fprintf(f,"Options for watcom/le:\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
|
@ -177,7 +177,7 @@ void show_help(int x)
|
||||||
"\n");
|
"\n");
|
||||||
#if 0
|
#if 0
|
||||||
fg = con_fg(f,FG_YELLOW);
|
fg = con_fg(f,FG_YELLOW);
|
||||||
con_fprintf(f,"Options for linux/i386\n");
|
con_fprintf(f,"Options for linux/386\n");
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" --script use /usr/local/lib/upx/upx[bd] as decompressor\n"
|
" --script use /usr/local/lib/upx/upx[bd] as decompressor\n"
|
||||||
|
@ -189,12 +189,23 @@ void show_help(int x)
|
||||||
con_fprintf(f,
|
con_fprintf(f,
|
||||||
" file.. executables to (de)compress\n"
|
" file.. executables to (de)compress\n"
|
||||||
"\n"
|
"\n"
|
||||||
"This version supports: dos/exe, dos/com, dos/sys, djgpp2/coff, watcom/le,\n"
|
"This version supports:\n "
|
||||||
" win32/pe, rtm32/pe, tmt/adam, atari/tos\n"
|
"atari/tos, "
|
||||||
" linux/elf386, linux/sh386, linux/386\n"
|
"bvmlinuz/386, "
|
||||||
"%s",
|
"djgpp2/coff, "
|
||||||
"\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.tsx.org\n"
|
"dos/com, "
|
||||||
//"\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n"
|
"dos/exe, "
|
||||||
|
"dos/sys,\n "
|
||||||
|
"linux/386, "
|
||||||
|
"linux/elf386, "
|
||||||
|
"linux/sh386, "
|
||||||
|
"rtm32/pe, "
|
||||||
|
"tmt/adam, "
|
||||||
|
"vmlinuz/386,\n "
|
||||||
|
"watcom/le, "
|
||||||
|
"win32/pe"
|
||||||
|
"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.tsx.org\n"
|
||||||
|
//"\n\nUPX comes with ABSOLUTELY NO WARRANTY; for details type `upx -L'.\n"
|
||||||
"");
|
"");
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1136,6 +1136,14 @@ int main(int argc, char *argv[])
|
||||||
fg = con_fg(f,fg);
|
fg = con_fg(f,fg);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if 1 && !defined(WITH_NRV)
|
||||||
|
{
|
||||||
|
FILE *f = stdout;
|
||||||
|
int fg = con_fg(f,FG_GREEN);
|
||||||
|
con_fprintf(f,"\nINFO: this version does not use the NRV library - compression ratio is worse\n");
|
||||||
|
fg = con_fg(f,fg);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0 && defined(__GLIBC__)
|
#if 0 && defined(__GLIBC__)
|
||||||
//malloc_stats();
|
//malloc_stats();
|
||||||
|
|
|
@ -130,7 +130,7 @@ void PackLinuxI386elf::patchLoader()
|
||||||
upx_compress_config_t conf; memset(&conf, 0xff, sizeof(conf));
|
upx_compress_config_t conf; memset(&conf, 0xff, sizeof(conf));
|
||||||
conf.c_flags = 0;
|
conf.c_flags = 0;
|
||||||
upx_uint result_buffer[16];
|
upx_uint result_buffer[16];
|
||||||
size_t cprLsize;
|
upx_uint cprLsize;
|
||||||
upx_compress(
|
upx_compress(
|
||||||
loader + fold_begin, lsize - fold_begin,
|
loader + fold_begin, lsize - fold_begin,
|
||||||
cprLoader, &cprLsize,
|
cprLoader, &cprLsize,
|
||||||
|
|
|
@ -110,7 +110,7 @@ void PackLinuxI386sh::patchLoader()
|
||||||
upx_compress_config_t conf; memset(&conf, 0xff, sizeof(conf));
|
upx_compress_config_t conf; memset(&conf, 0xff, sizeof(conf));
|
||||||
conf.c_flags = 0;
|
conf.c_flags = 0;
|
||||||
upx_uint result_buffer[16];
|
upx_uint result_buffer[16];
|
||||||
size_t cprLsize;
|
upx_uint cprLsize;
|
||||||
upx_compress(
|
upx_compress(
|
||||||
loader + fold_begin, lsize - fold_begin,
|
loader + fold_begin, lsize - fold_begin,
|
||||||
cprLoader, &cprLsize,
|
cprLoader, &cprLsize,
|
||||||
|
|
|
@ -447,8 +447,8 @@ void PackLinuxI386::patchLoader()
|
||||||
upx_compress_config_t conf; memset(&conf, 0xff, sizeof(conf));
|
upx_compress_config_t conf; memset(&conf, 0xff, sizeof(conf));
|
||||||
conf.c_flags = 0;
|
conf.c_flags = 0;
|
||||||
upx_uint result_buffer[16];
|
upx_uint result_buffer[16];
|
||||||
size_t const uncLsize = lsize - fold_begin;
|
upx_uint const uncLsize = lsize - fold_begin;
|
||||||
size_t cprLsize;
|
upx_uint cprLsize;
|
||||||
upx_compress(
|
upx_compress(
|
||||||
loader + fold_begin, uncLsize,
|
loader + fold_begin, uncLsize,
|
||||||
cprLoader, &cprLsize,
|
cprLoader, &cprLsize,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user