shithub: riscv

Download patch

ref: e9fddbaad81de8afbffe3f8ff626a18a551619df
parent: ce54a5d6634ab4493504001f9c27568a429ae811
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Sep 14 12:04:22 EDT 2014

kernel: fix segattach() rounding of va+len (thanks kenji arisawa)

from segattach(2):

          Va and len specify the position of the segment in the
          process's address space.  Va is rounded down to the nearest
          page boundary and va+len is rounded up.  The system does not
          permit segments to overlap.  If va is zero, the system will
          choose a suitable address.

just rounding up len isnt enougth. we have to round up va+len
instead of just len so that the span [va, va+len) is covered
even if va is not page aligned.

kenjis example:

	print("%p\n",ap);	// 206cb0
	ap = segattach(0, "shared", ap, 1024);
	print("%p\n",ap);	// 206000

term% cat /proc/612768/segment
Stack     defff000 dffff000    1
Text   R      1000     6000    1
Data          6000     7000    1
Bss           7000     7000    1
Shared      206000   207000    1
term%

note that 0x206cb0 + 0x400 > 0x20700.

--- a/sys/src/9/port/segment.c
+++ b/sys/src/9/port/segment.c
@@ -610,7 +610,10 @@
 		}
 	}
 
+	/* round up va+len */
+	len += va & (BY2PG-1);
 	len = PGROUND(len);
+
 	if(len == 0)
 		error(Ebadarg);