From e59bb6221076c24600203bbe6f936a6fd110b8bea7c6940318f3b48ee044f07b Mon Sep 17 00:00:00 2001
From: Aleksa Sarai <asarai@suse.com>
Date: Thu, 5 May 2022 06:18:13 +0000
Subject: [PATCH] Accepting request 975050 from home:cyphar:lxc

- Backport upstream patch to fix build on x32 systems.
  + 0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch

OBS-URL: https://build.opensuse.org/request/show/975050
OBS-URL: https://build.opensuse.org/package/show/Virtualization:containers/lxd?expand=0&rev=107
---
 ...sysinfo-syscall-interception-on-32-b.patch | 174 ++++++++++++++++++
 lxd.changes                                   |   2 +
 lxd.spec                                      |   4 +
 3 files changed, 180 insertions(+)
 create mode 100644 0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch

diff --git a/0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch b/0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch
new file mode 100644
index 0000000..63195de
--- /dev/null
+++ b/0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch
@@ -0,0 +1,174 @@
+From fd6845ddda3f80cdd24a8f94c42acce6bff0c41f Mon Sep 17 00:00:00 2001
+From: Thomas Parrott <thomas.parrott@canonical.com>
+Date: Fri, 29 Apr 2022 11:12:48 +0100
+Subject: [PATCH] lxd/secommp: Fix sysinfo syscall interception on 32 bit
+ platforms
+
+Fixes #10347
+
+Backport: <https://github.com/lxc/lxd/pull/10348>
+Signed-off-by: Thomas Parrott <thomas.parrott@canonical.com>
+---
+ lxd/seccomp/seccomp.go    | 22 ++++++++++++++--------
+ lxd/seccomp/sysinfo.go    | 13 +++++++++++++
+ lxd/seccomp/sysinfo_32.go | 19 +++++++++++++++++++
+ lxd/seccomp/sysinfo_64.go | 19 +++++++++++++++++++
+ 4 files changed, 65 insertions(+), 8 deletions(-)
+ create mode 100644 lxd/seccomp/sysinfo.go
+ create mode 100644 lxd/seccomp/sysinfo_32.go
+ create mode 100644 lxd/seccomp/sysinfo_64.go
+
+diff --git a/lxd/seccomp/seccomp.go b/lxd/seccomp/seccomp.go
+index 03fee3c71a09..203d408a8286 100644
+--- a/lxd/seccomp/seccomp.go
++++ b/lxd/seccomp/seccomp.go
+@@ -1709,6 +1709,7 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 
+ 	defer l.Debug("Handling sysinfo syscall")
+ 
++	// Pre-fill sysinfo struct with metrics from host system.
+ 	info := unix.Sysinfo_t{}
+ 	err := unix.Sysinfo(&info)
+ 	if err != nil {
+@@ -1718,6 +1719,8 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 		return 0
+ 	}
+ 
++	instMetrics := Sysinfo{} // Architecture independent place to hold instance metrics.
++
+ 	cg, err := cgroup.NewFileReadWriter(int(siov.msg.init_pid), liblxc.HasApiExtension("cgroup2"))
+ 	if err != nil {
+ 		l.Warn("Failed loading cgroup", logger.Ctx{"err": err, "pid": siov.msg.init_pid})
+@@ -1735,7 +1738,7 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 		return 0
+ 	}
+ 
+-	info.Uptime = int64(time.Now().Sub(f.ModTime()).Seconds())
++	instMetrics.Uptime = int64(time.Now().Sub(f.ModTime()).Seconds())
+ 
+ 	// Get instance process count.
+ 	pids, err := cg.GetTotalProcesses()
+@@ -1746,7 +1749,7 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 		return 0
+ 	}
+ 
+-	info.Procs = uint16(pids)
++	instMetrics.Procs = uint16(pids)
+ 
+ 	// Get instance memory stats.
+ 	memStats, err := cg.GetMemoryStats()
+@@ -1760,9 +1763,9 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 	for k, v := range memStats {
+ 		switch k {
+ 		case "shmem":
+-			info.Sharedram = v
++			instMetrics.Sharedram = v
+ 		case "cache":
+-			info.Bufferram = v
++			instMetrics.Bufferram = v
+ 		}
+ 	}
+ 
+@@ -1784,8 +1787,8 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 		return 0
+ 	}
+ 
+-	info.Totalram = uint64(memoryLimit)
+-	info.Freeram = info.Totalram - uint64(memoryUsage) - info.Bufferram
++	instMetrics.Totalram = uint64(memoryLimit)
++	instMetrics.Freeram = instMetrics.Totalram - uint64(memoryUsage) - instMetrics.Bufferram
+ 
+ 	// Get instance swap info.
+ 	if s.s.OS.CGInfo.Supports(cgroup.MemorySwapUsage, cg) {
+@@ -1805,14 +1808,17 @@ func (s *Server) HandleSysinfoSyscall(c Instance, siov *Iovec) int {
+ 			return 0
+ 		}
+ 
+-		info.Totalswap = uint64(swapLimit)
+-		info.Freeswap = info.Totalswap - uint64(swapUsage)
++		instMetrics.Totalswap = uint64(swapLimit)
++		instMetrics.Freeswap = instMetrics.Totalswap - uint64(swapUsage)
+ 	}
+ 
+ 	// Get writable pointer to buffer of sysinfo syscall result.
+ 	const sz = int(unsafe.Sizeof(info))
+ 	var b []byte = (*(*[sz]byte)(unsafe.Pointer(&info)))[:]
+ 
++	// Write instance metrics to native sysinfo struct.
++	instMetrics.ToNative(&info)
++
+ 	// Write sysinfo response into buffer.
+ 	_, err = unix.Pwrite(siov.memFd, b, int64(siov.req.data.args[0]))
+ 	if err != nil {
+diff --git a/lxd/seccomp/sysinfo.go b/lxd/seccomp/sysinfo.go
+new file mode 100644
+index 000000000000..b255894af26e
+--- /dev/null
++++ b/lxd/seccomp/sysinfo.go
+@@ -0,0 +1,13 @@
++package seccomp
++
++// Sysinfo architecture independent sysinfo struct.
++type Sysinfo struct {
++	Uptime    int64
++	Totalram  uint64
++	Freeram   uint64
++	Sharedram uint64
++	Bufferram uint64
++	Totalswap uint64
++	Freeswap  uint64
++	Procs     uint16
++}
+diff --git a/lxd/seccomp/sysinfo_32.go b/lxd/seccomp/sysinfo_32.go
+new file mode 100644
+index 000000000000..e52808300dd0
+--- /dev/null
++++ b/lxd/seccomp/sysinfo_32.go
+@@ -0,0 +1,19 @@
++//go:build 386 || arm || ppc || s390 || mips || mipsle
++
++package seccomp
++
++import (
++	"golang.org/x/sys/unix"
++)
++
++// ToNative fills fields from s into native fields.
++func (s *Sysinfo) ToNative(n *unix.Sysinfo_t) {
++	n.Bufferram = uint32(s.Bufferram)
++	n.Freeram = uint32(s.Freeram)
++	n.Freeswap = uint32(s.Freeswap)
++	n.Procs = s.Procs
++	n.Sharedram = uint32(s.Sharedram)
++	n.Totalram = uint32(s.Totalram)
++	n.Totalswap = uint32(s.Totalswap)
++	n.Uptime = int32(s.Uptime)
++}
+diff --git a/lxd/seccomp/sysinfo_64.go b/lxd/seccomp/sysinfo_64.go
+new file mode 100644
+index 000000000000..84383b1c5a86
+--- /dev/null
++++ b/lxd/seccomp/sysinfo_64.go
+@@ -0,0 +1,19 @@
++//go:build amd64 || ppc64 || ppc64le || arm64 || s390x || mips64 || mips64le || riscv64
++
++package seccomp
++
++import (
++	"golang.org/x/sys/unix"
++)
++
++// ToNative fills fields from s into native fields.
++func (s *Sysinfo) ToNative(n *unix.Sysinfo_t) {
++	n.Bufferram = s.Bufferram
++	n.Freeram = s.Freeram
++	n.Freeswap = s.Freeswap
++	n.Procs = s.Procs
++	n.Sharedram = s.Sharedram
++	n.Totalram = s.Totalram
++	n.Totalswap = s.Totalswap
++	n.Uptime = s.Uptime
++}
+-- 
+2.35.1
+
diff --git a/lxd.changes b/lxd.changes
index 685dd73..41dfc04 100644
--- a/lxd.changes
+++ b/lxd.changes
@@ -11,6 +11,8 @@ Thu May  5 04:27:43 UTC 2022 - Aleksa Sarai <asarai@suse.com>
   + Configurable host network interface naming pattern
   * Overrideable evacuation mode
   * Setting profiles during an image copy
+- Backport upstream patch to fix build on x32 systems.
+  + 0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch
 
 -------------------------------------------------------------------
 Thu May  5 03:31:24 UTC 2022 - Aleksa Sarai <asarai@suse.com>
diff --git a/lxd.spec b/lxd.spec
index 30149c5..869db91 100644
--- a/lxd.spec
+++ b/lxd.spec
@@ -51,6 +51,8 @@ Source101:      %{name}-config.yml
 # Additional runtime configuration.
 Source200:      %{name}.sysctl
 Source201:      %{name}.dnsmasq
+# OPENSUSE-UPSTREAM-FIX: Backport of <https://github.com/lxc/lxd/pull/10348>.
+Patch1:         0001-lxd-secommp-Fix-sysinfo-syscall-interception-on-32-b.patch
 BuildRequires:  fdupes
 BuildRequires:  golang-packaging
 BuildRequires:  libacl-devel
@@ -123,6 +125,8 @@ Bash command line completion support for %{name}.
 
 %prep
 %setup -q
+# https://github.com/lxc/lxd/pull/10348
+%patch1 -p1
 
 %build
 # Make sure any leftover go build caches are gone.