@@ -459,39 +459,38 @@ func createVerityHashTree(buildEnv env.ExecEnv, fsFn, hashFn string) (string, er
459459 return "" , fmt .Errorf ("%w\n %s" , err , out .String ())
460460 }
461461
462- if err = buildEnv .FixPermissions (fsFn ); err != nil {
463- return "" , err
464- }
465- if err = buildEnv .FixPermissions (hashFn ); err != nil {
466- return "" , err
467- }
468- if err = buildEnv .FixPermissions (rootHashFn ); err != nil {
469- return "" , err
470- }
471-
472462 data , err := os .ReadFile (rootHashFn )
473463 if err != nil {
474464 return "" , fmt .Errorf ("failed to read dm-verity root hash: %w" , err )
475465 }
476466 return string (data ), nil
477467}
478468
479- // concatFiles appends the contents of file b to a.
480- func concatFiles (a , b string ) error {
481- df , err := os .OpenFile (a , os .O_APPEND | os .O_CREATE | os .O_WRONLY , 0o644 )
469+ // concatFiles appends the contents of file b to a using the given build environment.
470+ // This ensures the operation works correctly with containerized builds where the host
471+ // may not have write permissions to container-created files.
472+ func concatFiles (buildEnv env.ExecEnv , a , b string ) error {
473+ aEnv , err := buildEnv .PathToEnv (a )
482474 if err != nil {
483- return err
475+ return fmt . Errorf ( "failed to translate path: %w" , err )
484476 }
485- defer df .Close ()
486-
487- sf , err := os .Open (b )
477+ bEnv , err := buildEnv .PathToEnv (b )
488478 if err != nil {
489- return err
479+ return fmt . Errorf ( "failed to translate path: %w" , err )
490480 }
491- defer sf .Close ()
492481
493- _ , err = io .Copy (df , sf )
494- return err
482+ // Use shell to append file b to file a.
483+ cmd := exec .Command ("sh" , "-c" , fmt .Sprintf ("cat %q >> %q" , bEnv , aEnv )) //nolint:gosec
484+ var out strings.Builder
485+ cmd .Stderr = & out
486+ cmd .Stdout = & out
487+ if err = buildEnv .WrapCommand (cmd ); err != nil {
488+ return err
489+ }
490+ if err = cmd .Run (); err != nil {
491+ return fmt .Errorf ("%w\n %s" , err , out .String ())
492+ }
493+ return nil
495494}
496495
497496// padWithEmptySpace pads the given file with empty space to make it the given size. See
0 commit comments