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

Commit 6721ab5d authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Allow hwasan variant for vendor_snapshot_static modules"

parents 591c5ee0 39c30311
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -530,8 +530,10 @@ func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entrie

	entries.SubName = ""

	if c.sanitizerProperties.CfiEnabled {
	if c.isSanitizerEnabled(cfi) {
		entries.SubName += ".cfi"
	} else if c.isSanitizerEnabled(Hwasan) {
		entries.SubName += ".hwasan"
	}

	entries.SubName += c.baseProperties.Androidmk_suffix
+13 −4
Original line number Diff line number Diff line
@@ -1171,7 +1171,7 @@ func (s *sanitizerSplitMutator) Split(ctx android.BaseModuleContext) []string {
		//TODO: When Rust modules have vendor support, enable this path for PlatformSanitizeable

		// Check if it's a snapshot module supporting sanitizer
		if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) {
		if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) {
			return []string{"", s.sanitizer.variationName()}
		} else {
			return []string{""}
@@ -1203,7 +1203,7 @@ func (s *sanitizerSplitMutator) OutgoingTransition(ctx android.OutgoingTransitio
func (s *sanitizerSplitMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
	if d, ok := ctx.Module().(PlatformSanitizeable); ok {
		if dm, ok := ctx.Module().(*Module); ok {
			if ss, ok := dm.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) {
			if ss, ok := dm.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) {
				return incomingVariation
			}
		}
@@ -1319,14 +1319,23 @@ func (s *sanitizerSplitMutator) Mutate(mctx android.BottomUpMutatorContext, vari
			sanitizeable.AddSanitizerDependencies(mctx, s.sanitizer.name())
		}
	} else if c, ok := mctx.Module().(*Module); ok {
		if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) {
		if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) {
			if !ss.isUnsanitizedVariant() {
				// Snapshot sanitizer may have only one variantion.
				// Skip exporting the module if it already has a sanitizer variation.
				c.SetPreventInstall()
				c.SetHideFromMake()
				return
			}
			c.linker.(snapshotSanitizer).setSanitizerVariation(s.sanitizer, sanitizerVariation)

			// Export the static lib name to make
			if c.static() && c.ExportedToMake() {
				if s.sanitizer == cfi {
				// use BaseModuleName which is the name for Make.
				if s.sanitizer == cfi {
					cfiStaticLibs(mctx.Config()).add(c, c.BaseModuleName())
				} else if s.sanitizer == Hwasan {
					hwasanStaticLibs(mctx.Config()).add(c, c.BaseModuleName())
				}
			}
		}
+27 −10
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package cc
// snapshot mutators and snapshot information maps which are also defined in this file.

import (
	"fmt"
	"strings"

	"android/soong/android"
@@ -399,8 +400,10 @@ type SnapshotLibraryProperties struct {
}

type snapshotSanitizer interface {
	isSanitizerEnabled(t SanitizerType) bool
	isSanitizerAvailable(t SanitizerType) bool
	setSanitizerVariation(t SanitizerType, enabled bool)
	isSanitizerEnabled(t SanitizerType) bool
	isUnsanitizedVariant() bool
}

type snapshotLibraryDecorator struct {
@@ -408,10 +411,13 @@ type snapshotLibraryDecorator struct {
	*libraryDecorator
	properties          SnapshotLibraryProperties
	sanitizerProperties struct {
		CfiEnabled bool `blueprint:"mutated"`
		SanitizerVariation SanitizerType `blueprint:"mutated"`

		// Library flags for cfi variant.
		Cfi SnapshotLibraryProperties `android:"arch_variant"`

		// Library flags for hwasan variant.
		Hwasan SnapshotLibraryProperties `android:"arch_variant"`
	}
}

@@ -450,8 +456,10 @@ func (p *snapshotLibraryDecorator) link(ctx ModuleContext, flags Flags, deps Pat
		return p.libraryDecorator.link(ctx, flags, deps, objs)
	}

	if p.sanitizerProperties.CfiEnabled {
	if p.isSanitizerEnabled(cfi) {
		p.properties = p.sanitizerProperties.Cfi
	} else if p.isSanitizerEnabled(Hwasan) {
		p.properties = p.sanitizerProperties.Hwasan
	}

	if !p.MatchesWithDevice(ctx.DeviceConfig()) {
@@ -514,25 +522,34 @@ func (p *snapshotLibraryDecorator) nativeCoverage() bool {
	return false
}

func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool {
func (p *snapshotLibraryDecorator) isSanitizerAvailable(t SanitizerType) bool {
	switch t {
	case cfi:
		return p.sanitizerProperties.Cfi.Src != nil
	case Hwasan:
		return p.sanitizerProperties.Hwasan.Src != nil
	default:
		return false
	}
}

func (p *snapshotLibraryDecorator) setSanitizerVariation(t SanitizerType, enabled bool) {
	if !enabled {
	if !enabled || p.isSanitizerEnabled(t) {
		return
	}
	switch t {
	case cfi:
		p.sanitizerProperties.CfiEnabled = true
	default:
		return
	if !p.isUnsanitizedVariant() {
		panic(fmt.Errorf("snapshot Sanitizer must be one of Cfi or Hwasan but not both"))
	}
	p.sanitizerProperties.SanitizerVariation = t
}

func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool {
	return p.sanitizerProperties.SanitizerVariation == t
}

func (p *snapshotLibraryDecorator) isUnsanitizedVariant() bool {
	return !p.isSanitizerEnabled(Asan) &&
		!p.isSanitizerEnabled(Hwasan)
}

func snapshotLibraryFactory(image SnapshotImage, moduleSuffix string) (*Module, *snapshotLibraryDecorator) {
+17 −2
Original line number Diff line number Diff line
@@ -1053,6 +1053,7 @@ func TestVendorSnapshotSanitizer(t *testing.T) {
			},
		},
	}

	vendor_snapshot_static {
		name: "libsnapshot",
		vendor: true,
@@ -1063,7 +1064,10 @@ func TestVendorSnapshotSanitizer(t *testing.T) {
				src: "libsnapshot.a",
				cfi: {
					src: "libsnapshot.cfi.a",
				}
				},
				hwasan: {
					src: "libsnapshot.hwasan.a",
				},
			},
		},
	}
@@ -1098,6 +1102,7 @@ func TestVendorSnapshotSanitizer(t *testing.T) {
		"vendor/libc++demangle.a":        nil,
		"vendor/libsnapshot.a":           nil,
		"vendor/libsnapshot.cfi.a":       nil,
		"vendor/libsnapshot.hwasan.a":    nil,
		"vendor/note_memtag_heap_sync.a": nil,
	}

@@ -1106,15 +1111,25 @@ func TestVendorSnapshotSanitizer(t *testing.T) {
	config.TestProductVariables.Platform_vndk_version = StringPtr("29")
	ctx := testCcWithConfig(t, config)

	// Check non-cfi and cfi variant.
	// Check non-cfi, cfi and hwasan variant.
	staticVariant := "android_vendor.28_arm64_armv8-a_static"
	staticCfiVariant := "android_vendor.28_arm64_armv8-a_static_cfi"
	staticHwasanVariant := "android_vendor.28_arm64_armv8-a_static_hwasan"
	staticHwasanCfiVariant := "android_vendor.28_arm64_armv8-a_static_hwasan_cfi"

	staticModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticVariant).Module().(*Module)
	assertString(t, staticModule.outputFile.Path().Base(), "libsnapshot.a")

	staticCfiModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticCfiVariant).Module().(*Module)
	assertString(t, staticCfiModule.outputFile.Path().Base(), "libsnapshot.cfi.a")

	staticHwasanModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticHwasanVariant).Module().(*Module)
	assertString(t, staticHwasanModule.outputFile.Path().Base(), "libsnapshot.hwasan.a")

	staticHwasanCfiModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticHwasanCfiVariant).Module().(*Module)
	if !staticHwasanCfiModule.HiddenFromMake() || !staticHwasanCfiModule.PreventInstall() {
		t.Errorf("Hwasan and Cfi cannot enabled at the same time.")
	}
}

func TestVendorSnapshotExclude(t *testing.T) {