lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sun, 16 Sep 2012 22:52:18 +0200
From:	richard -rw- weinberger <richard.weinberger@...il.com>
To:	Mark Jackson <mpfj-list@...c.co.uk>
Cc:	lkml <linux-kernel@...r.kernel.org>
Subject: Re: Advice on mmap() "feature"

On Sun, Sep 16, 2012 at 9:21 PM, Mark Jackson <mpfj-list@...c.co.uk> wrote:
> Apologies if this is the wrong place to post this query.  Please feel free
> to redirect me to the correct place.
>
> I have come across a weird (but documented [1]) "feature" of mmap(), which
> is:-
>
> "The mmap()function adds an extra reference to the file associated with the
> file descriptor fildeswhich is not removed by a subsequent close() on that
> file descriptor. This reference is removed when there are no more mappings
> to the file."
>
> In my embedded application, this is resulting in the consumption of
> available file descriptors.
>
> As an example I wrote the following test running on Ubuntu 11.04 64bit.
>
> #include <fcntl.h>
> #include <errno.h>
> #include <stdio.h>
> #include <sys/mman.h>
>
> #define FRAM_SIZE            (64 * 1024)
> #define FRAM_BASE_ADDRESS    0x00000000
>
> int main(int argc, char **argv)
> {
>     int i;
>     for (i = 0; i < 5000; i++)
>     {
>         // open the fram device
>         int m_fdFram = open("/dev/mem", O_RDWR | O_SYNC);
>         if (m_fdFram < 0)
>         {
>             printf("could not open /dev/mem, exiting with errno %d\n",
> errno);
>             return 0;
>         }
>
>         // map the device to memory
>         char *m_pFram = (char *)mmap(    0,
>                                         FRAM_SIZE * sizeof(unsigned short),
>                                         PROT_READ | PROT_WRITE,
>                                         MAP_SHARED,
>                                         m_fdFram,
>                                         FRAM_BASE_ADDRESS);
>         if ((int)m_pFram == -1)
>         {
>             close(m_fdFram);
>             m_fdFram = -1;
>             printf("could not mmap, exiting with errno %d\n", errno);
>             return 0;
>         }
>
>         // now remove the mapping
>         if (m_pFram)
>         munmap(m_pFram, FRAM_SIZE);

You unmap less memory than you map...

-- 
Thanks,
//richard
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists