Hi,

I have modified diff. comments, ok?

$ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073490000
a.out(99781) in unknown(): putleakinfo(): Cannot allocate memory
--
ASOU Masato

Index: stdlib/malloc.c
===================================================================
RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v
retrieving revision 1.289
diff -u -p -r1.289 malloc.c
--- stdlib/malloc.c     30 Jun 2023 06:24:58 -0000      1.289
+++ stdlib/malloc.c     7 Sep 2023 20:30:01 -0000
@@ -344,6 +344,22 @@ wrterror(struct dir_info *d, char *msg, 
 }
 
 static void
+wrtwarning(char *func, char *msg, ...)
+{
+       int             saved_errno = errno;
+       va_list         ap;
+
+       dprintf(STDERR_FILENO, "%s(%d) in %s(): ", __progname,
+           getpid(), func == NULL ? func : "unknown");
+       va_start(ap, msg);
+       vdprintf(STDERR_FILENO, msg, ap);
+       va_end(ap);
+       dprintf(STDERR_FILENO, "\n");
+
+       errno = saved_errno;
+}
+
+static void
 rbytes_init(struct dir_info *d)
 {
        arc4random_buf(d->rbytes, sizeof(d->rbytes));
@@ -2353,8 +2369,11 @@ putleakinfo(struct leaktree *leaks, void
                if (page == NULL ||
                    used >= MALLOC_PAGESIZE / sizeof(struct leaknode)) {
                        page = MMAP(MALLOC_PAGESIZE, 0);
-                       if (page == MAP_FAILED)
+                       if (page == MAP_FAILED) {
+                               wrtwarning(f, "%s(): %s", __func__,
+                                   strerror(errno));
                                return;
+                       }
                        used = 0;
                }
                p = &page[used++];

From: Otto Moerbeek <o...@drijf.net>
Date: Thu, 7 Sep 2023 12:43:04 +0200

> On Thu, Sep 07, 2023 at 06:45:55PM +0900, Masato Asou wrote:
> 
>> Hi,
>> 
>> I am using MALLOC_OPTIONS=D and kdump report no information when
>> malloc() exceeds 1073500000 bytes on my OpenBSD box.  I have
>> investigated and found that mmap() faild in putleakinfo().
> 
> I'm ok with the general idea, but see inline
> 
>> 
>> 
>> I used the following program:
>> 
>> #include <err.h>
>> #include <limits.h>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <sys/types.h>
>> 
>> int
>> main(int argc, char *argv[])
>> {
>>         size_t  size;
>>         void    *buf;
>>         char    *end;
>> 
>>         if (argc != 2) {
>>                 fprintf(stderr, "usage: ./a.out size\n");
>>                 exit(1);
>>         }
>> 
>>         size = strtol(argv[1], &end, 0);
>>         if (argv[1] == end) {
>>                 fprintf(stderr, "Invalid argument: %s\n", argv[1]);
>>                 exit(1);
>>         }
>>         if (*end == 'k')
>>                 size *= 1024;
>>         else if (*end == 'm')
>>                 size *= 1024 * 1024;
>>         else if (*end == 'g')
>>                 size *= 1024 * 1024 * 1024;
>> 
>>         if ((buf = malloc(size)) == NULL)
>>                 err(1, "malloc");
>> 
>>         return (0);
>> }
>> 
>> I used this program to perform the following:
>> 
>> $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073490000
>> $ kdump -u malloc                               
>> ******** Start dump a.out *******
>> M=8 I=1 F=0 U=0 J=1 R=0 X=0 C=0 cache=64 G=0
>> Leak report:
>>                  f     sum      #    avg
>>      0xeb017e21c6f 1073490000      1 1073490000 addr2line -e ./a.out
>>      0x1c6f
>> 
>> ******** End dump a.out *******
>> $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073500000
>> $ kdump -u malloc                               
>> $ ls -l ktrace.out 
>> -rw-------  1 asou  asou  64 Sep  7 18:38 ktrace.out
>> $ export LD_LIBRARY_PATH=/usr/obj/lib/libc
>> $ MALLOC_OPTIONS=D ktrace -tu ./a.out 1073500000
>> /usr/src/lib/libc/stdlib/malloc.c: putleakinfo: Cannot allocate memory
>> $ 
>> 
>> 
>> In such a case, shouldn't an error message be displayed?  I made a
>> patch for print error message if mmap() was failed.
>> 
>> comments, ok?
>> --
>> ASOU Masato
>> 
>> Index: lib/libc/stdlib/malloc.c
>> ===================================================================
>> RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v
>> retrieving revision 1.289
>> diff -u -p -r1.289 malloc.c
>> --- lib/libc/stdlib/malloc.c 30 Jun 2023 06:24:58 -0000      1.289
>> +++ lib/libc/stdlib/malloc.c 7 Sep 2023 09:44:59 -0000
>> @@ -2354,7 +2354,14 @@ putleakinfo(struct leaktree *leaks, void
>>                  used >= MALLOC_PAGESIZE / sizeof(struct leaknode)) {
>>                      page = MMAP(MALLOC_PAGESIZE, 0);
>>                      if (page == MAP_FAILED)
>> +                    {
> 
> Brace should be after if (... )
> 
>> +                            char buf[256];
>> +
>> +                            snprintf(buf, sizeof (buf), "%s: %s: %s\n",
>> +                                __FILE__, __func__, strerror(errno));
>> +                            write(STDERR_FILENO, buf, strlen(buf));
>>                              return;
> 
> Please format the message to be like what wrterror() does (without the
> abort of ccurse), using dprintf().
> 
>       -Otto
> 
>> +                    }
>>                      used = 0;
>>              }
>>              p = &page[used++];
>> 
> 

Reply via email to