Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.

Commit 5115d4c

Browse files
committed
Escape disk image paths
1 parent cdfe3cf commit 5115d4c

3 files changed

Lines changed: 43 additions & 1 deletion

File tree

tests/misc-xml-escaping.xml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<domain type='xen'>
2+
<name>TestGuest</name>
3+
<currentMemory>204800</currentMemory>
4+
<memory>409600</memory>
5+
<uuid>12345678-1234-1234-1234-123456789012</uuid>
6+
<os>
7+
<type>hvm</type>
8+
<loader>/usr/lib/xen/boot/hvmloader</loader>
9+
<boot dev='cdrom'/>
10+
</os>
11+
<features>
12+
<acpi/><apic/>
13+
</features>
14+
<clock offset="utc"/>
15+
<on_poweroff>destroy</on_poweroff>
16+
<on_reboot>destroy</on_reboot>
17+
<on_crash>destroy</on_crash>
18+
<vcpu>5</vcpu>
19+
<devices>
20+
<emulator>/usr/lib/xen/bin/qemu-dm</emulator>
21+
<console device='pty'/>
22+
<disk type='file' device='disk'>
23+
<source file='/ISO&apos;s'/>
24+
<target dev='hda'/>
25+
</disk>
26+
<disk type='block' device='cdrom'>
27+
<source dev='/dev/loop0'/>
28+
<target dev='hdc'/>
29+
<readonly/>
30+
</disk>
31+
32+
33+
<input type='mouse' bus='ps2'/>
34+
<graphics type='sdl'/>
35+
</devices>
36+
</domain>

tests/xmlconfig.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ def testInstallFullyvirtDiskBlock(self):
180180
self._compare(g, "install-fullyvirt-disk-block", True)
181181

182182

183+
def testXMLEscaping(self):
184+
g = self._get_basic_fullyvirt_guest()
185+
g.disks.append(virtinst.VirtualDisk("/ISO's", type=virtinst.VirtualDisk.TYPE_FILE, size=5))
186+
self._compare(g, "misc-xml-escaping", True)
187+
183188

184189
if __name__ == "__main__":
185190
unittest.main()

virtinst/Guest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ def get_xml_config(self, disknode):
180180
else:
181181
ret += " <driver name='%(name)s' type='%(type)s'/>\n" % { "name": self.driver_name, "type": self.driver_type }
182182
if self.path is not None:
183-
ret += " <source %(typeattr)s='%(disk)s'/>\n" % { "typeattr": typeattr, "disk": self.path }
183+
path = self.path.replace("'", "&apos;")
184+
ret += " <source %(typeattr)s='%(disk)s'/>\n" % { "typeattr": typeattr, "disk": path }
184185
if self.target is not None:
185186
disknode = self.target
186187
ret += " <target dev='%(disknode)s'/>\n" % { "disknode": disknode }

0 commit comments

Comments
 (0)