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 1276 usb_fs_type = USB_FS_PROC;
1277 1277 fclose(f);
1278 1278 dprintf(opened, USBPROCBUS_PATH, devices);
  1279 + goto found_devices;
1279 1280 }
1280 1281 /* try additional methods if an access method hasn't been found yet */
1281 1282 f = fopen(USBDEVBUS_PATH "/devices", "r");
1282   - if (!usb_fs_type && f) {
  1283 + if (f) {
1283 1284 /* devices found in /dev/bus/usb/ */
1284 1285 strcpy(devpath, USBDEVBUS_PATH);
1285 1286 usb_fs_type = USB_FS_DEV;
1286 1287 fclose(f);
1287 1288 dprintf(opened, USBDEVBUS_PATH, devices);
  1289 + goto found_devices;
1288 1290 }
1289 1291 dir = opendir(USBSYSBUS_PATH "/devices");
1290   - if (!usb_fs_type && dir) {
  1292 + if (dir) {
1291 1293 /* devices found in /dev/bus/usb/ (yes - not a mistake!) */
1292 1294 strcpy(devpath, USBDEVBUS_PATH);
1293 1295 usb_fs_type = USB_FS_SYS;
1294 1296 closedir(dir);
1295 1297 dprintf(opened, USBSYSBUS_PATH, devices);
  1298 + goto found_devices;
1296 1299 }
  1300 + found_devices:
1297 1301 if (!usb_fs_type) {
1298 1302 term_printf("husb: unable to access USB devices\n");
1299   - goto the_end;
  1303 + return -ENOENT;
1300 1304 }
1301 1305  
1302 1306 /* the module setting (used later for opening devices) */
... ... @@ -1307,7 +1311,7 @@ static int usb_host_scan(void *opaque, USBScanFunc *func)
1307 1311 } else {
1308 1312 /* out of memory? */
1309 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 1323 case USB_FS_SYS:
1320 1324 ret = usb_host_scan_sys(opaque, func);
1321 1325 break;
  1326 + default:
  1327 + ret = -EINVAL;
  1328 + break;
1322 1329 }
1323   - the_end:
1324 1330 return ret;
1325 1331 }
1326 1332  
... ...