[Toybox] [PATCH] cpio: Implement -u (copy unconditionally)

Yi-yo Chiang yochiang at google.com
Wed Mar 3 08:52:50 PST 2021


On Wed, Mar 3, 2021 at 1:56 AM enh <enh at google.com> wrote:

>
>
> On Mon, Mar 1, 2021 at 5:43 PM Rob Landley <rob at landley.net> wrote:
>
>> On 2/28/21 12:29 PM, Yi-yo Chiang wrote:
>> > (I'll try to keep it short)
>> >
>> > My original motivation to send this patch is that my coworker found out
>> (when he
>> > was working with initramfs) that "cpio -u" behaves differently on toybox
>> > compared to the GNU's implementation.
>>
>> "What was the actual problem?" "My coworker noticed this existed."
>>
>> That's... not a use case?
>>
>
> from the bugs, i think the original bug was the "File exists" -d bug from
> the ramdisk cpio file, and they hit the -u behavior difference trying to
> work around that before realizing that -d was the real problem? (or maybe
> -u was an attempt to produce a small repro case for the -d bug. Or both!)
>
> i'll sync AOSP today anyway. thanks!
>

It's the opposite, we have problems with "-u", and I hit the "-d" thing
when I'm trying to produce minimal repro steps.
I recall the original use case is that we were trying to unpack an
initramfs file, where the initramfs consists of multiple cpio archives
concatenated.
So even if the extraction destination is empty, name conflict still
happens, because name conflict is happening between two component cpio
archives.
e.g. initramfs consists of two cpio archives, and both archives are
creating the same directory.

Thanks, it's (f1be076b52ad) working now!



>>      } else if (S_ISLNK(mode)) {
>>        data = strpad(afd, size, 0);
>> -      if (!test) err = symlink(data, name);
>> +      if (!test) {
>> +        err = symlink(data, name);
>> +        // Can't get a filehandle to a symlink, so do special chown
>> +        if (!err && !geteuid() && !FLAG(no_preserve_owner))
>> +          err = lchown(name, uid, gid);
>> +      }
>>        free(data);
>> -      // Can't get a filehandle to a symlink, so do special chown
>> -      if (!err && !geteuid() && !FLAG(no_preserve_owner))
>> -        err = lchown(name, uid, gid);
>>
>>
Following are more testcases...

$ ln -s target_name a
$ stat -c '%u' a
584303
$ sudo chown --no-dereference 0 a
$ stat -c '%u' a
0
$ # Verify that the owner of 'a' is changed to root
$ echo a | cpio -o -H newc >a.cpio
$ rm a
$ touch a
$ stat -c '%u' a
584303
$ # Verify that the owner of 'a' is not root
$ sudo ./toybox cpio -i -t <a.cpio
a
$ stat -c '%u' a
0

The owner of 'a' is modified, albeit the "-t" (test) flag. I expect "-t" to
only show the list of files to stdout, and not modify/create any file?

-- 

Yi-yo Chiang
Software Engineer
yochiang at google.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.landley.net/pipermail/toybox-landley.net/attachments/20210304/c1ac5e92/attachment-0001.htm>


More information about the Toybox mailing list