Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 47800e023f1f3d32bd46feaecaef69b44ae66c5f)
+++ generic/src/mm/as.c	(revision fd4d8c080e51030459c861e84ddbc47663832efa)
@@ -459,8 +459,9 @@
  * sh_info of the source area.
  * 
- * @param src_as Pointer to source address space
+ * @param src_as Pointer to source address space.
  * @param src_base Base address of the source address space area.
- * @param acc_size Expected size of the source area
- * @param dst_base Target base address
+ * @param acc_size Expected size of the source area.
+ * @param dst_base Target base address.
+ * @param dst_flags_mask Destination address space area flags mask.
  *
  * @return Zero on success or ENOENT if there is no such task or
@@ -472,5 +473,5 @@
  */
 int as_area_share(as_t *src_as, __address src_base, size_t acc_size,
-		  __address dst_base)
+		  __address dst_base, int dst_flags_mask)
 {
 	ipl_t ipl;
@@ -568,6 +569,9 @@
 	 * attribute set which prevents race condition with
 	 * preliminary as_page_fault() calls.
-	 */
-	dst_area = as_area_create(AS, src_flags, src_size, dst_base, AS_AREA_ATTR_PARTIAL, &anon_backend, NULL);
+	 * The flags of the source area are masked against dst_flags_mask
+	 * to support sharing in less privileged mode.
+	 */
+	dst_area = as_area_create(AS, src_flags & dst_flags_mask, src_size, dst_base,
+				  AS_AREA_ATTR_PARTIAL, &anon_backend, NULL);
 	if (!dst_area) {
 		/*
