mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
Update.
2001-08-11 Ulrich Drepper <drepper@redhat.com> * malloc/malloc.c (ptmalloc_init): Don't call getenv five times. Instead use new function next_env_entry which iterates over the environment once. * sysdeps/arm/dl-machine.h (elf_machine_runtime_setup): Only set _dl_profile_map for the right object. * elf/dl-reloc.c (_dl_relocate_object): Allocate l_reloc_result only if consider_profiling is != 0, not if _dl_profile != NULL. * sysdeps/generic/dl-environ.c (_dl_next_ld_env_entry): Optimize a bit. Now returns pointer to first character set "LD_". * elf/rtld.c (process_envvars): Adjust for change above. * sysdeps/unix/sysv/linux/dl-librecon.h (EXTRA_LD_ENVVARS): Likewise. * sysdeps/unix/sysv/linux/i386/dl-librecon.h (EXTRA_LD_ENVVARS): Likewise. 2001-08-10 Wolfram Gloger <wg@malloc.de> * malloc/malloc.c (grow_heap): Use mmap() rather than mprotect() to allocate new memory, for better performance with Linux-2.4.x.
This commit is contained in:
parent
6ae9b99ef2
commit
67c94753e3
24
ChangeLog
24
ChangeLog
@ -1,3 +1,27 @@
|
|||||||
|
2001-08-11 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* malloc/malloc.c (ptmalloc_init): Don't call getenv five times.
|
||||||
|
Instead use new function next_env_entry which iterates over the
|
||||||
|
environment once.
|
||||||
|
|
||||||
|
* sysdeps/arm/dl-machine.h (elf_machine_runtime_setup): Only set
|
||||||
|
_dl_profile_map for the right object.
|
||||||
|
|
||||||
|
* elf/dl-reloc.c (_dl_relocate_object): Allocate l_reloc_result
|
||||||
|
only if consider_profiling is != 0, not if _dl_profile != NULL.
|
||||||
|
|
||||||
|
* sysdeps/generic/dl-environ.c (_dl_next_ld_env_entry): Optimize a bit.
|
||||||
|
Now returns pointer to first character set "LD_".
|
||||||
|
* elf/rtld.c (process_envvars): Adjust for change above.
|
||||||
|
* sysdeps/unix/sysv/linux/dl-librecon.h (EXTRA_LD_ENVVARS): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/dl-librecon.h (EXTRA_LD_ENVVARS):
|
||||||
|
Likewise.
|
||||||
|
|
||||||
|
2001-08-10 Wolfram Gloger <wg@malloc.de>
|
||||||
|
|
||||||
|
* malloc/malloc.c (grow_heap): Use mmap() rather than mprotect()
|
||||||
|
to allocate new memory, for better performance with Linux-2.4.x.
|
||||||
|
|
||||||
2001-08-10 Ulrich Drepper <drepper@redhat.com>
|
2001-08-10 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* posix/getopt_init.c (__getopt_clean_environment): Avoid making
|
* posix/getopt_init.c (__getopt_clean_environment): Avoid making
|
||||||
|
@ -91,7 +91,7 @@ cannot make segment writable for relocation"));
|
|||||||
#include "dynamic-link.h"
|
#include "dynamic-link.h"
|
||||||
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
|
ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling);
|
||||||
|
|
||||||
if (__builtin_expect (_dl_profile != NULL, 0))
|
if (__builtin_expect (consider_profiling, 0))
|
||||||
{
|
{
|
||||||
/* Allocate the array which will contain the already found
|
/* Allocate the array which will contain the already found
|
||||||
relocations. If the shared object lacks a PLT (for example
|
relocations. If the shared object lacks a PLT (for example
|
||||||
|
62
elf/rtld.c
62
elf/rtld.c
@ -1282,10 +1282,12 @@ warning: debug option `%s' unknown; try LD_DEBUG=help\n", startp);
|
|||||||
/* Process all environments variables the dynamic linker must recognize.
|
/* Process all environments variables the dynamic linker must recognize.
|
||||||
Since all of them start with `LD_' we are a bit smarter while finding
|
Since all of them start with `LD_' we are a bit smarter while finding
|
||||||
all the entries. */
|
all the entries. */
|
||||||
|
extern char **_environ;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_envvars (enum mode *modep)
|
process_envvars (enum mode *modep)
|
||||||
{
|
{
|
||||||
char **runp = NULL;
|
char **runp = _environ;
|
||||||
char *envline;
|
char *envline;
|
||||||
enum mode mode = normal;
|
enum mode mode = normal;
|
||||||
char *debug_output = NULL;
|
char *debug_output = NULL;
|
||||||
@ -1301,98 +1303,98 @@ process_envvars (enum mode *modep)
|
|||||||
/* This is a "LD_" variable at the end of the string without
|
/* This is a "LD_" variable at the end of the string without
|
||||||
a '=' character. Ignore it since otherwise we will access
|
a '=' character. Ignore it since otherwise we will access
|
||||||
invalid memory below. */
|
invalid memory below. */
|
||||||
break;
|
continue;
|
||||||
|
|
||||||
switch (len - 3)
|
switch (len)
|
||||||
{
|
{
|
||||||
case 4:
|
case 4:
|
||||||
/* Warning level, verbose or not. */
|
/* Warning level, verbose or not. */
|
||||||
if (memcmp (&envline[3], "WARN", 4) == 0)
|
if (memcmp (envline, "WARN", 4) == 0)
|
||||||
_dl_verbose = envline[8] != '\0';
|
_dl_verbose = envline[5] != '\0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
/* Debugging of the dynamic linker? */
|
/* Debugging of the dynamic linker? */
|
||||||
if (memcmp (&envline[3], "DEBUG", 5) == 0)
|
if (memcmp (envline, "DEBUG", 5) == 0)
|
||||||
process_dl_debug (&envline[9]);
|
process_dl_debug (&envline[6]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
/* Print information about versions. */
|
/* Print information about versions. */
|
||||||
if (memcmp (&envline[3], "VERBOSE", 7) == 0)
|
if (memcmp (envline, "VERBOSE", 7) == 0)
|
||||||
{
|
{
|
||||||
version_info = envline[11] != '\0';
|
version_info = envline[8] != '\0';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* List of objects to be preloaded. */
|
/* List of objects to be preloaded. */
|
||||||
if (memcmp (&envline[3], "PRELOAD", 7) == 0)
|
if (memcmp (envline, "PRELOAD", 7) == 0)
|
||||||
{
|
{
|
||||||
preloadlist = &envline[11];
|
preloadlist = &envline[8];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Which shared object shall be profiled. */
|
/* Which shared object shall be profiled. */
|
||||||
if (memcmp (&envline[3], "PROFILE", 7) == 0)
|
if (memcmp (envline, "PROFILE", 7) == 0)
|
||||||
_dl_profile = &envline[11];
|
_dl_profile = &envline[8];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
/* Do we bind early? */
|
/* Do we bind early? */
|
||||||
if (memcmp (&envline[3], "BIND_NOW", 8) == 0)
|
if (memcmp (envline, "BIND_NOW", 8) == 0)
|
||||||
{
|
{
|
||||||
_dl_lazy = envline[12] == '\0';
|
_dl_lazy = envline[9] == '\0';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (memcmp (&envline[3], "BIND_NOT", 8) == 0)
|
if (memcmp (envline, "BIND_NOT", 8) == 0)
|
||||||
_dl_bind_not = envline[12] != '\0';
|
_dl_bind_not = envline[9] != '\0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
/* Test whether we want to see the content of the auxiliary
|
/* Test whether we want to see the content of the auxiliary
|
||||||
array passed up from the kernel. */
|
array passed up from the kernel. */
|
||||||
if (memcmp (&envline[3], "SHOW_AUXV", 9) == 0)
|
if (memcmp (envline, "SHOW_AUXV", 9) == 0)
|
||||||
_dl_show_auxv ();
|
_dl_show_auxv ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 10:
|
||||||
/* Mask for the important hardware capabilities. */
|
/* Mask for the important hardware capabilities. */
|
||||||
if (memcmp (&envline[3], "HWCAP_MASK", 10) == 0)
|
if (memcmp (envline, "HWCAP_MASK", 10) == 0)
|
||||||
_dl_hwcap_mask = __strtoul_internal (&envline[14], NULL, 0, 0);
|
_dl_hwcap_mask = __strtoul_internal (&envline[11], NULL, 0, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 11:
|
||||||
/* Path where the binary is found. */
|
/* Path where the binary is found. */
|
||||||
if (!__libc_enable_secure
|
if (!__libc_enable_secure
|
||||||
&& memcmp (&envline[3], "ORIGIN_PATH", 11) == 0)
|
&& memcmp (envline, "ORIGIN_PATH", 11) == 0)
|
||||||
_dl_origin_path = &envline[15];
|
_dl_origin_path = &envline[12];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
/* The library search path. */
|
/* The library search path. */
|
||||||
if (memcmp (&envline[3], "LIBRARY_PATH", 12) == 0)
|
if (memcmp (envline, "LIBRARY_PATH", 12) == 0)
|
||||||
{
|
{
|
||||||
library_path = &envline[16];
|
library_path = &envline[13];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Where to place the profiling data file. */
|
/* Where to place the profiling data file. */
|
||||||
if (memcmp (&envline[3], "DEBUG_OUTPUT", 12) == 0)
|
if (memcmp (envline, "DEBUG_OUTPUT", 12) == 0)
|
||||||
{
|
{
|
||||||
debug_output = &envline[16];
|
debug_output = &envline[13];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memcmp (&envline[3], "DYNAMIC_WEAK", 12) == 0)
|
if (memcmp (envline, "DYNAMIC_WEAK", 12) == 0)
|
||||||
_dl_dynamic_weak = 1;
|
_dl_dynamic_weak = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 14:
|
case 14:
|
||||||
/* Where to place the profiling data file. */
|
/* Where to place the profiling data file. */
|
||||||
if (!__libc_enable_secure
|
if (!__libc_enable_secure
|
||||||
&& memcmp (&envline[3], "PROFILE_OUTPUT", 14) == 0)
|
&& memcmp (envline, "PROFILE_OUTPUT", 14) == 0)
|
||||||
{
|
{
|
||||||
_dl_profile_output = &envline[18];
|
_dl_profile_output = &envline[15];
|
||||||
if (*_dl_profile_output == '\0')
|
if (*_dl_profile_output == '\0')
|
||||||
_dl_profile_output = "/var/tmp";
|
_dl_profile_output = "/var/tmp";
|
||||||
}
|
}
|
||||||
@ -1400,7 +1402,7 @@ process_envvars (enum mode *modep)
|
|||||||
|
|
||||||
case 20:
|
case 20:
|
||||||
/* The mode of the dynamic linker can be set. */
|
/* The mode of the dynamic linker can be set. */
|
||||||
if (memcmp (&envline[3], "TRACE_LOADED_OBJECTS", 20) == 0)
|
if (memcmp (envline, "TRACE_LOADED_OBJECTS", 20) == 0)
|
||||||
mode = trace;
|
mode = trace;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1680,6 +1680,42 @@ ptmalloc_init_all __MALLOC_P((void))
|
|||||||
static void ptmalloc_init __MALLOC_P ((void)) __attribute__ ((constructor));
|
static void ptmalloc_init __MALLOC_P ((void)) __attribute__ ((constructor));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
#include <string.h>
|
||||||
|
extern char **_environ;
|
||||||
|
|
||||||
|
static char *
|
||||||
|
internal_function
|
||||||
|
next_env_entry (char ***position)
|
||||||
|
{
|
||||||
|
char **current = *position;
|
||||||
|
char *result = NULL;
|
||||||
|
|
||||||
|
while (*current != NULL)
|
||||||
|
{
|
||||||
|
if (__builtin_expect ((*current)[0] == 'M', 0)
|
||||||
|
&& (*current)[1] == 'A'
|
||||||
|
&& (*current)[2] == 'L'
|
||||||
|
&& (*current)[3] == 'L'
|
||||||
|
&& (*current)[4] == 'O'
|
||||||
|
&& (*current)[5] == 'C'
|
||||||
|
&& (*current)[6] == '_')
|
||||||
|
{
|
||||||
|
result = &(*current)[7];
|
||||||
|
|
||||||
|
/* Save current position for next visit. */
|
||||||
|
*position = ++current;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
++current;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ptmalloc_init __MALLOC_P((void))
|
ptmalloc_init __MALLOC_P((void))
|
||||||
#else
|
#else
|
||||||
@ -1728,6 +1764,52 @@ ptmalloc_init __MALLOC_P((void))
|
|||||||
__free_hook = save_free_hook;
|
__free_hook = save_free_hook;
|
||||||
#endif
|
#endif
|
||||||
secure = __libc_enable_secure;
|
secure = __libc_enable_secure;
|
||||||
|
#ifdef _LIBC
|
||||||
|
s = NULL;
|
||||||
|
{
|
||||||
|
char **runp = _environ;
|
||||||
|
char *envline;
|
||||||
|
|
||||||
|
while (__builtin_expect ((envline = next_env_entry (&runp)) != NULL,
|
||||||
|
0))
|
||||||
|
{
|
||||||
|
size_t len = strcspn (envline, "=");
|
||||||
|
|
||||||
|
if (envline[len] != '=')
|
||||||
|
/* This is a "MALLOC_" variable at the end of the string
|
||||||
|
without a '=' character. Ignore it since otherwise we
|
||||||
|
will access invalid memory below. */
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (len)
|
||||||
|
{
|
||||||
|
case 6:
|
||||||
|
if (memcmp (envline, "CHECK_", 6) == 0)
|
||||||
|
s = &envline[7];
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
if (! secure && memcmp (envline, "TOP_PAD_", 8) == 0)
|
||||||
|
mALLOPt(M_TOP_PAD, atoi(&envline[9]));
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (! secure && memcmp (envline, "MMAP_MAX_", 9) == 0)
|
||||||
|
mALLOPt(M_MMAP_MAX, atoi(&envline[10]));
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
if (! secure)
|
||||||
|
{
|
||||||
|
if (memcmp (envline, "TRIM_THRESHOLD_", 15) == 0)
|
||||||
|
mALLOPt(M_TRIM_THRESHOLD, atoi(&envline[16]));
|
||||||
|
else if (memcmp (envline, "MMAP_THRESHOLD_", 15) == 0)
|
||||||
|
mALLOPt(M_MMAP_THRESHOLD, atoi(&envline[16]));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (! secure)
|
if (! secure)
|
||||||
{
|
{
|
||||||
if((s = getenv("MALLOC_TRIM_THRESHOLD_")))
|
if((s = getenv("MALLOC_TRIM_THRESHOLD_")))
|
||||||
@ -1740,6 +1822,7 @@ ptmalloc_init __MALLOC_P((void))
|
|||||||
mALLOPt(M_MMAP_MAX, atoi(s));
|
mALLOPt(M_MMAP_MAX, atoi(s));
|
||||||
}
|
}
|
||||||
s = getenv("MALLOC_CHECK_");
|
s = getenv("MALLOC_CHECK_");
|
||||||
|
#endif
|
||||||
if(s) {
|
if(s) {
|
||||||
if(s[0]) mALLOPt(M_CHECK_ACTION, (int)(s[0] - '0'));
|
if(s[0]) mALLOPt(M_CHECK_ACTION, (int)(s[0] - '0'));
|
||||||
__malloc_check_init();
|
__malloc_check_init();
|
||||||
@ -2050,7 +2133,8 @@ new_heap(size) size_t size;
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(mprotect(p2, size, PROT_READ|PROT_WRITE) != 0) {
|
if(MMAP(p2, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED)
|
||||||
|
== (char *) MAP_FAILED) {
|
||||||
munmap(p2, HEAP_MAX_SIZE);
|
munmap(p2, HEAP_MAX_SIZE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2078,7 +2162,8 @@ grow_heap(h, diff) heap_info *h; long diff;
|
|||||||
new_size = (long)h->size + diff;
|
new_size = (long)h->size + diff;
|
||||||
if(new_size > HEAP_MAX_SIZE)
|
if(new_size > HEAP_MAX_SIZE)
|
||||||
return -1;
|
return -1;
|
||||||
if(mprotect((char *)h + h->size, diff, PROT_READ|PROT_WRITE) != 0)
|
if(MMAP((char *)h + h->size, diff, PROT_READ|PROT_WRITE,
|
||||||
|
MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED)
|
||||||
return -2;
|
return -2;
|
||||||
} else {
|
} else {
|
||||||
new_size = (long)h->size + diff;
|
new_size = (long)h->size + diff;
|
||||||
|
@ -103,7 +103,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
|||||||
if (profile)
|
if (profile)
|
||||||
{
|
{
|
||||||
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
got[2] = (Elf32_Addr) &_dl_runtime_profile;
|
||||||
/* Say that we really want profiling and the timers are started. */
|
|
||||||
|
if (_dl_name_match_p (_dl_profile, l))
|
||||||
|
/* Say that we really want profiling and the timers are
|
||||||
|
started. */
|
||||||
_dl_profile_map = l;
|
_dl_profile_map = l;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Environment handling for dynamic loader.
|
/* Environment handling for dynamic loader.
|
||||||
Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -32,21 +32,22 @@ _dl_next_ld_env_entry (char ***position)
|
|||||||
char **current = *position;
|
char **current = *position;
|
||||||
char *result = NULL;
|
char *result = NULL;
|
||||||
|
|
||||||
if (current == NULL)
|
while (*current != NULL)
|
||||||
/* We start over. */
|
|
||||||
current = _environ;
|
|
||||||
|
|
||||||
while (result == NULL && *current != NULL)
|
|
||||||
{
|
{
|
||||||
if ((*current)[0] == 'L' && (*current)[1] == 'D' && (*current)[2] == '_')
|
if (__builtin_expect ((*current)[0] == 'L', 0)
|
||||||
result = *current;
|
&& (*current)[1] == 'D' && (*current)[2] == '_')
|
||||||
|
{
|
||||||
|
result = &(*current)[3];
|
||||||
|
|
||||||
|
/* Save current position for next visit. */
|
||||||
|
*position = ++current;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
++current;
|
++current;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save current position for next visit. */
|
|
||||||
*position = current;
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,10 +24,10 @@
|
|||||||
/* Recognizing extra environment variables. */
|
/* Recognizing extra environment variables. */
|
||||||
#define EXTRA_LD_ENVVARS \
|
#define EXTRA_LD_ENVVARS \
|
||||||
case 13: \
|
case 13: \
|
||||||
if (memcmp (&envline[3], "ASSUME_KERNEL", 13) == 0) \
|
if (memcmp (envline, "ASSUME_KERNEL", 13) == 0) \
|
||||||
{ \
|
{ \
|
||||||
unsigned long int i, j, osversion = 0; \
|
unsigned long int i, j, osversion = 0; \
|
||||||
char *p = &envline[17], *q; \
|
char *p = &envline[14], *q; \
|
||||||
\
|
\
|
||||||
for (i = 0; i < 3; i++, p = q + 1) \
|
for (i = 0; i < 3; i++, p = q + 1) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -49,10 +49,10 @@
|
|||||||
/* Recognizing extra environment variables. */
|
/* Recognizing extra environment variables. */
|
||||||
#define EXTRA_LD_ENVVARS \
|
#define EXTRA_LD_ENVVARS \
|
||||||
case 13: \
|
case 13: \
|
||||||
if (memcmp (&envline[3], "ASSUME_KERNEL", 13) == 0) \
|
if (memcmp (envline, "ASSUME_KERNEL", 13) == 0) \
|
||||||
{ \
|
{ \
|
||||||
unsigned long int i, j, osversion = 0; \
|
unsigned long int i, j, osversion = 0; \
|
||||||
char *p = &envline[17], *q; \
|
char *p = &envline[14], *q; \
|
||||||
\
|
\
|
||||||
for (i = 0; i < 3; i++, p = q + 1) \
|
for (i = 0; i < 3; i++, p = q + 1) \
|
||||||
{ \
|
{ \
|
||||||
@ -72,9 +72,9 @@
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
case 15: \
|
case 15: \
|
||||||
if (memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0) \
|
if (memcmp (envline, "LIBRARY_VERSION", 15) == 0) \
|
||||||
{ \
|
{ \
|
||||||
_dl_correct_cache_id = envline[19] == '5' ? 2 : 3; \
|
_dl_correct_cache_id = envline[16] == '5' ? 2 : 3; \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user