Patchwork linux-user: use default mmap_min_addr 65536 when /proc/sys/vm/mmap_min_addr cannot be read

login
register
mail settings
Submitter Martin Jansa
Date May 13, 2010, 1:17 p.m.
Message ID <1273756645-11149-1-git-send-email-Martin.Jansa@gmail.com>
Download mbox | patch
Permalink /patch/52509/
State New
Headers show

Comments

Martin Jansa - May 13, 2010, 1:17 p.m.
* 65536 is default at least for ubuntu and fedora.
* after http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0e1a6ef2dea88101b056b6d9984f3325c5efced3
  it's not readable by normal user on many systems
* there is patch to enable read-only access again
  http://git.kernel.org/?p=linux/kernel/git/jmorris/security-testing-2.6.git;a=commitdiff;h=822cceec7248013821d655545ea45d1c6a9d15b3
  but that's not applied in many distributions
* please consider this workaround

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 linux-user/main.c |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
Richard Henderson - May 13, 2010, 4:59 p.m.
On 05/13/2010 06:17 AM, Martin Jansa wrote:
> @@ -2899,8 +2900,14 @@ int main(int argc, char **argv, char **envp)
>              if (fscanf(fp, "%lu", &tmp) == 1) {
>                  mmap_min_addr = tmp;
>                  qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
> +            } else {
> +                qemu_log("cannot read value from /proc/sys/vm/mmap_min_addr, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
> +                mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
>              }
>              fclose(fp);
> +        } else {
> +            qemu_log("cannot open /proc/sys/vm/mmap_min_addr for reading, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
> +            mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
>          }
>      }

Perhaps you can combine these two else clauses?


r~
Martin Jansa - May 13, 2010, 7:26 p.m.
On Thu, May 13, 2010 at 09:59:24AM -0700, Richard Henderson wrote:
> On 05/13/2010 06:17 AM, Martin Jansa wrote:
> > @@ -2899,8 +2900,14 @@ int main(int argc, char **argv, char **envp)
> >              if (fscanf(fp, "%lu", &tmp) == 1) {
> >                  mmap_min_addr = tmp;
> >                  qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
> > +            } else {
> > +                qemu_log("cannot read value from /proc/sys/vm/mmap_min_addr, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
> > +                mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
> >              }
> >              fclose(fp);
> > +        } else {
> > +            qemu_log("cannot open /proc/sys/vm/mmap_min_addr for reading, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
> > +            mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
> >          }
> >      }
> 
> Perhaps you can combine these two else clauses?

Sure it would be possible, but while trying to find why qemu doesn't
work on someone box but works on mine I wanted to distinguish between
cannot open and cannot read.

Also if I combine it in test ie initialize mmap_min_addr with -1, and 
then check if it changed after read (because 0 is also valid value), 
or moving fopen and fscanf to one condition, then it gets IMHO as 
complicated as those 2 else clauses.

BTW: I noticed that qemu-arm works ok when mmap_min_addr is low enough
(and doesn't have to be zero).

my box had mmap_min_addr 4096 and qemu-arm worked fine even without
reading it

and the other boxes had mmap_min_addr = 64K and failed later to mmap.

Regards,
Richard Henderson - May 14, 2010, 1:11 p.m.
On 05/13/2010 12:26 PM, Martin Jansa wrote:
> BTW: I noticed that qemu-arm works ok when mmap_min_addr is low enough
> (and doesn't have to be zero).
> 
> my box had mmap_min_addr 4096 and qemu-arm worked fine even without
> reading it

Paul Brook's c581deda322080e8beb88b2e468d4af54454e4b3 had the side
effect of working around mmap_min_addr without having to read it.
Of course, if we *can* read mmap_min_addr, his patch will do less work.


r~

Patch

diff --git a/linux-user/main.c b/linux-user/main.c
index 18b52c0..94b6465 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -2891,6 +2891,7 @@  int main(int argc, char **argv, char **envp)
      * When loading the ELF image to determine whether guest_base
      * is needed.  It is also used in mmap_find_vma.
      */
+#define MMAP_MIN_ADDR_DEFAULT 65536
     {
         FILE *fp;
 
@@ -2899,8 +2900,14 @@  int main(int argc, char **argv, char **envp)
             if (fscanf(fp, "%lu", &tmp) == 1) {
                 mmap_min_addr = tmp;
                 qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
+            } else {
+                qemu_log("cannot read value from /proc/sys/vm/mmap_min_addr, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
+                mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
             }
             fclose(fp);
+        } else {
+            qemu_log("cannot open /proc/sys/vm/mmap_min_addr for reading, assuming %d\n", MMAP_MIN_ADDR_DEFAULT);
+            mmap_min_addr = MMAP_MIN_ADDR_DEFAULT;
         }
     }