[Toybox] [PATCH] dirtree.c: avoid spurious EINVAL warnings.

enh enh at google.com
Mon Dec 16 11:20:40 PST 2019


On Sat, Dec 14, 2019 at 3:37 PM Rob Landley <rob at landley.net> wrote:
>
> On 12/13/19 6:36 PM, enh via Toybox wrote:
> > An Android engineer complained that they were seeing this when not
> > running as root:
> >
> >   $ adb shell ls
> >   ls: ./postinstall: Invalid argument
> >   ls: ./init: Permission denied
> >   ls: ./data_mirror: Invalid argument
> >   ls: ./init.environ.rc: Invalid argument
> >   ls: ./metadata: Invalid argument
> >   acct
> >   adb_keys
> >   apex
>
> Are you sure that's current? init isn't listed to stdout: the current code is
> saying "permission denied" but also listing them.

yes, this was ToT. note that by default adb shell doesn't allocate a
pty, so you're seeing all the stderr before you see any of the stdout.

`adb shell -t` gets you a pty *if* you have a tty yourself. `adb shell
-tt` forces a pty. this was copied from ssh, but in retrospect i think
we should have defaulted to the `-t` behavior. i assume it would be
too disruptive to change again now.

> I think the goto error would discard postinstall and such, yes. (Still don't
> have this selinux test environment set up...)
>
> >>From strace, it was here:
> >
> >   newfstatat(4, "adb_keys", 0x7fc67eca88, AT_SYMLINK_NOFOLLOW) = -1
> > EACCES (Permission denied)
> >   readlinkat(4, "adb_keys", 0x5e843c7720, 4095) = -1 EINVAL (Invalid argument)
> >
> > So stop looking at st.st_mode (and then deciding to do a readlinkat())
> > if we didn't actually successfully stat().
>
> I'm wondering if I should mask out the permission denied too? We're now
> displaying what information we _do_ have on those entries to stdout (the other
> ones were discarded because goto error, but the "permission denied" ones
> should), and when you request info it can't fetch it gives you ??? output.
>
> Not sure what the right behavior is here. (It's a UI question really.)

i think we're already there, aren't we? the only reason we were seeing
any errors above was because of this bug. the EACCES on init was
because that *is* a symlink so we didn't get EINVAL like the others,
but with the fix, everything looks right to me (if you assume that the
coreutils "? for stuff we don't know" is the desired behavior, which i
think is probably as close to ideal as you'll get):

~/aosp/external/toybox$ adb shell id
uid=2000(shell) gid=2000(shell)
groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc),3011(uhid)
context=u:r:shell:s0
~/aosp/external/toybox$ adb shell ls
acct
adb_keys
apex
bin
bugreports
cache
config
d
data
debug_ramdisk
default.prop
dev
dsp
etc
init
init.environ.rc
lost+found
metadata
mnt
odm
oem
persist
postinstall
proc
product
res
sdcard
storage
sys
system
system_ext
vendor
~/aosp/external/toybox$ adb shell ls -l
total 53
dr-xr-xr-x  56 root   root       0 1970-08-05 21:58 acct
-?????????   ? ?      ?          ?                ? adb_keys
drwxr-xr-x  30 root   root     600 2019-12-13 14:03 apex
lrw-r--r--   1 root   root      11 2019-12-06 20:28 bin -> /system/bin
lrw-r--r--   1 root   root      50 2019-12-06 20:28 bugreports ->
/data/user_de/0/com.android.shell/files/bugreports
l?????????   ? ?      ?          ?                ? cache -> ?
drwxr-xr-x   4 root   root       0 1969-12-31 19:00 config
lrw-r--r--   1 root   root      17 2019-12-06 20:28 d -> /sys/kernel/debug
drwxrwx--x  51 system system  4096 2019-12-13 14:03 data
drwxr-xr-x   2 root   root    4096 2019-12-03 21:17 debug_ramdisk
lrw-------   1 root   root      23 2019-12-06 20:28 default.prop ->
system/etc/prop.default
drwxr-xr-x  21 root   root    4740 2019-12-06 20:40 dev
lrw-r--r--   1 root   root      11 2019-12-06 20:28 dsp -> /vendor/dsp
lrw-r--r--   1 root   root      11 2019-12-06 20:28 etc -> /system/etc
l?????????   ? ?      ?          ?                ? init -> ?
-?????????   ? ?      ?          ?                ? init.environ.rc
drwx------   2 root   root   16384 2019-12-06 20:28 lost+found
d?????????   ? ?      ?          ?                ? metadata
drwxr-xr-x  14 root   system   300 1970-08-05 21:58 mnt
drwxr-xr-x   2 root   root    4096 2019-12-03 21:17 odm
drwxr-xr-x   2 root   root    4096 2019-12-03 21:17 oem
lrw-r--r--   1 root   root      19 2019-12-06 20:28 persist ->
/mnt/vendor/persist
d?????????   ? ?      ?          ?                ? postinstall
dr-xr-xr-x 739 root   root       0 1969-12-31 19:00 proc
drwxr-xr-x   1 root   root    3488 2019-12-06 20:29 product
drwxr-xr-x   3 root   root    4096 2019-12-03 21:17 res
lrw-r--r--   1 root   root      21 2019-12-06 20:28 sdcard ->
/storage/self/primary
drwxr-xr-x   4 root   root      80 2019-12-06 20:40 storage
dr-xr-xr-x  12 root   root       0 1970-08-05 21:58 sys
drwxr-xr-x   1 root   root    3488 2019-12-13 14:03 system
drwxr-xr-x   2 root   root    4096 2019-12-03 21:17 system_ext
drwxr-xr-x   1 root   root    3488 2019-12-06 20:29 vendor

> Rob



More information about the Toybox mailing list