Commit f16a0db323e1a8c0044696815cceeb98706f2243
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 |