Commit f16a0db323e1a8c0044696815cceeb98706f2243

Authored by aliguori
1 parent a2ffb812

Keep usb host scanning from leaking file descriptors

If the first case does not succeed, then the usb scanning code will leak file
descriptors on every scan.



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5509 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 5 deletions
usb-linux.c
@@ -1276,27 +1276,31 @@ static int usb_host_scan(void *opaque, USBScanFunc *func) @@ -1276,27 +1276,31 @@ static int usb_host_scan(void *opaque, USBScanFunc *func)
1276 usb_fs_type = USB_FS_PROC; 1276 usb_fs_type = USB_FS_PROC;
1277 fclose(f); 1277 fclose(f);
1278 dprintf(opened, USBPROCBUS_PATH, devices); 1278 dprintf(opened, USBPROCBUS_PATH, devices);
  1279 + goto found_devices;
1279 } 1280 }
1280 /* try additional methods if an access method hasn't been found yet */ 1281 /* try additional methods if an access method hasn't been found yet */
1281 f = fopen(USBDEVBUS_PATH "/devices", "r"); 1282 f = fopen(USBDEVBUS_PATH "/devices", "r");
1282 - if (!usb_fs_type && f) { 1283 + if (f) {
1283 /* devices found in /dev/bus/usb/ */ 1284 /* devices found in /dev/bus/usb/ */
1284 strcpy(devpath, USBDEVBUS_PATH); 1285 strcpy(devpath, USBDEVBUS_PATH);
1285 usb_fs_type = USB_FS_DEV; 1286 usb_fs_type = USB_FS_DEV;
1286 fclose(f); 1287 fclose(f);
1287 dprintf(opened, USBDEVBUS_PATH, devices); 1288 dprintf(opened, USBDEVBUS_PATH, devices);
  1289 + goto found_devices;
1288 } 1290 }
1289 dir = opendir(USBSYSBUS_PATH "/devices"); 1291 dir = opendir(USBSYSBUS_PATH "/devices");
1290 - if (!usb_fs_type && dir) { 1292 + if (dir) {
1291 /* devices found in /dev/bus/usb/ (yes - not a mistake!) */ 1293 /* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1292 strcpy(devpath, USBDEVBUS_PATH); 1294 strcpy(devpath, USBDEVBUS_PATH);
1293 usb_fs_type = USB_FS_SYS; 1295 usb_fs_type = USB_FS_SYS;
1294 closedir(dir); 1296 closedir(dir);
1295 dprintf(opened, USBSYSBUS_PATH, devices); 1297 dprintf(opened, USBSYSBUS_PATH, devices);
  1298 + goto found_devices;
1296 } 1299 }
  1300 + found_devices:
1297 if (!usb_fs_type) { 1301 if (!usb_fs_type) {
1298 term_printf("husb: unable to access USB devices\n"); 1302 term_printf("husb: unable to access USB devices\n");
1299 - goto the_end; 1303 + return -ENOENT;
1300 } 1304 }
1301 1305
1302 /* the module setting (used later for opening devices) */ 1306 /* the module setting (used later for opening devices) */
@@ -1307,7 +1311,7 @@ static int usb_host_scan(void *opaque, USBScanFunc *func) @@ -1307,7 +1311,7 @@ static int usb_host_scan(void *opaque, USBScanFunc *func)
1307 } else { 1311 } else {
1308 /* out of memory? */ 1312 /* out of memory? */
1309 perror("husb: unable to allocate memory for device path"); 1313 perror("husb: unable to allocate memory for device path");
1310 - goto the_end; 1314 + return -ENOMEM;
1311 } 1315 }
1312 } 1316 }
1313 1317
@@ -1319,8 +1323,10 @@ static int usb_host_scan(void *opaque, USBScanFunc *func) @@ -1319,8 +1323,10 @@ static int usb_host_scan(void *opaque, USBScanFunc *func)
1319 case USB_FS_SYS: 1323 case USB_FS_SYS:
1320 ret = usb_host_scan_sys(opaque, func); 1324 ret = usb_host_scan_sys(opaque, func);
1321 break; 1325 break;
  1326 + default:
  1327 + ret = -EINVAL;
  1328 + break;
1322 } 1329 }
1323 - the_end:  
1324 return ret; 1330 return ret;
1325 } 1331 }
1326 1332