On Mon, Dec 2, 2013 at 12:03 PM, Daniel Veillard <veillard@xxxxxxxxxx> wrote: > This patch also looks fine, but is more complex, I would rather > postpone it after the 1.2.0 release, Okay, not a problem :) I will check the patch again and resend it later. Thanks, ozaki-r > > Daniel > > On Sun, Dec 01, 2013 at 11:46:07PM +0900, Ryota Ozaki wrote: >> In the original code, errors of Get{Vendor,Product}Id, >> VBOX_UTF16_TO_UTF8, strtol were ignored. >> >> In order to handle the errors, the patch introduces >> vboxGetVendorProductIds utility function because adding error >> codes in the loop is difficult. >> >> Reported-by: Laine Stump <laine@xxxxxxxxx> >> Signed-off-by: Ryota Ozaki <ozaki.ryota@xxxxxxxxx> >> --- >> src/vbox/vbox_tmpl.c | 74 ++++++++++++++++++++++++++++++++++++---------------- >> 1 file changed, 51 insertions(+), 23 deletions(-) >> >> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c >> index 9336514..27c21bd 100644 >> --- a/src/vbox/vbox_tmpl.c >> +++ b/src/vbox/vbox_tmpl.c >> @@ -2208,6 +2208,51 @@ vboxDomainGetMaxVcpus(virDomainPtr dom) >> VIR_DOMAIN_VCPU_MAXIMUM)); >> } >> >> +static int vboxGetVendorProductIds(vboxGlobalData *data, >> + IUSBDeviceFilter *deviceFilter, >> + unsigned *vendorId, >> + unsigned *productId) >> +{ >> + PRUnichar *idUtf16 = NULL; >> + char *idUtf8 = NULL; >> + char *endptr = NULL; >> + unsigned vId = 0; >> + unsigned pId = 0; >> + int result = -1; >> + >> + if (deviceFilter->vtbl->GetVendorId(deviceFilter, &idUtf16) != 0) >> + goto out; >> + >> + if (VBOX_UTF16_TO_UTF8(idUtf16, &idUtf8) < 0) >> + goto release_utf16; >> + >> + if (virStrToLong_ui(idUtf8, &endptr, 16, &vId) < 0) >> + goto release_utf8; >> + >> + VBOX_UTF8_FREE(idUtf8); >> + VBOX_UTF16_FREE(idUtf16); >> + >> + if (deviceFilter->vtbl->GetProductId(deviceFilter, &idUtf16) != 0) >> + goto out; >> + >> + if (VBOX_UTF16_TO_UTF8(idUtf16, &idUtf8) < 0) >> + goto release_utf16; >> + >> + if (virStrToLong_ui(idUtf8, &endptr, 16, &pId) < 0) >> + goto release_utf8; >> + >> + *vendorId = vId; >> + *productId = pId; >> + result = 0; >> + >> +release_utf8: >> + VBOX_UTF8_FREE(idUtf8); >> +release_utf16: >> + VBOX_UTF16_FREE(idUtf16); >> +out: >> + return result; >> +} >> + >> static void vboxHostDeviceGetXMLDesc(vboxGlobalData *data, virDomainDefPtr def, IMachine *machine) >> { >> #if VBOX_API_VERSION < 4003 >> @@ -2278,13 +2323,7 @@ static void vboxHostDeviceGetXMLDesc(vboxGlobalData *data, virDomainDefPtr def, >> for (i = 0; i < deviceFilters.count; i++) { >> PRBool active = PR_FALSE; >> IUSBDeviceFilter *deviceFilter = deviceFilters.items[i]; >> - PRUnichar *vendorIdUtf16 = NULL; >> - char *vendorIdUtf8 = NULL; >> - unsigned vendorId = 0; >> - PRUnichar *productIdUtf16 = NULL; >> - char *productIdUtf8 = NULL; >> - unsigned productId = 0; >> - char *endptr = NULL; >> + int res = 0; >> >> deviceFilter->vtbl->GetActive(deviceFilter, &active); >> if (!active) >> @@ -2295,23 +2334,12 @@ static void vboxHostDeviceGetXMLDesc(vboxGlobalData *data, virDomainDefPtr def, >> def->hostdevs[USBFilterCount]->source.subsys.type = >> VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB; >> >> - deviceFilter->vtbl->GetVendorId(deviceFilter, &vendorIdUtf16); >> - deviceFilter->vtbl->GetProductId(deviceFilter, &productIdUtf16); >> + res = vboxGetVendorProductIds(data, deviceFilter, >> + &def->hostdevs[USBFilterCount]->source.subsys.u.usb.vendor, >> + &def->hostdevs[USBFilterCount]->source.subsys.u.usb.product); >> >> - VBOX_UTF16_TO_UTF8(vendorIdUtf16, &vendorIdUtf8); >> - VBOX_UTF16_TO_UTF8(productIdUtf16, &productIdUtf8); >> - >> - vendorId = strtol(vendorIdUtf8, &endptr, 16); >> - productId = strtol(productIdUtf8, &endptr, 16); >> - >> - def->hostdevs[USBFilterCount]->source.subsys.u.usb.vendor = vendorId; >> - def->hostdevs[USBFilterCount]->source.subsys.u.usb.product = productId; >> - >> - VBOX_UTF16_FREE(vendorIdUtf16); >> - VBOX_UTF8_FREE(vendorIdUtf8); >> - >> - VBOX_UTF16_FREE(productIdUtf16); >> - VBOX_UTF8_FREE(productIdUtf8); >> + if (res < 0) >> + goto release_hostdevs; >> >> USBFilterCount++; >> } >> -- >> 1.8.4 >> >> -- >> libvir-list mailing list >> libvir-list@xxxxxxxxxx >> https://www.redhat.com/mailman/listinfo/libvir-list > > -- > Daniel Veillard | Open Source and Standards, Red Hat > veillard@xxxxxxxxxx | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ > http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list