diff -r 000000000000 -r a41df078684a kerneltest/f32test/server/t_sysbin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/server/t_sysbin.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,388 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// f32test\server\t_sysbin.cpp +// +// + +#define __E32TEST_EXTENSION__ +#include +#include + +_LIT(KCheckFailed,"Check failed %d != %d\n"); + +#define CHECK_EQ(a,b) { if(a!=b) { test.Printf(KCheckFailed,a,b); test(0); } } + +RTest test(_L("T_SYSBIN")); + +TBool SysBinEnforced = 0; +TBool RunningFromROM; + +RFs TheFs; +CFileMan* TheFileMan; + +void CheckFileName(RProcess aProcess, const TDesC& aFileName) + { + TFileName fileName = aProcess.FileName(); + test(fileName.MatchF(aFileName)==0); + } + +_LIT(KExeAInSysBin,"z:\\sys\\bin\\t_sysbina.exe"); +_LIT(KExeBInSystemPrograms,"z:\\system\\programs\\t_sysbinb.exe"); +_LIT(KDllAInSysBin,"z:\\sys\\bin\\t_sysbin_dlla.dll"); +_LIT(KDllBInSystemLibs,"z:\\system\\libs\\t_sysbin_dllb.dll"); +#ifndef __WINS__ +_LIT(KExeBInSysBin,"z:\\sys\\bin\\t_sysbinb.exe"); +_LIT(KDllBInSysBin,"z:\\sys\\bin\\t_sysbin_dllb.dll"); +#endif +_LIT(KRamDll,"z:\\sys\\bin\\t_sysbin_dll_ram.dll"); +_LIT(KDllCInCTest,"c:\\sysbin_test\\t_sysbin_dllc.dll"); +_LIT(KDllC,"t_sysbin_dllc.dll"); +_LIT(KDllDInCSysBinTest,"c:\\sys\\bin\\test\\t_sysbin_dlld.dll"); +_LIT(KDllD,"t_sysbin_dlld.dll"); + + +void CheckFileName(RLibrary aLibrary, const TDesC& aFileName) + { + TFileName fileName = aLibrary.FileName(); + test(fileName.MatchF(aFileName)==0); + } + + + +void TestExeB(const TDesC& aFileName) + { + RProcess p; + TInt r = p.Create(aFileName,KNullDesC); + if(SysBinEnforced) + { +#ifdef __WINS__ + CHECK_EQ(r,KErrNotFound) +#else + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeBInSysBin); + p.Terminate(0); + p.Close(); +#endif + } + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeBInSystemPrograms); + p.Terminate(0); + p.Close(); + } + } + + + +void TestDllB(const TDesC& aFileName) + { + RLibrary l; + TInt r = l.Load(aFileName); + if(SysBinEnforced) + { +#ifdef __WINS__ + CHECK_EQ(r,KErrNotFound) +#else + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllBInSysBin); + l.Close(); +#endif + } + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllBInSystemLibs); + l.Close(); + } + } + + + +void TestDllC(const TDesC& aFileName,const TDesC& aPath) + { + RLibrary l; + test.Printf(_L("Load(%S,%S)\n"),&aFileName,&aPath); + TInt r = l.Load(aFileName,aPath); + if(SysBinEnforced) + CHECK_EQ(r,KErrNotFound) + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllCInCTest); + l.Close(); + } + } + + + +void TestDllD(const TDesC& aFileName,const TDesC& aPath) + { + RLibrary l; + test.Printf(_L("Load(%S,%S)\n"),&aFileName,&aPath); + TInt r = l.Load(aFileName,aPath); + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllDInCSysBinTest); + l.Close(); + } + + + +GLDEF_C TInt E32Main() + { + SysBinEnforced=PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin); + + TInt r; + RProcess p; + RLibrary l; + + test.Title(); + + test( KErrNone == TheFs.Connect() ); + RunningFromROM = TheFs.IsFileInRom(RProcess().FileName())!=0; + + // Turn off evil lazy dll unloading + { + RLoader l; + test_KErrNone(l.Connect()); + test_KErrNone(l.CancelLazyDllUnload()); + l.Close(); + } + + CTrapCleanup* ct = CTrapCleanup::New(); + test_NotNull(ct); + TRAP(r, TheFileMan=CFileMan::NewL(TheFs)); + test_KErrNone(r); + + test.Start(_L("Check loading an EXE which lives in \\SYS\\BIN")); + + test.Start(_L("Load without path or ext")); + r = p.Create(_L("T_SYSBINa"),KNullDesC); + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeAInSysBin); + p.Terminate(0); + p.Close(); + + test.Next(_L("Load without path")); + r = p.Create(_L("T_SYSBINa.EXE"),KNullDesC); + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeAInSysBin); + p.Terminate(0); + p.Close(); + + test.Next(_L("Load with path but without ext")); + r = p.Create(_L("\\Sys\\Bin\\T_SYSBINa"),KNullDesC); + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeAInSysBin); + p.Terminate(0); + p.Close(); + + test.Next(_L("Load with path and ext")); + r = p.Create(_L("\\Sys\\Bin\\T_SYSBINa.EXE"),KNullDesC); + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeAInSysBin); + p.Terminate(0); + p.Close(); + + test.Next(_L("Load with SYSTEM\\PROGRAMS path and without ext")); + r = p.Create(_L("\\SYSTEM\\PROGRAMS\\T_SYSBINa"),KNullDesC); + if(!SysBinEnforced) + CHECK_EQ(r,KErrNotFound) + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeAInSysBin); + p.Terminate(0); + p.Close(); + } + + test.Next(_L("Load with SYSTEM\\PROGRAMS path and with ext")); + r = p.Create(_L("\\SYSTEM\\PROGRAMS\\T_SYSBINa.EXE"),KNullDesC); + if(!SysBinEnforced) + CHECK_EQ(r,KErrNotFound) + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(p,KExeAInSysBin); + p.Terminate(0); + p.Close(); + } + + test.End(); + + test.Next(_L("Check loading an EXE which lives in \\SYSTEM\\PROGRAMS")); + + if(!RunningFromROM) + { + test.Printf(_L("TESTS NOT RUN - Not running from ROM")); + } + else + { + test.Start(_L("Load without path or ext")); + TestExeB(_L("T_SYSBINb")); + + test.Next(_L("Load without path")); + TestExeB(_L("T_SYSBINb.EXE")); + + test.Next(_L("Load with path but without ext")); + TestExeB(_L("\\System\\programs\\T_SYSBINb")); + + test.Next(_L("Load with path and ext")); + TestExeB(_L("\\System\\programs\\T_SYSBINb.EXE")); + + test.End(); + } + + test.Next(_L("Check loading an DLL which lives in \\SYS\\BIN")); + + test.Start(_L("Load without path or ext")); + r = l.Load(_L("T_SYSBIN_DLLa")); + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllAInSysBin); + l.Close(); + + test.Next(_L("Load without path")); + r = l.Load(_L("T_SYSBIN_DLLa.DLL")); + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllAInSysBin); + l.Close(); + + test.Next(_L("Load with path but without ext")); + r = l.Load(_L("\\Sys\\Bin\\T_SYSBIN_DLLa")); + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllAInSysBin); + l.Close(); + + test.Next(_L("Load with path and ext")); + r = l.Load(_L("\\Sys\\Bin\\T_SYSBIN_DLLa.DLL")); + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllAInSysBin); + l.Close(); + + test.Next(_L("Load with SYSTEM\\LIBS path and without ext")); + r = l.Load(_L("\\SYSTEM\\LIBS\\T_SYSBIN_DLLa")); + if(!SysBinEnforced) + CHECK_EQ(r,KErrNotFound) + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllAInSysBin); + l.Close(); + } + + test.Next(_L("Load with SYSTEM\\LIBS path and with ext")); + r = l.Load(_L("\\SYSTEM\\LIBS\\T_SYSBIN_DLLa.DLL")); + if(!SysBinEnforced) + CHECK_EQ(r,KErrNotFound) + else + { + CHECK_EQ(r,KErrNone) + CheckFileName(l,KDllAInSysBin); + l.Close(); + } + + test.End(); + + test.Next(_L("Check loading an DLL which lives in \\SYSTEM\\LIBS")); + + if(!RunningFromROM) + { + test.Printf(_L("TESTS NOT RUN - Not running from ROM")); + } + else + { + test.Start(_L("Load without path or ext")); + TestDllB(_L("T_SYSBIN_DLLb")); + + test.Next(_L("Load without path")); + TestDllB(_L("T_SYSBIN_DLLb.DLL")); + + test.Next(_L("Load with path but without ext")); + TestDllB(_L("\\System\\Libs\\T_SYSBIN_DLLb")); + + test.Next(_L("Load with path and ext")); + TestDllB(_L("\\System\\Libs\\T_SYSBIN_DLLb.DLL")); + + test.End(); + } + + test.Next(_L("Check loading an DLL which lives in \\SYSBIN_TEST")); + + r = TheFileMan->Copy(KRamDll,KDllCInCTest,CFileMan::ERecurse); + test_KErrNone(r); + + test.Start(_L("Load using full path+name")); + TestDllC(KDllCInCTest,KNullDesC); + + test.Next(_L("Load using separate search path")); + TestDllC(KDllC,_L("\\sysbin_test\\")); +#ifndef __WINS__ + TestDllC(KDllC,_L("\\sysbin_test")); + TestDllC(KDllC,_L("sysbin_test\\")); + TestDllC(KDllC,_L("sysbin_test")); +#endif + + TestDllC(KDllC,_L("c:\\sysbin_test\\")); +#ifndef __WINS__ + TestDllC(KDllC,_L("c:\\sysbin_test")); + TestDllC(KDllC,_L("c:sysbin_test\\")); + TestDllC(KDllC,_L("c:sysbin_test")); +#endif + + test.End(); + + _LIT(KCTestPath,"c:\\sysbin_test\\"); + r = TheFileMan->RmDir(KCTestPath); + test_KErrNone(r); + + test.Next(_L("Check loading an DLL which lives in \\SYS\\BIN\\TEST")); + + r = TheFileMan->Copy(KRamDll,KDllDInCSysBinTest,CFileMan::ERecurse); + test_KErrNone(r); + + test.Start(_L("Load using full path+name")); + TestDllD(KDllDInCSysBinTest,KNullDesC); + + test.Next(_L("Load using separate search path")); + TestDllD(KDllD,_L("\\sys\\bin\\test\\")); +#ifndef __WINS__ + TestDllD(KDllD,_L("\\sys\\bin\\test")); + TestDllD(KDllD,_L("sys\\bin\\test")); + TestDllD(KDllD,_L("sys\\bin\\test\\")); +#endif + + TestDllD(KDllD,_L("c:\\sys\\bin\\test\\")); +#ifndef __WINS__ + TestDllD(KDllD,_L("c:\\sys\\bin\\test")); + TestDllD(KDllD,_L("c:sys\\bin\\test\\")); + TestDllD(KDllD,_L("c:sys\\bin\\test")); +#endif + + TestDllD(KDllD,_L("\\dummy;\\sys\\bin\\test\\")); + TestDllD(KDllD,_L("\\sys\\bin\\test\\;\\dummy2")); + TestDllD(KDllD,_L("\\dummy1;\\sys\\bin\\test2;\\sys\\bin\\test\\")); + + TestDllD(KDllD,_L("c:\\dummy;c:\\sys\\bin\\test\\")); + TestDllD(KDllD,_L("c:\\sys\\bin\\test\\;c:\\dummy2")); + TestDllD(KDllD,_L("c:\\dummy1;c:\\sys\\bin\\test2;c:\\sys\\bin\\test\\")); + + test.End(); + + _LIT(KCTestPath2,"c:\\sys\\bin\\test\\"); + r = TheFileMan->RmDir(KCTestPath2); + test_KErrNone(r); + + test.End(); + return(0); + }