@@ -635,20 +635,15 @@ func installAliasPackage(entry *pkgCacheEntry, promptToOverwrite bool, clientCon
635635 return errors .New ("signature verification failed" )
636636 }
637637
638- tmpFile , err := os .CreateTemp ("" , "sliver-armory-" )
639- if err != nil {
640- return err
641- }
642- defer os .Remove (tmpFile .Name ())
643- _ , err = tmpFile .Write (tarGz )
638+ tmpFileName , err := writeArmoryTempFile (tarGz )
644639 if err != nil {
645640 return err
646641 }
647- tmpFile . Close ( )
642+ defer os . Remove ( tmpFileName )
648643
649644 con .Printf (console .Clearln + "\r " ) // Clear the line
650645
651- installPath := alias .InstallFromFile (tmpFile . Name () , entry .Alias .CommandName , promptToOverwrite , con )
646+ installPath := alias .InstallFromFile (tmpFileName , entry .Alias .CommandName , promptToOverwrite , con )
652647 if installPath == nil {
653648 return errors .New ("failed to install alias" )
654649 }
@@ -729,23 +724,45 @@ func installExtensionPackage(entry *pkgCacheEntry, promptToOverwrite bool, clien
729724 return errors .New ("signature verification failed" )
730725 }
731726
732- tmpFile , err := os .CreateTemp ("" , "sliver-armory-" )
733- if err != nil {
734- return err
735- }
736- defer os .Remove (tmpFile .Name ())
737- _ , err = tmpFile .Write (tarGz )
738- if err != nil {
739- return err
740- }
741- err = tmpFile .Sync ()
727+ tmpFileName , err := writeArmoryTempFile (tarGz )
742728 if err != nil {
743729 return err
744730 }
731+ defer os .Remove (tmpFileName )
745732
746733 con .Printf (console .Clearln + "\r " ) // Clear download message
747734
748- extensions .InstallFromDir (tmpFile . Name () , promptToOverwrite , con , true )
735+ extensions .InstallFromDir (tmpFileName , promptToOverwrite , con , true )
749736
750737 return nil
751738}
739+
740+ func writeArmoryTempFile (data []byte ) (string , error ) {
741+ if len (data ) == 0 {
742+ return "" , errors .New ("downloaded archive is empty" )
743+ }
744+ tmpFile , err := os .CreateTemp ("" , "sliver-armory-" )
745+ if err != nil {
746+ return "" , err
747+ }
748+ tmpFileName := tmpFile .Name ()
749+ for len (data ) > 0 {
750+ n , err := tmpFile .Write (data )
751+ if err != nil {
752+ tmpFile .Close ()
753+ os .Remove (tmpFileName )
754+ return "" , err
755+ }
756+ data = data [n :]
757+ }
758+ if err := tmpFile .Sync (); err != nil {
759+ tmpFile .Close ()
760+ os .Remove (tmpFileName )
761+ return "" , err
762+ }
763+ if err := tmpFile .Close (); err != nil {
764+ os .Remove (tmpFileName )
765+ return "" , err
766+ }
767+ return tmpFileName , nil
768+ }
0 commit comments