From ae240f746128da0984615f4dc25fe82a2b1ee25b Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Mon, 19 Nov 2012 16:57:44 +0100 Subject: patches/20_zeromap.patch: New patch to fix abortion on mmap(size=0); --- debian/changelog | 6 ++++++ debian/patches/20_zeromap.patch | 32 ++++++++++++++++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 39 insertions(+) create mode 100644 debian/patches/20_zeromap.patch (limited to 'debian') diff --git a/debian/changelog b/debian/changelog index a8f4e6b..6a2bf79 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +gnumach (2:1.3.99.dfsg.git20120923-2) UNRELEASED; urgency=low + + * patches/20_zeromap.patch: New patch to fix abortion on mmap(size=0); + + -- Samuel Thibault Mon, 19 Nov 2012 16:57:00 +0100 + gnumach (2:1.3.99.dfsg.git20120923-1) unstable; urgency=low * New upstream snapshot diff --git a/debian/patches/20_zeromap.patch b/debian/patches/20_zeromap.patch new file mode 100644 index 0000000..7268448 --- /dev/null +++ b/debian/patches/20_zeromap.patch @@ -0,0 +1,32 @@ +As discussed on IRC already, the 'diff != 0' GNU Mach assertion failure +(vm/vm_map.c:1002), that came in with the recent allocator improvement +patch, is as easy as follows to reproduce: + + vm_map(mach_task_self(), 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); + +Before that patch, GNU Mach accepted such a call and returnd 0 -- though +I did not check what effect it actually has. (And I don't think it has +any useful one.) I'm also reading that as of lately (Linux 2.6.12), mmap +with length = 0 is to return EINVAL; and mmap is, I think, the foremost +user of vm_map. + +Richard wants to address this problem, but in the mean time, I'm using +the following patch, which makes such a vm_map call return +KERN_INVALID_ARGUMENT, translated to EINVAL for mmap +(hurd/hurd.h:__hurd_fail). + +--- a/vm/vm_user.c~ 2012-11-19 13:02:18.000000000 +0100 ++++ b/vm/vm_user.c 2012-11-19 13:11:32.000000000 +0100 +@@ -342,6 +342,10 @@ kern_return_t vm_map( + return(KERN_INVALID_ARGUMENT); + } + ++ /* Avoid 'diff != 0' assertion failure later on. */ ++ if (size == 0) ++ return KERN_INVALID_ARGUMENT; ++ + *address = trunc_page(*address); + size = round_page(size); + + + diff --git a/debian/patches/series b/debian/patches/series index 8433870..fa911f4 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,6 +1,7 @@ 00_clean_gfdl.patch 11_ignore_CSIn.patch 12_version_suffix.patch +20_zeromap.patch 50_initrd.patch 60_bigmem.patch 70_dde.patch -- cgit v1.2.3