diff --git a/build/policy_loader.go b/build/policy_loader.go index 219f85ecf374..ec5406adab1a 100644 --- a/build/policy_loader.go +++ b/build/policy_loader.go @@ -13,6 +13,7 @@ import ( "time" "github.com/docker/buildx/policy" + "github.com/docker/buildx/util/osutil" "github.com/docker/buildx/util/sourcemeta" "github.com/moby/buildkit/client/llb" gwclient "github.com/moby/buildkit/frontend/gateway/client" @@ -200,7 +201,7 @@ func (p *policyPathFSRef) resolve(name string) (fs.StatFS, string, error) { if err != nil { return nil, "", err } - return cwd, filepath.Clean(v), nil + return cwd, osutil.SanitizePath(v), nil } contextFS, err := p.getContextFS() @@ -278,11 +279,11 @@ func normalizeLocalPolicyPath(name, contextDir string) string { if rel, err := filepath.Rel(contextDir, name); err == nil { rel = filepath.Clean(rel) if rel != ".." && !strings.HasPrefix(rel, ".."+string(filepath.Separator)) { - return rel + return osutil.SanitizePath(rel) } } } - return filepath.Clean(name) + return osutil.SanitizePath(name) } type memoizedPolicyFS struct { diff --git a/build/policy_loader_test.go b/build/policy_loader_test.go index cfdadc0d5b3a..32901027f0b6 100644 --- a/build/policy_loader_test.go +++ b/build/policy_loader_test.go @@ -11,6 +11,55 @@ import ( "github.com/stretchr/testify/require" ) +func TestLoadPolicyDataLocalPaths(t *testing.T) { + dir := t.TempDir() + policyData := []byte("package docker\n") + policyRelPath := filepath.Join("policy", "allow.rego") + require.NoError(t, os.MkdirAll(filepath.Join(dir, "policy"), 0700)) + require.NoError(t, os.WriteFile(filepath.Join(dir, policyRelPath), policyData, 0600)) + + t.Run("context-relative", func(t *testing.T) { + provider := newPolicyPathFS(context.Background(), nil, policyOpt{ + ContextDir: dir, + }) + + dt, ok, err := loadPolicyData(provider, policyRelPath) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, policyData, dt) + }) + + t.Run("context-absolute", func(t *testing.T) { + provider := newPolicyPathFS(context.Background(), nil, policyOpt{ + ContextDir: dir, + }) + + dt, ok, err := loadPolicyData(provider, filepath.Join(dir, policyRelPath)) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, policyData, dt) + }) + + t.Run("cwd", func(t *testing.T) { + cwd, err := os.Getwd() + require.NoError(t, err) + require.NoError(t, os.Chdir(dir)) + t.Cleanup(func() { + require.NoError(t, os.Chdir(cwd)) + }) + + provider := newPolicyPathFS(context.Background(), nil, policyOpt{}) + dt, ok, err := loadPolicyData(provider, "cwd://"+policyRelPath) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, policyData, dt) + }) +} + +func TestNormalizeLocalPolicyPath(t *testing.T) { + require.Equal(t, "policy/allow.rego", normalizeLocalPolicyPath(filepath.Join("policy", "allow.rego"), "")) +} + func TestMemoizedPolicyFSRefCountedClose(t *testing.T) { var initCalls int var closeCalls int