[Libvirt-announce] LSN-2015-0002: small memory leak in ListAll APIs
by Eric Blake
Libvirt Security Notice: LSN-2015-0002
======================================
Summary: small memory leak in ListAll APIs
Reported on: 20150313
Published on: 20150316
Fixed on: 20150316
Reported by: Eric Blake <eblake(a)redhat.com>
Patched by: Eric Blake <eblake(a)redhat.com>
Description
-----------
The interfaces remoteDispatchConnectListAllDomains,
remoteDispatchDomainListAllSnapshots,
remoteDispatchDomainSnapshotListAllChildren,
remoteDispatchConnectListAllStoragePools,
remoteDispatchStoragePoolListAllVolumes,
remoteDispatchConnectListAllNetworks,
remoteDispatchConnectListAllInterfaces,
remoteDispatchConnectListAllNodeDevices,
remoteDispatchConnectListAllNWFilters,
remoteDispatchConnectListAllSecrets, and
remoteDispatchNetworkGetDHCPLeases each have a guarantee that on a
successful return, an array with a trailing NULL slot will be
allocated, with the array size at least one larger than the return
value. However, when using a remote connection where any of these
calls returned a result of 0, the allocated array was leaked in the
libvirtd server side of the API call.
Impact
------
Since each ListAll API call is accessible to read-only clients, a
client could repeatedly call the APIs to leak memory and attempt
turning it into an out-of-memory denial of service against more
privileged clients. In practice, though, since the leak is typically
only 8 bytes per API call, an out-of-memory condition is unlikely to
occur unless the client is calling the API so frequently as to be
obvious that the client is attempting a denial of service long
before memory is exhausted, so this vulnerability was not assigned a
CVE.
Workaround
----------
It is possible to guarantee that a memory leak cannot be escalated
into a denial of service attack by preventing read-only connections
and avoiding the use of fine-grained Access Control Lists (although
this does not prevent the leaks, such a problem is no longer a
security attack). Meanwhile, monitoring the libvirtd process for
unexpected memory usage can be used to detect if any client is
intentionally trying to exploit a memory leak, where restarting
libvirtd is effective at avoiding issues where an eventual
out-of-memory condition would cause adverse behavior.
Affected product
----------------
Name: libvirt
Repository: git://libvirt.org/git/libvirt.git
http://libvirt.org/git/?p=libvirt.git
Branch: master
Broken in: v1.2.8
Broken in: v1.2.9
Broken in: v1.2.10
Broken in: v1.2.11
Broken in: v1.2.12
Broken in: v1.2.13
Fixed in: v1.2.14
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: 3c2ff5029b83c9b33be0f1607a3c61f4f5850612
Branch: v1.2.8-maint
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: 4fc4f669eb6a1d776b917d410b6db46e09b6feed
Branch: v1.2.9-maint
Broken in: v1.2.9.1
Broken in: v1.2.9.2
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: b9dacdd4d992ba1e5aab2e0189cf64b36a1a7e13
Branch: v1.2.10-maint
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: 70461a11b3410053b89c8c9309e011ce4f62bc07
Branch: v1.2.11-maint
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: b175298be8e92eb3d7883fa3927b97db04d449be
Branch: v1.2.12-maint
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: 34538870c770515fc38fa3c71f39e8765113316d
Branch: v1.2.13-maint
Broken by: 4f25146bf4335cb2b1b31c07dab39e26458bdf61
Fixed by: 117f60ca53eb36aa7751573ac274850bd96a4799
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
9 years, 9 months
[Libvirt-announce] ANNOUNCE: Libvirt Designer version 0.0.2 released
by Daniel P. Berrange
I'm pleased to announce the second release of the libvirt designer
library, version 0.0.2
ftp://ftp.libvirt.org/libvirt/designer/libvirt-designer-0.0.2.tar.gz
The release is signed
ftp://ftp.libvirt.org/libvirt/designer/libvirt-designer-0.0.2.tar.gz.asc
with the GPG key having the fingerprint
DAF3 A6FD B26B 6291 2D0E 8E3F BE86 EBB4 1510 4FDF (4096R)
In this release:
- Bumped soname & version for ABI change
- Remove use of deprecated libosinfo calls
- Fix various memory leaks
- Treat errors loading the libosinfo DB as non-fatal
as some data may be successfully loaded
- Improve building of libosinfo short-id from libvirt
capabilities information
- Expose the libosinfo DB object via a property on the
domain object
- Don't set PKG_CONFIG_PATH for g-ir-scanner
- Auto-generate list of AUTHORS
- Avoid redefining _FORTIFY_SOURCE macro
- Fix & add gtk-doc introspection annotation
- Add Vala APi binding
- Add support for floppy & CDROM devices
- Use libvirt style libtool versioning csheme
- Add API to set list of installed drivers
- Add API for querying supported devices
- Remove many bogus assumptions in disk bus handling
- Populate clock settings, input devices & console
- Add API for enabling sound devices
- Add AP ifor enabling choice of graphics backends
- Add SPICE agent if using SPICE
- Add API for enabling USB redirection
- Add API for enabling smartcard devices
- Add API for enabling video devices
- Import latest compiler warnings from gnulib
- Avoid using deprecated libvirt-gconfig APIs
- Rename virtxml binary to virt-designer
- Add API for choosing network backend type
- Add further test cases for validing domain builder
- Always build test programs
The libvirt-designer library builds on top of the libvirt-gconfig and
libosinfo libraries, to provide an API that assists applications in
building guest domain configurations based on libosinfo policy. The
intention is that it be usable from applications such as virt-manager
and GNOME boxes which currently duplicate this kind of policy based
configuration logic between them. It is still at an early experimental
stage of development so it is liable to have further ABI incompatible
changes in future releases, which will require recompiling applications
and possibly source level changes too.
Thanks to all the people who contributed towards this new release.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
9 years, 9 months
[Libvirt-announce] Release of libvirt-1.2.13
by Daniel Veillard
As planned I just made the release for libvirt-1.2.13, it's tagged in
git, and signed tarballs and rpms are available at the usual place:
ftp://libvirt.org/libvirt/
I also pushed a 1.2.13 for libvirt-python but it's really for
completeness as it's virtuallyequivalent to 1.2.12.
February is short, that release packs 'only' 220 commits, mostly
bug fixes and a fair set of improvment, with the NUMA handling area
getting a fairly large update:
Features:
- a lot of NUMA updates and improvments (Peter Krempa)
Documentation:
- Add mist.io as libvirt-based application (Michal Privoznik)
- Fix typos in messages (Yuri Chornoivan)
- Clarify behavior or virDomainDetachDevice (Ján Tomko)
- virsh: Add missing parenthesis into man page (Martin Kletzander)
- man: moved virsh command cpu-models (Daniel Hansel)
- clarify nat range behavior (Ján Tomko)
- add page about virtlockd setup (Daniel P. Berrange)
- split out sanlock setup docs (Daniel P. Berrange)
- Fix version reference in vcpu/iothread scheduling (Martin Kletzander)
- S390: Documentation for ccw address type (Stefan Zimmermann)
- conf: fix a minor typo (Erik Skultety)
- virsh: man: Document behavior of some blkdeviotune's flags when querying (Peter Krempa)
Portability:
- virprocess: fix MinGW build and RHEL-5 build (Pavel Hrdina)
- virutil: fix MinGW build (Pavel Hrdina)
- Make tests independant of system page size (Daniel P. Berrange)
Bug Fixes:
- Really fix XML formatting flags in SaveImageUpdateDef (Ján Tomko)
- Ignore listen attribute of <graphics> for type network listens (Ján Tomko)
- util: storage: Fix error type in virStorageSourceParseBackingURI (Peter Krempa)
- util: storagefile: Don't crash on gluster URIs without path (Peter Krempa)
- conf: error out on invalid host id (Luyao Huang)
- qemu: fix ifindex array reported to systemd (Laine Stump)
- util: check for null ifname inside virNetDevBandwidthSet() (Laine Stump)
- network: only clear bandwidth if it has been set (Laine Stump)
- Fix error messages in virStorageFileGetMetadataFromFD (Ján Tomko)
- Assign default SCSI controller model before checking attribute validity (Ján Tomko)
- qemu: Use correct flags for ABI stability check in SaveImageUpdateDef (Michal Privoznik)
- qemu: fix memory leak while starting a guest (Pavel Hrdina)
- network_conf: Forbid commas in DNS TXT (Michal Privoznik)
- qemuMigrationDriveMirror: Listen to events (Michal Privoznik)
- qemu: Exit job on error path of qemuDomainSetVcpusFlags() (Peter Krempa)
- daemon: Fix segfault by reloading daemon right after start (Pavel Hrdina)
- qemu_cgroup: initialize mem_mask to NULL (Pavel Hrdina)
- PowerPC : Forbid NULL CPU model with 'host-model' mode. (Prerna Saxena)
- qemu: fix vm deadlock when try to use numatune in session mode (Luyao Huang)
- virsh: fix IP address in vncdisplay for listen type='network' (Luyao Huang)
- libxl: Resolve Coverity CHECKED_RETURN (John Ferlan)
- security: Resolve Coverity RESOURCE_LEAK (John Ferlan)
- lxc: Fix container cleanup for LXCProcessStart (Luyao Huang)
- lxc: Move console checks in LXCProcessStart (Luyao Huang)
- security: Refactor virSecurityManagerGenLabel (Erik Skultety)
- security: introduce virSecurityManagerCheckAllLabel function (Erik Skultety)
- Fix a syntax error in the description text of libvirtd.conf (Zhang Bo)
- Allow shrinking of file based volumes (Daniel P. Berrange)
- qemu: do upfront check for vcpupids being null when querying pinning (Daniel P. Berrange)
- qemu: fix setting of VM CPU affinity with TCG (Daniel P. Berrange)
- libxl: disable VNC and SDL until explicitly enabled (Marek Marczykowski-Górecki)
- libxl: pass ipaddr to libxl toolstack (Marek Marczykowski-Górecki)
- domain: avoid potential memory leak in virDomainGraphicsListenSet*() (Laine Stump)
- domain: backfill listen address to parent <graphics> listen attribute (Laine Stump)
- virsh: fix IP address in domdisplay for listen type='network' (Luyao Huang)
- bhyvexml2argvmock: change int to size_t for tapfdSize (Pavel Hrdina)
- qemu: fix crash when migrateuri has no scheme (Luyao Huang)
- conf: Fix libvirtd crash and memory leak caused by virDomainVcpuPinDel() (Zhang Bo)
- conf: forbid seclabel duplicates for domain devices (Erik Skultety)
- Fix qemu job handling in SetSchedulerParameters (Ján Tomko)
- conf: disallow invalid values for video attributes (Martin Kletzander)
- Clear dynamic seclabels on LXCProcessStart failure (Cédric Bosdonnat)
- network: don't allow multiple portgroups with the same name in a network (Laine Stump)
- Error out when custom tap device path makes no sense (Ján Tomko)
- Only parse custom vhost path for virtio interfaces (Ján Tomko)
- Trivially support DomainHasManagedSaveImage (Ján Tomko)
- libxl: update dom->id in libxlDomainCreateWithFlags (Marek Marczykowski-Górecki)
- qemu: Properly report error on uuid mismatch in the migration cookie (Luyao Huang)
- lxc: fix double close handshakefds[1] (Luyao Huang)
- util: storage: Fix parsing of nbd:// URI without path (Peter Krempa)
- conf: Properly report error of unsupported input bus type (Luyao Huang)
- conf: Properly report error when an unsupported chr device name is passed (Luyao Huang)
- virnetdev: fix some issues found by coverity and mingw builds (Pavel Hrdina)
- storage: Need to clear pool prior to refreshPool during Autostart (John Ferlan)
- qemu: command: Don't combine old and modern NUMA node creation (Peter Krempa)
- xend: Don't crash in virDomainXMLDevID (Michal Privoznik)
- conf: Don't mangle vcpu placement randomly (Michal Privoznik)
- qemu: Don't unconditionally delete file in qemuOpenFileAs (John Ferlan)
- virfile: Need to check for ENOTCONN from recvfd failure (John Ferlan)
- Remove flag checking in MacVLanCreate helper stub (Ján Tomko)
- storage: Check the partition name against provided name (John Ferlan)
- storage: Fix check for partition type for disk backing volumes (John Ferlan)
- qemu: fix cannot set graphic passwd via qemuDomainSaveImageDefineXML (Luyao Huang)
- hotplug: only add a chardev to vmdef after monitor call (Ján Tomko)
- systemd: don't report an error if the guest is already terminated (Daniel P. Berrange)
Improvements:
- conf: error out on missing dhcp host attributes (Ján Tomko)
- schema: Allow interleaving the /domain/os/type element (Peter Krempa)
- schema: Add virtio-mmio address type into RNG (Martin Kletzander)
- cpu: Format <cpu/> properly (Michal Privoznik)
- virCPUDefFormatBufFull: Use our general error handling pattern (Michal Privoznik)
- util: Introduce virBufferAddBuffer (Michal Privoznik)
- Rework s390 architecture checking (Stefan Zimmermann)
- Prevent default creation of usb controller on s390 and s390x (Stefan Zimmermann)
- po: Add config file for zanata (Daniel P. Berrange)
- libvirt-guests: Allow time sync on guests resume (Michal Privoznik)
- qemu: Fix AAVMF/OVMF #define names (Cole Robinson)
- libxl: support backend domain setting for disk and net devices (Marek Marczykowski)
- conf: support backend domain name in disk and network devices (Marek Marczykowski)
- network: allow <pf> together with <interface>/<address> in network status (Laine Stump)
- qemu: caps: Add capability bit for the "pc-dimm" device (Peter Krempa)
- conf: Hoist validation of memory size into the post parse callback (Peter Krempa)
- conf: numa: Check ABI stability of NUMA configuration (Peter Krempa)
- conf: ABI: Hugepage backing definition is not guest ABI (Peter Krempa)
- conf: Move all NUMA configuration to virDomainNuma (Peter Krempa)
- conf: numa: Add setter/getter for NUMA node memory size (Peter Krempa)
- conf: numa: Add accessor to NUMA node's memory access mode (Peter Krempa)
- conf: numa: Add accessor for the NUMA node cpu mask (Peter Krempa)
- conf: numa: Add helper to get guest NUMA node count and refactor users (Peter Krempa)
- qemu: command: Unify retrieval of NUMA cell count in qemuBuildNumaArgStr (Peter Krempa)
- conf: numa: Don't pass double pointer to virDomainNumatuneParseXML (Peter Krempa)
- numa: conf: Tweak parameters of virDomainNumatuneSet (Peter Krempa)
- conf: numa: Always allocate the NUMA config (Peter Krempa)
- conf: Allocate domain definition with the new helper (Peter Krempa)
- conf: Separate helper for creating domain objects (Peter Krempa)
- conf: numa: Format <numatune> XML only if necessary (Peter Krempa)
- conf: numa: Refactor logic in virDomainNumatuneParseXML (Peter Krempa)
- conf: numa: Reformat virDomainNumatuneParseXML (Peter Krempa)
- conf: numa: Improve error message in case a numa node doesn't have cpus (Peter Krempa)
- conf: numa: Recalculate rather than remember total NUMA cpu count (Peter Krempa)
- conf: Move enum virMemAccess to the NUMA code and rename it (Peter Krempa)
- conf: numa: Rename virDomainNumatune to virDomainNuma (Peter Krempa)
- conf: Move NUMA cell formatter to numa_conf (Peter Krempa)
- conf: numa: Don't duplicate NUMA cell cpumask (Peter Krempa)
- conf: Refactor virDomainNumaDefCPUParseXML (Peter Krempa)
- conf: Move NUMA cell parsing code from cpu conf to numa conf (Peter Krempa)
- conf: Move numatune_conf to numa_conf (Peter Krempa)
- virsh: fix vcpupin info (Pavel Hrdina)
- virQEMUCapsCacheLookupCopy: Filter qemuCaps based on machineType (Michal Privoznik)
- virQEMUCapsCacheLookupCopy: Pass machine type (Michal Privoznik)
- virsh-edit: Make force editing usable (Martin Kletzander)
- parallels: Set the first HDD from XML as bootable (Mikhail Feoktistov)
- parallels: Use IS_CT() macro instead of STREQ("exe") (Mikhail Feoktistov)
- parallels: code aligment (Mikhail Feoktistov)
- Search for schemas and cpu_map.xml in source tree (Jiri Denemark)
- qemuProcessHandleBlockJob: Take status into account (Michal Privoznik)
- qemuProcessHandleBlockJob: Set disk->mirrorState more often (Michal Privoznik)
- PowerPC : Make 'qemu-system-ppc64' the default emulator on ppc64[le]. (Prerna Saxena)
- qemuBuildMemoryBackendStr: Report backend requirement more appropriately (Michal Privoznik)
- qemuxml2argvtest: Fake response from numad (Michal Privoznik)
- numatune_conf: Expose virDomainNumatuneNodeSpecified (Michal Privoznik)
- lxc: Modify/add some debug messages (John Ferlan)
- Wire up mrg_rxbuf option for qemu (Ján Tomko)
- Add mrg_rxbuf option to virtio interfaces (Ján Tomko)
- virsh attach-interface: Allow macvtap hotplug (Michal Privoznik)
- virsh attach-interface: Use virDomainNetType{From,To}String() (Michal Privoznik)
- virsh attach-interface: Use enum instead of arbitrary integers (Michal Privoznik)
- libvirt_private.syms: Expose virDomainNetTypeFromString (Michal Privoznik)
- qemu: Add support for setting vCPU and I/O thread scheduler setting (Martin Kletzander)
- docs, schema, conf: Add support for setting scheduler parameters of guest threads (Martin Kletzander)
- util: Add virProcessSetScheduler() function for scheduler settings (Martin Kletzander)
- domain: include portgroup in interface status xml (Laine Stump)
- qemu: qemuOpenFileAs - set flag VIR_FILE_OPEN_FORCE_MODE (John Ferlan)
- virfile: Adjust error path for virFileOpenForked (John Ferlan)
- schema: allow multiple seclabel for devices in domaincommon.rng (Erik Skultety)
- qemu: Implement random number generator hotunplug (Luyao Huang)
- qemu: Implement random number generator hotplug (Luyao Huang)
- qemu: Implement random number generator cold (un)plug (Peter Krempa)
- conf: Add helpers to insert/remove/find RNG devices in domain def (Luyao Huang)
- audit: export virDomainAuditRNG (Luyao Huang)
- qemu: command: Refactor creation of RNG device commandline (Peter Krempa)
- qemu: command: Break some very long lines in qemuBuildRNGDevStr() (Peter Krempa)
- qemu: command: Shuffle around formatting of alias for RNG device backend (Peter Krempa)
- qemu: command: Make RNG backend device IDs unique (Luyao Huang)
- qemu: refactor qemuBuildRNGDeviceArgs to allow reuse in RNG hotplug (Luyao Huang)
- qemu: Add helper to assign RNG device aliases (Luyao Huang)
- conf: Introduce helper to find duplicate device address (Peter Krempa)
- S390: ccw support for virsh attach-disk address parameter (Stefan Zimmermann)
- maint: improve usage of autogen's --no-git (Stefan Zimmermann)
- qemu: include libvirt & QEMU versions in QEMU log files (Daniel P. Berrange)
- nodedev: check/add for scsi_host caps for NumOfCaps and ListCaps (John Ferlan)
- nodedev: check/add for scsi_host caps for ListDevices (Shivaprasad G Bhat)
- cpu: add Freescale ppc64 CPU models (Olivia Yin)
- tests: virstoragetest: Switch backing chain test to use automatic numbering (Peter Krempa)
- virsh-volume: add support for --reflink (Chen Hanxiao)
- util: make virNetDev(Get|Set)IFFlags() static (Laine Stump)
- qemu: command: Refactor NUMA backend object formatting to use JSON objs (Peter Krempa)
- qemu: command: Switch to bytes when formatting size for memory backends (Peter Krempa)
- qemu: command: Unify values for boolean values when formating memory backends (Peter Krempa)
- qemu: command: Shuffle around formating of alias for memory backend objs (Peter Krempa)
- qemu: Extract code to setup memory backing objects (Peter Krempa)
- qemu: command: Add helper to format -object strings from JSON representation (Peter Krempa)
- util: json: add helper to iterate JSON object key=value pairs (Peter Krempa)
- util: json: Add functions to convert JSON arrays from/to virBitmaps (Peter Krempa)
- util: bitmap: Add option to allocate bitmap without reporting error (Peter Krempa)
- util: json: make value object creator universal by supporting adding (Peter Krempa)
- test: utils: Add helpers for automatic numbering of test cases (Peter Krempa)
- conf: numatune: Extract code for requesting memory nodeset from formatting (Peter Krempa)
- qemu: change macvtap device options in response to NIC_RX_FILTER_CHANGED (Tony Krowiak)
- util: Functions for getting/setting device options (Tony Krowiak)
- qemu: Adjust EndAsyncJob for qemuDomainSaveInternal error path (John Ferlan)
- schemas: Allow all generic elements and attributes for all interfaces (Michal Privoznik)
- qemu: Add AAVMF to the list of known UEFIs (Michal Privoznik)
- qemu: Allow UEFI paths to be specified at compile time (Michal Privoznik)
- Fix syntax-check (Ján Tomko)
- util: bitmap: Tolerate NULL bitmaps in virBitmapEqual (Peter Krempa)
- storage: When delete extended partition, need to refresh pool (John Ferlan)
- storage: Adjust how to refresh extended partition disk data (John Ferlan)
- storage: Attempt error recovery in virStorageBackendDiskCreateVol (John Ferlan)
- storage: Move virStorageBackendDiskDeleteVol (John Ferlan)
- libvirt.spec: remove vbox storage and network .so files (Pavel Hrdina)
- Split qemuDomainChrInsert into two parts (Ján Tomko)
- lxc: report veth device indexes to systemd (Daniel P. Berrange)
- lxc: more logging during startup paths (Daniel P. Berrange)
- lxc: delay setup of cgroup until we have the init pid (Daniel P. Berrange)
- lxc: only write XML once for lxc controller (Daniel P. Berrange)
- lxc: re-arrange startup synchronization sequence with controller (Daniel P. Berrange)
- lxc: don't build pidfile string multiple times (Daniel P. Berrange)
- qemu: report TAP device indexes to systemd (Daniel P. Berrange)
- Fix shadowed variable warning (Ján Tomko)
- storage: add a flag to clone files on btrfs (Chen Hanxiao)
- storage: introduce btrfsCloneFile() for COW copy (Chen Hanxiao)
- Removing probing of secondary drivers (Daniel P. Berrange)
- don't disable state driver when libvirtd is not built (Daniel P. Berrange)
- Remove all secondary driver private data fields (Daniel P. Berrange)
- Remove use of interfacePrivateData from udev driver (Daniel P. Berrange)
- Remove use of nodeDevicePrivateData from nodeDev driver (Daniel P. Berrange)
- Remove use of storagePrivateData/networkPrivateData from vbox (Daniel P. Berrange)
- Remove use of nwfilterPrivateData from nwfilter driver (Daniel P. Berrange)
- Remove use of secretPrivateData from secret driver (Daniel P. Berrange)
- qemu: Fix job handling in qemuDomainSetMetadata (Peter Krempa)
- qemu: Fix job type in qemuDomainGetBlockIoTune (Peter Krempa)
- qemu: Fix job handling in qemuDomainSetSchedulerParametersFlags (Peter Krempa)
- qemu: Fix job handling in qemuDomainSetMemoryParameters (Peter Krempa)
- qemu: Fix job handling in qemuDomainSetAutostart (Peter Krempa)
- qemu: Fix job handling in qemuDomainPinEmulator (Peter Krempa)
- qemu: Fix job handling in qemuDomainPinVcpuFlags (Peter Krempa)
So thanks everyone for the help with this release, be it with reports,
patches, reviews or documentation !
Daniel
--
Daniel Veillard | Open Source and Standards, Red Hat
veillard(a)redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
http://veillard.com/ | virtualization library http://libvirt.org/
9 years, 9 months