From 54e52532eb1146626643b9bf27e3077459c53628 Mon Sep 17 00:00:00 2001 From: Sonia Appasamy Date: Fri, 8 Mar 2024 12:26:38 -0500 Subject: [PATCH] version/mkversion: enforce synology versions within int32 range Synology requires version numbers are within int32 range. This change updates the version logic to keep things closer within the range, and errors on building when the range is exceeded. Updates #cleanup Signed-off-by: Sonia Appasamy --- release/dist/synology/pkgs.go | 12 +++++++++++- version/mkversion/mkversion.go | 9 +++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/release/dist/synology/pkgs.go b/release/dist/synology/pkgs.go index a079b980e..d6df06d96 100644 --- a/release/dist/synology/pkgs.go +++ b/release/dist/synology/pkgs.go @@ -9,6 +9,7 @@ import ( "bytes" "compress/gzip" "embed" + "errors" "fmt" "io" "io/fs" @@ -42,7 +43,8 @@ func (t *target) Build(b *dist.Build) ([]string, error) { } func (t *target) buildSPK(b *dist.Build, inner *innerPkg) ([]string, error) { - filename := fmt.Sprintf("tailscale-%s-%s-%d-dsm%d.spk", t.filenameArch, b.Version.Short, b.Version.Synology[t.dsmMajorVersion], t.dsmMajorVersion) + synoVersion := b.Version.Synology[t.dsmMajorVersion] + filename := fmt.Sprintf("tailscale-%s-%s-%d-dsm%d.spk", t.filenameArch, b.Version.Short, synoVersion, t.dsmMajorVersion) out := filepath.Join(b.Out, filename) if t.packageCenter { log.Printf("Building %s (for package center)", filename) @@ -50,6 +52,14 @@ func (t *target) buildSPK(b *dist.Build, inner *innerPkg) ([]string, error) { log.Printf("Building %s (for sideloading)", filename) } + if synoVersion > 2147483647 { + // Synology requires that version number is within int32 range. + // Erroring here if we create a build with a higher version. + // In this case, we'll want to adjust the VersionInfo.Synology logic in + // the mkversion package. + return nil, errors.New("syno version exceeds int32 range") + } + privFile := fmt.Sprintf("privilege-dsm%d", t.dsmMajorVersion) if t.packageCenter && t.dsmMajorVersion == 7 { privFile += ".for-package-center" diff --git a/version/mkversion/mkversion.go b/version/mkversion/mkversion.go index c09473256..49f97be53 100644 --- a/version/mkversion/mkversion.go +++ b/version/mkversion/mkversion.go @@ -251,8 +251,13 @@ func mkOutput(v verInfo) (VersionInfo, error) { GitDate: fmt.Sprintf("%s", v.date), Track: track, Synology: map[int]int64{ - 6: 6*1_000_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), - 7: 7*1_000_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), + // Synology requires that version numbers be in a specific format. + // Builds with version numbers that don't start with "60" or "70" will fail, + // and the full version number must be within int32 range. + // So, we do the following mapping from our Tailscale version to Synology version, + // giving major version three decimal places, minor version three, and patch two. + 6: 6*100_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), + 7: 7*100_000_000 + int64(v.major-1)*1_000_000 + int64(v.minor)*1_000 + int64(v.patch), }, }