Home | History | Annotate | Download | only in openbsd-compat
      1 /*
      2  * Copyright (c) 2002 Tim Rice.  All rights reserved.
      3  * MAP_FAILED code by Solar Designer.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 /* $Id: xmmap.c,v 1.15 2009/02/16 04:21:40 djm Exp $ */
     27 
     28 #include "includes.h"
     29 
     30 #include <sys/types.h>
     31 #ifdef HAVE_SYS_MMAN_H
     32 #include <sys/mman.h>
     33 #endif
     34 #include <sys/stat.h>
     35 
     36 #ifdef HAVE_FCNTL_H
     37 # include <fcntl.h>
     38 #endif
     39 #include <errno.h>
     40 #include <stdarg.h>
     41 #include <stdlib.h>
     42 #include <string.h>
     43 #include <unistd.h>
     44 
     45 #include "log.h"
     46 
     47 void *
     48 xmmap(size_t size)
     49 {
     50 #ifdef HAVE_MMAP
     51 	void *address;
     52 
     53 # ifdef MAP_ANON
     54 	address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED,
     55 	    -1, (off_t)0);
     56 # else
     57 	address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_SHARED,
     58 	    open("/dev/zero", O_RDWR), (off_t)0);
     59 # endif
     60 
     61 #define MM_SWAP_TEMPLATE "/var/run/sshd.mm.XXXXXXXX"
     62 	if (address == (void *)MAP_FAILED) {
     63 		char tmpname[sizeof(MM_SWAP_TEMPLATE)] = MM_SWAP_TEMPLATE;
     64 		int tmpfd;
     65 		mode_t old_umask;
     66 
     67 		old_umask = umask(0177);
     68 		tmpfd = mkstemp(tmpname);
     69 		umask(old_umask);
     70 		if (tmpfd == -1)
     71 			fatal("mkstemp(\"%s\"): %s",
     72 			    MM_SWAP_TEMPLATE, strerror(errno));
     73 		unlink(tmpname);
     74 		if (ftruncate(tmpfd, size) != 0)
     75 			fatal("%s: ftruncate: %s", __func__, strerror(errno));
     76 		address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_SHARED,
     77 		    tmpfd, (off_t)0);
     78 		close(tmpfd);
     79 	}
     80 
     81 	return (address);
     82 #else
     83 	fatal("%s: UsePrivilegeSeparation=yes and Compression=yes not supported",
     84 	    __func__);
     85 #endif /* HAVE_MMAP */
     86 
     87 }
     88 
     89