2012-11-21 15:50:51 +00:00
|
|
|
#
|
|
|
|
# \brief Test for assigning custom UIDs and GIDs to Genode processes
|
|
|
|
# \author Norman Feske
|
|
|
|
# \date 2012-11-21
|
|
|
|
#
|
|
|
|
|
|
|
|
build "core init test/printf"
|
|
|
|
|
|
|
|
assert_spec linux
|
|
|
|
|
|
|
|
create_boot_directory
|
|
|
|
|
|
|
|
install_config {
|
|
|
|
<config>
|
|
|
|
<parent-provides>
|
|
|
|
<service name="LOG"/>
|
|
|
|
<service name="RAM"/>
|
|
|
|
<service name="PD"/>
|
|
|
|
<service name="RM"/>
|
|
|
|
<service name="CPU"/>
|
|
|
|
<service name="ROM"/>
|
|
|
|
</parent-provides>
|
|
|
|
<default-route>
|
|
|
|
<any-service><parent/></any-service>
|
|
|
|
</default-route>
|
|
|
|
|
|
|
|
<start name="init_55_66" uid="55" gid="66">
|
|
|
|
<binary name="init" />
|
|
|
|
<resource name="RAM" quantum="1M"/>
|
|
|
|
<config/>
|
|
|
|
</start>
|
|
|
|
|
|
|
|
<!-- we expect the GID of init_77 to equal the UID -->
|
|
|
|
<start name="init_77" uid="77">
|
|
|
|
<binary name="init" />
|
|
|
|
<resource name="RAM" quantum="1M"/>
|
|
|
|
<config>
|
|
|
|
<parent-provides>
|
|
|
|
<service name="LOG"/>
|
|
|
|
<service name="ROM"/>
|
|
|
|
</parent-provides>
|
|
|
|
<default-route>
|
|
|
|
<any-service><parent/></any-service>
|
|
|
|
</default-route>
|
|
|
|
|
|
|
|
<!-- we expect the GID and UID of init_sub_77 to inherit
|
|
|
|
its UID and GIDs from its parent policy. -->
|
|
|
|
<start name="init_sub_77">
|
|
|
|
<binary name="init" />
|
|
|
|
<resource name="RAM" quantum="1M"/>
|
|
|
|
<config/>
|
|
|
|
</start>
|
|
|
|
</config>
|
|
|
|
</start>
|
|
|
|
</config>
|
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# Copy boot modules into run directory
|
|
|
|
#
|
|
|
|
# We cannot use the predefined 'build_boot_image' function here because
|
|
|
|
# this would create mere symlinks. However, we need to enable the setuid
|
|
|
|
# and setgid capabilities for core, which won't work if core were a symlink.
|
|
|
|
#
|
2016-12-01 18:00:11 +00:00
|
|
|
foreach binary { core ld.lib.so init } {
|
2012-11-21 15:50:51 +00:00
|
|
|
exec cp -H bin/$binary [run_dir] }
|
|
|
|
|
|
|
|
#
|
|
|
|
# Allow core to set arbitrary UIDs and GIDs
|
|
|
|
#
|
|
|
|
exec sudo setcap cap_setuid,cap_setgid=ep [run_dir]/core
|
|
|
|
|
|
|
|
#
|
|
|
|
# Execute Genode until the point where init_sub_77 is up
|
|
|
|
#
|
|
|
|
run_genode_until {\[init -> init_77 -> init_sub_77\].*No children to start.*\n} 10
|
|
|
|
|
|
|
|
#
|
|
|
|
# Obtain the list of Genode user processes starting with the name 'init'
|
|
|
|
#
|
|
|
|
set ps_output [exec ps -eo uid,gid,cmd | grep Genode | grep init]
|
|
|
|
|
|
|
|
puts "Genode user processes:\n$ps_output"
|
|
|
|
|
|
|
|
#
|
|
|
|
# Validate output of ps
|
|
|
|
#
|
|
|
|
# We are only interested in the lines for the init instances with the
|
|
|
|
# customized UIDs and GIDs.
|
|
|
|
#
|
|
|
|
if {![regexp {55\s*66 \[Genode\] init_55_66} $ps_output]
|
|
|
|
|| ![regexp {77\s*77 \[Genode\] init_77} $ps_output]
|
|
|
|
|| ![regexp {77\s*77 \[Genode\] init_77 -> init_sub_77} $ps_output]} {
|
|
|
|
puts stderr "Unexpected output of ps"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
puts "Test succeeded"
|
|
|
|
|