On Tue 2017-01-03 17:06:00 -0500, Jameson Graef Rollins wrote: > On Tue, Jan 03 2017, Daniel Kahn Gillmor <[email protected]> wrote: >> trying to build the rescue image on stretch/sid, i get: >> >> run-parts: executing rescue/modules/a0_motd >> run-parts: executing rescue/modules/a0_prep-root >> dpkg: warning: failed to open configuration file '/root/.dpkg.cfg' for >> reading: Permission denied >> rescue/modules/a0_prep-root: line 32: debirf_info_sh: command not found >> run-parts: rescue/modules/a0_prep-root exited with return code 127 > > I can reproduce this. It appears that the functions from > /usr/share/debirf/common are no longer being executed to the modules, > even though other environment variables are. Why would the functions no > longer be exported? Is this due to a change in bash? run-parts? > fakeroot?
This is a good question! it looks to me like something is happening
between bash and fakeroot! On a stretch/sid system:
0 dkg@alice:~$ unset -f foo
0 dkg@alice:~$ bash -c foo
bash: foo: command not found
127 dkg@alice:~$ foo() { echo bar; }
0 dkg@alice:~$ export -f foo
0 dkg@alice:~$ bash -c foo
bar
0 dkg@alice:~$ fakeroot bash -c foo
bash: foo: command not found
127 dkg@alice:~$
otoh, the same thing happens when i interject through other shells, but
not when i pass it through bash itself:
0 dkg@alice:~$ dash -c 'bash -c foo'
bash: foo: command not found
127 dkg@alice:~$ posh -c 'bash -c foo'
bash: foo: command not found
127 dkg@alice:~$ bash -c 'bash -c foo'
bar
0 dkg@alice:~$
bash caches these functions in the environment as BASH_FUNC_foo%%, but
somehow only transmits them to children:
0 dkg@alice:~$ printenv BASH_FUNC_foo%%
() { echo bar
}
0 dkg@alice:~$ dash -c 'printenv BASH_FUNC_foo%%'
1 dkg@alice:~$ bash -c 'printenv BASH_FUNC_foo%%'
() { echo bar
}
0 dkg@alice:~$ fakeroot printenv BASH_FUNC_foo%%
1 dkg@alice:~$
This is *not* the case on jessie systems:
[0 dkg@grunt ~]$ foo() { echo bar; }
[0 dkg@grunt ~]$ export -f foo
[0 dkg@grunt ~]$ bash -c foo
bar
[0 dkg@grunt ~]$ dash -c 'bash -c foo'
bar
[0 dkg@grunt ~]$ fakeroot bash -c foo
bar
[0 dkg@grunt ~]$ printenv BASH_FUNC_foo%%
() { echo bar
}
[0 dkg@grunt ~]$ fakeroot printenv BASH_FUNC_foo%%
() { echo bar
}
[0 dkg@grunt ~]$
So this definitely looks to me like we're running into a shellshock
countermeasure, but i don't understand the countermeasures well enough
to know how to proceed with a fix, other than explicitly sourcing the
predefined functions in each module.
any suggestions?
--dkg
signature.asc
Description: PGP signature

