diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2000-11-26 10:30:18 +0000 | 
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2000-11-26 10:30:18 +0000 | 
| commit | 798c1fd885d527f5ed4df8ae8fe432d3b82fe7af (patch) | |
| tree | b1cdc4cccc75b418d4ebf26459a495ec3a3eefc0 /lib/libc | |
| parent | a16f31237ae8e7c18d79136cad547dd1c77cec38 (diff) | |
Notes
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/stdlib/malloc.3 | 20 | ||||
| -rw-r--r-- | lib/libc/stdlib/malloc.c | 30 | 
2 files changed, 32 insertions, 18 deletions
| diff --git a/lib/libc/stdlib/malloc.3 b/lib/libc/stdlib/malloc.3 index 03feaa37a01b..e7d53f955d08 100644 --- a/lib/libc/stdlib/malloc.3 +++ b/lib/libc/stdlib/malloc.3 @@ -57,7 +57,9 @@  .Ft void  .Fn free "void *ptr"  .Ft char * -.Va malloc_options; +.Va _malloc_options +.Ft void +.Va (*_malloc_message)(char *p1, char *p2, char *p3, char *p4)  .Sh DESCRIPTION  The  .Fn malloc @@ -146,7 +148,7 @@ The ``name'' of the file referenced by the symbolic link named  the value of the environment variable  .Ev MALLOC_OPTIONS ,  and the string pointed to by the global variable -.Va malloc_options  +.Va _malloc_options   will be interpreted, in that order, character by character as flags.  .Pp  Most flags are single letters, @@ -211,8 +213,7 @@ core (using  This option should be set at compile time by including the following in  the source code:  .Bd -literal -offset indent -extern char *malloc_options; -malloc_options = "X"; +_malloc_options = "X";  .Ed  .It Z  This option implicitly sets the @@ -249,8 +250,7 @@ ln -s 'A<' /etc/malloc.conf  To specify in the source that a program does no return value checking  on calls to these functions:  .Bd -literal -offset indent -extern char *malloc_options; -malloc_options = "X"; +_malloc_options = "X";  .Ed  .Sh ENVIRONMENT  The following environment variables affect the execution of the allocation @@ -364,6 +364,14 @@ If the  .Dq A  option is set, all warnings are treated as errors.  .Pp +The +.Va _malloc_message +variable allows the programmer to override the function which emits +the text strings forming the errors and warnings if for some reason +the stderr filedescriptor is not suitable for this. +Please note that doing anything which tries to allocate memory in +this function will certain suicide for the process. +.Pp  The following is a brief description of possible error messages and  their meanings:  .Pp diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index 3b631e86de79..bb6bb6fb8744 100644 --- a/lib/libc/stdlib/malloc.c +++ b/lib/libc/stdlib/malloc.c @@ -251,7 +251,7 @@ static void *malloc_brk;  static struct pgfree *px;  /* compile-time options */ -char *malloc_options; +char *_malloc_options;  /* Name of the current public function */  static char *malloc_func; @@ -269,30 +269,36 @@ static void *imalloc(size_t size);  static void ifree(void *ptr);  static void *irealloc(void *ptr, size_t size); +static void +wrtmessage(char *p1, char *p2, char *p3, char *p4) +{ + +    _write(STDERR_FILENO, p1, strlen(p1)); +    _write(STDERR_FILENO, p2, strlen(p2)); +    _write(STDERR_FILENO, p3, strlen(p3)); +    _write(STDERR_FILENO, p4, strlen(p4)); +} + +void (*_malloc_message)(char *p1, char *p2, char *p3, char *p4) = wrtmessage; +  extern char *__progname;  static void  wrterror(char *p)  { -    char *q = " error: "; -    _write(STDERR_FILENO, __progname, strlen(__progname)); -    _write(STDERR_FILENO, malloc_func, strlen(malloc_func)); -    _write(STDERR_FILENO, q, strlen(q)); -    _write(STDERR_FILENO, p, strlen(p)); +      suicide = 1; +    _malloc_message(__progname, malloc_func, " error: ", p);      abort();  }  static void  wrtwarning(char *p)  { -    char *q = " warning: "; +      if (malloc_abort)  	wrterror(p); -    _write(STDERR_FILENO, __progname, strlen(__progname)); -    _write(STDERR_FILENO, malloc_func, strlen(malloc_func)); -    _write(STDERR_FILENO, q, strlen(q)); -    _write(STDERR_FILENO, p, strlen(p)); +    _malloc_message(__progname, malloc_func, " warning: ", p);  }  /* @@ -403,7 +409,7 @@ malloc_init ()  	} else if (i == 1) {  	    p = getenv("MALLOC_OPTIONS");  	} else { -	    p = malloc_options; +	    p = _malloc_options;  	}  	for (; p && *p; p++) {  	    switch (*p) { | 
