kernel/eka/kernel/skernel.cpp
changeset 31 56f325a607ea
parent 0 a41df078684a
child 36 538db54a451d
--- a/kernel/eka/kernel/skernel.cpp	Mon Dec 21 16:14:42 2009 +0000
+++ b/kernel/eka/kernel/skernel.cpp	Wed Dec 23 11:43:31 2009 +0000
@@ -1173,6 +1173,13 @@
 		return KErrArgument;
 		}
 
+	// Check if chunk is read-only
+	if (aInfo.iAtt & TChunkCreate::EReadOnly)
+		{
+		iAttributes |= EReadOnly;
+		iRestrictions |= EChunkPreventAdjust;
+		}
+
 	// Save the clear byte.
 	iClearByte = aInfo.iClearByte;
 
@@ -1195,11 +1202,12 @@
 TInt DChunk::AddToProcess(DProcess* aProcess)
 	{
 	__KTRACE_OPT(KEXEC,Kern::Printf("Adding chunk %O to process %O",this,aProcess));
-	TInt r=aProcess->AddChunk(this,EFalse);
-	if (r==KErrAccessDenied)
+	TBool readOnly = (iAttributes & EReadOnly) && (aProcess->iId != iControllingOwner);
+	TInt r = aProcess->AddChunk(this, readOnly);
+	if (r == KErrAccessDenied)
 		{
 		__KTRACE_OPT(KEXEC,Kern::Printf("Chunk is private - will not be mapped in to process"));
-		r=KErrNone;
+		r = KErrNone;
 		}
 	return r;
 	}
@@ -1211,7 +1219,7 @@
 	if (aCategory == BTrace::EChunks || aCategory == -1)
 		{
 		TKName nameBuf;
-		Name(nameBuf);				
+		Name(nameBuf);
 		BTraceN(BTrace::EChunks,BTrace::EChunkCreated,this,iMaxSize,nameBuf.Ptr(),nameBuf.Size());
 		if(iOwningProcess)
 			BTrace8(BTrace::EChunks,BTrace::EChunkOwner,this,iOwningProcess);