On Mon, Jan 13, 2025 at 8:30 PM Joshua Watt <jpewhac...@gmail.com> wrote:
>
> On Mon, Jan 13, 2025 at 10:51 AM <igor.opan...@foundries.io> wrote:
> >
> > From: Igor Opaniuk <igor.opan...@foundries.io>
> >
> > create_image_spdx() implementation assumes that image is indeed a file.
> > If image recipe deploys a directory (for example, which contains an
> > hierarchy of flash artifacts, that is used by SoC vendor-specific
> > flashing tool) which follows ${IMAGE_NAME}.${IMAGE_TYPE} naming scheme,
> > create_image_spdx() function will fail after trying to hash a directory:
> >
> > *** 0002:do_create_image_spdx(d)
> >      0003:
> > File: '.../meta/classes-recipe/create-spdx-image-3.0.bbclass', lineno: 48, 
> > function: do_create_image_spdx
> >      0044:addtask do_create_rootfs_spdx_setscene
> >      0045:
> >      0046:python do_create_image_spdx() {
> >      0047:    import oe.spdx30_tasks
> >  *** 0048:    oe.spdx30_tasks.create_image_spdx(d)
> >      0049:}
> >      0050:addtask do_create_image_spdx after do_image_complete 
> > do_create_rootfs_spdx before do_build
> >      0051:SSTATETASKS += "do_create_image_spdx"
> > ...
> > File: '.../bitbake/lib/bb/utils.py', lineno: 536, function: _hasher
> >      0532:
> >      0533:def _hasher(method, filename):
> >      0534:    import mmap
> >      0535:
> >  *** 0536:    with open(filename, "rb") as f:
> >      0537:        try:
> >      0538:            with mmap.mmap(f.fileno(), 0, 
> > access=mmap.ACCESS_READ) as mm:
> >      0539:                for chunk in iter(lambda: mm.read(8192), b''):
> >      0540:                    method.update(chunk)
> > Exception: IsADirectoryError: [Errno 21] Is a directory: '...'
> >
> > Signed-off-by: Igor Opaniuk <igor.opan...@foundries.io>
> > ---
> >  meta/lib/oe/spdx30_tasks.py | 51 ++++++++++++++++++++++++-------------
> >  1 file changed, 34 insertions(+), 17 deletions(-)
> >
> > diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
> > index c60c97896c..d1a7df5b64 100644
> > --- a/meta/lib/oe/spdx30_tasks.py
> > +++ b/meta/lib/oe/spdx30_tasks.py
> > @@ -1068,29 +1068,46 @@ def create_image_spdx(d):
> >          builds.append(image_build)
> >
> >          artifacts = []
> > +        license_data = oe.spdx_common.load_spdx_license_data(d)
> >
> >          for image in task["images"]:
> >              image_filename = image["filename"]
> >              image_path = image_deploy_dir / image_filename
> > -            a = objset.add_root(
> > -                oe.spdx30.software_File(
> > -                    _id=objset.new_spdxid("image", image_filename),
> > -                    creationInfo=objset.doc.creationInfo,
> > -                    name=image_filename,
> > -                    verifiedUsing=[
> > -                        oe.spdx30.Hash(
> > -                            algorithm=oe.spdx30.HashAlgorithm.sha256,
> > -                            hashValue=bb.utils.sha256_file(image_path),
> > -                        )
> > -                    ],
> > +            if os.path.isdir(image_path):
> > +                a = add_package_files(
> > +                        d,
> > +                        objset,
> > +                        image_path,
> > +                        lambda file_counter: objset.new_spdxid(
> > +                            "imagefile", str(file_counter)
> > +                        ),
> > +                        lambda filepath: 
> > [oe.spdx30.software_SoftwarePurpose.file],
>
> Don't set the purpose here (e.g. just do `lambda filepath: []`), and
> set it later (see below)
>
> > +                        license_data,
>
> For now, lets just have add_package_files skip license scanning if
> license_data is None (specifically check for `None`), that way it
> matches the single image file below (which doesn't scan for licenses
> either).
>
> > +                        ignore_dirs=None,
> > +                        ignore_top_level_dirs=None,
> > +                        archive=None,
> >                  )
>
>
>
> > -            )
> > -            set_purposes(
> > -                d, a, "SPDX_IMAGE_PURPOSE:%s" % imagetype, 
> > "SPDX_IMAGE_PURPOSE"
> > -            )
> > -            set_timestamp_now(d, a, "builtTime")
> > +                artifacts.extend(a)
> > +            else:
> > +                a = objset.add_root(
> > +                    oe.spdx30.software_File(
> > +                        _id=objset.new_spdxid("image", image_filename),
> > +                        creationInfo=objset.doc.creationInfo,
> > +                        name=image_filename,
> > +                        verifiedUsing=[
> > +                            oe.spdx30.Hash(
> > +                                algorithm=oe.spdx30.HashAlgorithm.sha256,
> > +                                hashValue=bb.utils.sha256_file(image_path),
> > +                            )
> > +                        ],
> > +                    )
> > +                )
> > +                set_purposes(
> > +                    d, a, "SPDX_IMAGE_PURPOSE:%s" % imagetype, 
> > "SPDX_IMAGE_PURPOSE"
> > +                )
> > +                set_timestamp_now(d, a, "builtTime")
> >
> > -            artifacts.append(a)
> > +                artifacts.append(a)
>
> Looks like you are not setting the builtTime timestamps in the case of
> a directory. However, I think this code can be simplifed to cover both
> cases with:
>
>  for a in artifacts:
>      set_purposes(d, a, "SPDX_IMAGE_PURPOSE:%s" % imagetype,
> "SPDX_IMAGE_PURPOSE")
>      set_timestamp_now(d, a, "builtTime")
>
> which will do both the purpose and the timestamp for all artifact files.
>
> >
> >          if artifacts:
> >              objset.new_scoped_relationship(
> > --
> > 2.43.0
> >

Thanks a lot for all suggestions, will send v3 soon.

-- 
Best regards - Freundliche Grüsse - Meilleures salutations

Igor Opaniuk
Senior Software Engineer, Embedded & Security
E: igor.opan...@foundries.io
W: www.foundries.io
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#209897): 
https://lists.openembedded.org/g/openembedded-core/message/209897
Mute This Topic: https://lists.openembedded.org/mt/110591862/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to