diff -ur openssh-3.4p1.orig/monitor_mm.c openssh-3.4p1/monitor_mm.c
--- openssh-3.4p1.orig/monitor_mm.c	Tue Jun 25 17:29:03 2002
+++ openssh-3.4p1/monitor_mm.c	Wed Jun 26 17:25:46 2002
@@ -30,6 +30,10 @@
 #include <sys/mman.h>
 #endif
 
+#ifndef HAVE_MMAP_ANON_SHARED
+#include <sys/shm.h>
+#endif
+
 #include "ssh.h"
 #include "xmalloc.h"
 #include "log.h"
@@ -90,8 +94,39 @@
 	if (address == MAP_FAILED)
 		fatal("mmap(%lu): %s", (u_long)size, strerror(errno));
 #else
-	fatal("%s: UsePrivilegeSeparation=yes and Compression=yes not supported",
-	    __func__);
+	mm->shm_not_mmap = 0;
+
+	{	
+               int shmid;
+
+               shmid = shmget(IPC_PRIVATE, size, IPC_CREAT|S_IRUSR|S_IWUSR);
+               if (shmid != -1) {
+                       address = shmat(shmid, NULL, 0);
+                       shmctl(shmid, IPC_RMID, NULL);
+                       if (address != MAP_FAILED)
+                               mm->shm_not_mmap = 1;
+               }
+       }
+       if (address == MAP_FAILED) {
+               char tmpname[sizeof(MM_SWAP_TEMPLATE)] = MM_SWAP_TEMPLATE;
+               int tmpfd;
+               int save_errno;
+
+               tmpfd = mkstemp(tmpname);
+               if (tmpfd == -1)
+                       fatal("mkstemp(\"%s\"): %s",
+                           MM_SWAP_TEMPLATE, strerror(errno));
+               unlink(tmpname);
+               ftruncate(tmpfd, size);
+               address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_SHARED,
+                   tmpfd, 0);
+               save_errno = errno;
+               close(tmpfd);
+               errno = save_errno;
+       }
+	if (address == MAP_FAILED)
+		fatal("%s: UsePrivilegeSeparation=yes and Compression=yes not supported",
+		    __func__);
 #endif
 
 	mm->address = address;
@@ -135,8 +170,13 @@
 		fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size,
 		    strerror(errno));
 #else
-	fatal("%s: UsePrivilegeSeparation=yes and Compression=yes not supported",
-	    __func__);
+       if (mm->shm_not_mmap) {
+               if (shmdt(mm->address) == -1)
+                       fatal("shmdt(%p): %s", mm->address, strerror(errno));
+       } else
+	if (munmap(mm->address, mm->size) == -1)
+		fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size,
+		    strerror(errno));
 #endif
 	if (mm->mmalloc == NULL)
 		xfree(mm);
diff -ur openssh-3.4p1.orig/monitor_mm.h openssh-3.4p1/monitor_mm.h
--- openssh-3.4p1.orig/monitor_mm.h	Tue Jun 25 16:01:37 2002
+++ openssh-3.4p1/monitor_mm.h	Wed Jun 26 17:27:25 2002
@@ -40,6 +40,9 @@
 	struct mmtree rb_allocated;
 	void *address;
 	size_t size;
+#ifndef HAVE_MMAP_ANON_SHARED
+	int shm_not_mmap;
+#endif
 
 	struct mm_master *mmalloc;	/* Used to completely share */
 
@@ -52,6 +55,10 @@
 #define MM_MINSIZE		128
 
 #define MM_ADDRESS_END(x)	(void *)((u_char *)(x)->address + (x)->size)
+
+#ifndef HAVE_MMAP_ANON_SHARED
+#define MM_SWAP_TEMPLATE       "/var/run/sshd.mm.XXXXXXXX"
+#endif
 
 struct mm_master *mm_create(struct mm_master *, size_t);
 void mm_destroy(struct mm_master *);
diff -ur openssh-3.4p1.orig/servconf.c openssh-3.4p1/servconf.c
--- openssh-3.4p1.orig/servconf.c	Wed Jun 26 17:06:59 2002
+++ openssh-3.4p1/servconf.c	Wed Jun 26 17:31:47 2002
@@ -275,10 +275,9 @@
 
 #if !defined(HAVE_MMAP_ANON_SHARED)
 	if (use_privsep && options->compression == 1) {
-		error("This platform does not support both privilege "
-		    "separation and compression");
-		error("Compression disabled");
-		options->compression = 0;
+		log("This platform does not support anonymous "
+		    "shared mmap");
+		log("Using the Openwall workaround instead.");
 	}
 #endif
 
