Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbf51b67 authored by Liz Kammer's avatar Liz Kammer
Browse files

Add bpfix to remove sanitize.scudo

scudo is not supported for Android 11+, sanitize.scudo is deprecated,
when running bpfix, remove it.

Test: go test bpfix tests
Change-Id: Ibb58bb302df3bad24cfce3ae98c65015c090853c
parent 1a0e2d20
Loading
Loading
Loading
Loading
+63 −17
Original line number Diff line number Diff line
@@ -130,7 +130,11 @@ var fixSteps = []FixStep{
	},
	{
		Name: "removePdkProperty",
		Fix:  runPatchListMod(removePdkProperty),
		Fix:  runPatchListMod(removeObsoleteProperty("product_variables.pdk")),
	},
	{
		Name: "removeScudoProperty",
		Fix:  runPatchListMod(removeObsoleteProperty("sanitize.scudo")),
	},
}

@@ -863,7 +867,9 @@ func convertToSingleSource(mod *parser.Module, srcPropertyName string) {
	}
}

func runPatchListMod(modFunc func(mod *parser.Module, buf []byte, patchlist *parser.PatchList) error) func(*Fixer) error {
type patchListModFunction func(*parser.Module, []byte, *parser.PatchList) error

func runPatchListMod(modFunc patchListModFunction) func(*Fixer) error {
	return func(f *Fixer) error {
		// Make sure all the offsets are accurate
		buf, err := f.reparse()
@@ -1033,23 +1039,63 @@ func removeTags(mod *parser.Module, buf []byte, patchlist *parser.PatchList) err
	return patchlist.Add(prop.Pos().Offset, prop.End().Offset+2, replaceStr)
}

func removePdkProperty(mod *parser.Module, buf []byte, patchlist *parser.PatchList) error {
	prop, ok := mod.GetProperty("product_variables")
	if !ok {
		return nil
type propertyProvider interface {
	GetProperty(string) (*parser.Property, bool)
	RemoveProperty(string) bool
}
	propMap, ok := prop.Value.(*parser.Map)

func removeNestedProperty(mod *parser.Module, patchList *parser.PatchList, propName string) error {
	propNames := strings.Split(propName, ".")

	var propProvider, toRemoveFrom propertyProvider
	propProvider = mod

	var propToRemove *parser.Property
	for i, name := range propNames {
		p, ok := propProvider.GetProperty(name)
		if !ok {
			return nil
		}
	pdkProp, ok := propMap.GetProperty("pdk")
		// if this is the inner most element, it's time to delete
		if i == len(propNames)-1 {
			if propToRemove == nil {
				// if we cannot remove the properties that the current property is nested in,
				// remove only the current property
				propToRemove = p
				toRemoveFrom = propProvider
			}

			// remove the property from the list, in case we remove other properties in this list
			toRemoveFrom.RemoveProperty(propToRemove.Name)
			// only removing the property would leave blank line(s), remove with a patch
			if err := patchList.Add(propToRemove.Pos().Offset, propToRemove.End().Offset+2, ""); err != nil {
				return err
			}
		} else {
			propMap, ok := p.Value.(*parser.Map)
			if !ok {
				return nil
			}
			if len(propMap.Properties) > 1 {
		return patchlist.Add(pdkProp.Pos().Offset, pdkProp.End().Offset+2, "")
				// if there are other properties in this struct, we need to keep this struct
				toRemoveFrom = nil
				propToRemove = nil
			} else if propToRemove == nil {
				// otherwise, we can remove the empty struct entirely
				toRemoveFrom = propProvider
				propToRemove = p
			}
			propProvider = propMap
		}
	}

	return nil
}

func removeObsoleteProperty(propName string) patchListModFunction {
	return func(mod *parser.Module, buf []byte, patchList *parser.PatchList) error {
		return removeNestedProperty(mod, patchList, propName)
	}
	return patchlist.Add(prop.Pos().Offset, prop.End().Offset+2, "")
}

func mergeMatchingModuleProperties(mod *parser.Module, buf []byte, patchlist *parser.PatchList) error {
+166 −2
Original line number Diff line number Diff line
@@ -999,7 +999,171 @@ func TestRemoveSoongConfigBoolVariable(t *testing.T) {
	}
}

func TestRemovePdkProperty(t *testing.T) {
func TestRemoveNestedProperty(t *testing.T) {
	tests := []struct {
		name         string
		in           string
		out          string
		propertyName string
	}{
		{
			name: "remove no nesting",
			in: `
cc_library {
	name: "foo",
	foo: true,
}`,
			out: `
cc_library {
	name: "foo",
}
`,
			propertyName: "foo",
		},
		{
			name: "remove one nest",
			in: `
cc_library {
	name: "foo",
	foo: {
		bar: true,
	},
}`,
			out: `
cc_library {
	name: "foo",
}
`,
			propertyName: "foo.bar",
		},
		{
			name: "remove one nest, multiple props",
			in: `
cc_library {
	name: "foo",
	foo: {
		bar: true,
		baz: false,
	},
}`,
			out: `
cc_library {
	name: "foo",
	foo: {
		baz: false,
	},
}
`,
			propertyName: "foo.bar",
		},
		{
			name: "remove multiple nest",
			in: `
cc_library {
	name: "foo",
	foo: {
		bar: {
			baz: {
				a: true,
			}
		},
	},
}`,
			out: `
cc_library {
	name: "foo",
}
`,
			propertyName: "foo.bar.baz.a",
		},
		{
			name: "remove multiple nest, outer non-empty",
			in: `
cc_library {
	name: "foo",
	foo: {
		bar: {
			baz: {
				a: true,
			}
		},
		other: true,
	},
}`,
			out: `
cc_library {
	name: "foo",
	foo: {
		other: true,
	},
}
`,
			propertyName: "foo.bar.baz.a",
		},
		{
			name: "remove multiple nest, inner non-empty",
			in: `
cc_library {
	name: "foo",
	foo: {
		bar: {
			baz: {
				a: true,
			},
			other: true,
		},
	},
}`,
			out: `
cc_library {
	name: "foo",
	foo: {
		bar: {
			other: true,
		},
	},
}
`,
			propertyName: "foo.bar.baz.a",
		},
		{
			name: "remove multiple nest, inner-most non-empty",
			in: `
cc_library {
	name: "foo",
	foo: {
		bar: {
			baz: {
				a: true,
				other: true,
			},
		},
	},
}`,
			out: `
cc_library {
	name: "foo",
	foo: {
		bar: {
			baz: {
				other: true,
			},
		},
	},
}
`,
			propertyName: "foo.bar.baz.a",
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			runPass(t, test.in, test.out, runPatchListMod(removeObsoleteProperty(test.propertyName)))
		})
	}
}

func TestRemoveObsoleteProperties(t *testing.T) {
	tests := []struct {
		name string
		in   string
@@ -1052,7 +1216,7 @@ func TestRemovePdkProperty(t *testing.T) {
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			runPass(t, test.in, test.out, runPatchListMod(removePdkProperty))
			runPass(t, test.in, test.out, runPatchListMod(removeObsoleteProperty("product_variables.pdk")))
		})
	}
}