Escape RequiresMountsFor value

Signed-off-by: Dmitry Konishchev <konishchev@gmail.com>
This commit is contained in:
Dmitry Konishchev
2025-10-27 20:01:45 +03:00
parent c8ba67f6b9
commit 601a072b51
3 changed files with 15 additions and 2 deletions

View File

@@ -879,6 +879,15 @@ func (f *UnitFile) Add(groupName string, key string, value string) {
group.add(key, value) group.add(key, value)
} }
func (f *UnitFile) AddEscaped(groupName string, key string, value string) {
if wordNeedEscape(value) {
var escaped strings.Builder
appendEscapeWord(&escaped, value)
value = escaped.String()
}
f.Add(groupName, key, value)
}
func (f *UnitFile) AddCmdline(groupName string, key string, args []string) { func (f *UnitFile) AddCmdline(groupName string, key string, args []string) {
f.Add(groupName, key, escapeWords(args)) f.Add(groupName, key, escapeWords(args))
} }

View File

@@ -1151,7 +1151,7 @@ func ConvertVolume(volume *parser.UnitFile, unitsInfoMap map[string]*UnitInfo, i
if devValid { if devValid {
podman.add("--opt", fmt.Sprintf("type=%s", devType)) podman.add("--opt", fmt.Sprintf("type=%s", devType))
if devType == "bind" { if devType == "bind" {
service.Add(UnitGroup, "RequiresMountsFor", dev) service.AddEscaped(UnitGroup, "RequiresMountsFor", dev)
} }
} else { } else {
return nil, warnings, fmt.Errorf("key Type can't be used without Device") return nil, warnings, fmt.Errorf("key Type can't be used without Device")
@@ -1929,7 +1929,7 @@ func handleStorageSource(quadletUnitFile, serviceUnitFile *parser.UnitFile, sour
} }
if source[0] == '/' { if source[0] == '/' {
// Absolute path // Absolute path
serviceUnitFile.Add(UnitGroup, "RequiresMountsFor", source) serviceUnitFile.AddEscaped(UnitGroup, "RequiresMountsFor", source)
} else if strings.HasSuffix(source, ".volume") || (checkImage && strings.HasSuffix(source, ".image")) || strings.HasSuffix(source, ".artifact") { } else if strings.HasSuffix(source, ".volume") || (checkImage && strings.HasSuffix(source, ".image")) || strings.HasSuffix(source, ".artifact") {
sourceUnitInfo, ok := unitsInfoMap[source] sourceUnitInfo, ok := unitsInfoMap[source]
if !ok { if !ok {

View File

@@ -1,7 +1,11 @@
[Container] [Container]
Image=localhost/imagename Image=localhost/imagename
## assert-has-key Unit RequiresMountsFor "/path/on/host"
## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host,destination=/path/in/container" ## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host,destination=/path/in/container"
Mount=type=bind,source=/path/on/host,destination=/path/in/container Mount=type=bind,source=/path/on/host,destination=/path/in/container
## assert-has-key Unit RequiresMountsFor "\"/path/on/host\\x20with\\x20spaces\""
## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host with spaces,dst=/path"
Mount="type=bind,src=/path/on/host with spaces,dst=/path"
## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host,dst=/path/in/container,relabel=shared" ## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host,dst=/path/in/container,relabel=shared"
Mount=type=bind,src=/path/on/host,dst=/path/in/container,relabel=shared Mount=type=bind,src=/path/on/host,dst=/path/in/container,relabel=shared
## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host,dst=/path/in/container,relabel=shared,U=true" ## assert-podman-args-key-val "--mount" "," "type=bind,source=/path/on/host,dst=/path/in/container,relabel=shared,U=true"