From f71382332b52d987b74a90c15371a2fd9d48c389 Mon Sep 17 00:00:00 2001
From: Roman Khavronenko <roman@victoriametrics.com>
Date: Wed, 16 Aug 2023 14:45:35 +0200
Subject: [PATCH] vmbackup: correctly check if specified `-dst` belongs to
 specified `-storageDataPath` (#4841)

See this issue https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4837

Signed-off-by: hagen1778 <roman@victoriametrics.com>
---
 app/vmbackup/main.go      | 15 ++++++++++++++-
 app/vmbackup/main_test.go |  5 +++++
 docs/CHANGELOG.md         |  1 +
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/app/vmbackup/main.go b/app/vmbackup/main.go
index 06c9e475de..f42dfa73fc 100644
--- a/app/vmbackup/main.go
+++ b/app/vmbackup/main.go
@@ -205,7 +205,20 @@ func hasFilepathPrefix(path, prefix string) bool {
 	if err != nil {
 		return false
 	}
-	return strings.HasPrefix(pathAbs, prefixAbs)
+	if prefixAbs == pathAbs {
+		return true
+	}
+	rel, err := filepath.Rel(prefixAbs, pathAbs)
+	if err != nil {
+		// if paths can't be related - they don't match
+		return false
+	}
+	if i := strings.Index(rel, "."); i == 0 {
+		// if path can be related only with . as first char - they still don't match
+		return false
+	}
+	// if paths are related - it is a match
+	return true
 }
 
 func newOriginFS() (common.OriginFS, error) {
diff --git a/app/vmbackup/main_test.go b/app/vmbackup/main_test.go
index f3288fb499..c1a87e51d3 100644
--- a/app/vmbackup/main_test.go
+++ b/app/vmbackup/main_test.go
@@ -26,4 +26,9 @@ func TestHasFilepathPrefix(t *testing.T) {
 	f("fs://"+pwd+"/foo", pwd+"/foo/bar", false)
 	f("fs://"+pwd+"/foo/bar", pwd+"/foo", true)
 	f("fs://"+pwd+"/foo", pwd+"/bar", false)
+	f("fs:///data1", "/data", false)
+	f("fs:///data", "/data1", false)
+	f("fs:///data", "/data/foo", false)
+	f("fs:///data/foo", "/data", true)
+	f("fs:///data/foo/", "/data/", true)
 }
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index b14751bc64..af043aebd7 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -24,6 +24,7 @@ The following `tip` changes can be tested by building VictoriaMetrics components
 
 ## tip
 
+* BUGFIX: [vmbackup](https://docs.victoriametrics.com/vmbackup.html): correctly check if specified `-dst` belongs to specified `-storageDataPath`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4837).
 * BUGFIX: [vmctl](https://docs.victoriametrics.com/vmctl.html): don't interrupt the migration process if no metrics were found for a specific tenant. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4796).
 
 ## [v1.93.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.93.0)