@@ -16,7 +16,7 @@ import (
16
16
"github.com/AlecAivazis/survey/v2"
17
17
"github.com/containerd/containerd/identifiers"
18
18
"github.com/lima-vm/lima/pkg/limayaml"
19
- "github.com/lima-vm/lima/pkg/networks/reconcile"
19
+ networks "github.com/lima-vm/lima/pkg/networks/reconcile"
20
20
"github.com/lima-vm/lima/pkg/osutil"
21
21
"github.com/lima-vm/lima/pkg/start"
22
22
"github.com/lima-vm/lima/pkg/store"
@@ -53,8 +53,10 @@ func loadOrCreateInstance(cmd *cobra.Command, args []string) (*store.Instance, e
53
53
err error
54
54
)
55
55
56
+ const yBytesLimit = 4 * 1024 * 1024 // 4MiB
57
+
56
58
if argSeemsHTTPURL (arg ) {
57
- instName , err = instNameFromHTTPURL (arg )
59
+ instName , err = instNameFromURL (arg )
58
60
if err != nil {
59
61
return nil , err
60
62
}
@@ -64,7 +66,22 @@ func loadOrCreateInstance(cmd *cobra.Command, args []string) (*store.Instance, e
64
66
return nil , err
65
67
}
66
68
defer resp .Body .Close ()
67
- yBytes , err = io .ReadAll (resp .Body )
69
+ yBytes , err = readAtMaximum (resp .Body , yBytesLimit )
70
+ if err != nil {
71
+ return nil , err
72
+ }
73
+ } else if argSeemsFileURL (arg ) {
74
+ instName , err = instNameFromURL (arg )
75
+ if err != nil {
76
+ return nil , err
77
+ }
78
+ logrus .Debugf ("interpreting argument %q as a file url for instance %q" , arg , instName )
79
+ r , err := os .Open (strings .TrimPrefix (arg , "file://" ))
80
+ if err != nil {
81
+ return nil , err
82
+ }
83
+ defer r .Close ()
84
+ yBytes , err = readAtMaximum (r , yBytesLimit )
68
85
if err != nil {
69
86
return nil , err
70
87
}
@@ -74,7 +91,12 @@ func loadOrCreateInstance(cmd *cobra.Command, args []string) (*store.Instance, e
74
91
return nil , err
75
92
}
76
93
logrus .Debugf ("interpreting argument %q as a file path for instance %q" , arg , instName )
77
- yBytes , err = os .ReadFile (arg )
94
+ r , err := os .Open (arg )
95
+ if err != nil {
96
+ return nil , err
97
+ }
98
+ defer r .Close ()
99
+ yBytes , err = readAtMaximum (r , yBytesLimit )
78
100
if err != nil {
79
101
return nil , err
80
102
}
@@ -269,6 +291,14 @@ func argSeemsHTTPURL(arg string) bool {
269
291
return true
270
292
}
271
293
294
+ func argSeemsFileURL (arg string ) bool {
295
+ u , err := url .Parse (arg )
296
+ if err != nil {
297
+ return false
298
+ }
299
+ return u .Scheme == "file"
300
+ }
301
+
272
302
func argSeemsYAMLPath (arg string ) bool {
273
303
if strings .Contains (arg , "/" ) {
274
304
return true
@@ -277,8 +307,8 @@ func argSeemsYAMLPath(arg string) bool {
277
307
return strings .HasSuffix (lower , ".yml" ) || strings .HasSuffix (lower , ".yaml" )
278
308
}
279
309
280
- func instNameFromHTTPURL ( httpURL string ) (string , error ) {
281
- u , err := url .Parse (httpURL )
310
+ func instNameFromURL ( urlStr string ) (string , error ) {
311
+ u , err := url .Parse (urlStr )
282
312
if err != nil {
283
313
return "" , err
284
314
}
@@ -299,3 +329,17 @@ func startBashComplete(cmd *cobra.Command, args []string, toComplete string) ([]
299
329
instances , _ := bashCompleteInstanceNames (cmd )
300
330
return instances , cobra .ShellCompDirectiveDefault
301
331
}
332
+
333
+ func readAtMaximum (r io.Reader , n int64 ) ([]byte , error ) {
334
+ lr := & io.LimitedReader {
335
+ R : r ,
336
+ N : n ,
337
+ }
338
+ b , err := io .ReadAll (lr )
339
+ if err != nil {
340
+ if errors .Is (err , io .EOF ) && lr .N <= 0 {
341
+ err = fmt .Errorf ("exceeded the limit (%d bytes): %w" , n , err )
342
+ }
343
+ }
344
+ return b , err
345
+ }
0 commit comments