Changeset 3fb5a3e in mainline for uspace/drv/usbhub/usbhub.c


Ignore:
Timestamp:
2011-05-28T14:34:43Z (14 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
af6136d
Parents:
400735e
Message:

Do not delete hub info too early

When a hub is disconnected during port change (device adding) the
structure was deleted and accessed *later* from the device adding
routine. Because allocator is next fit, the error went unnoticed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhub/usbhub.c

    r400735e r3fb5a3e  
    7272static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info);
    7373
    74 static void usb_hub_polling_terminted_callback(usb_device_t * device,
     74static void usb_hub_polling_terminated_callback(usb_device_t * device,
    7575    bool was_error, void * data);
    7676
     
    200200        result->control_pipe = &usb_dev->ctrl_pipe;
    201201        result->is_default_address_used = false;
     202
     203        fibril_mutex_initialize(&result->pending_ops_mutex);
     204        fibril_condvar_initialize(&result->pending_ops_cv);
     205        result->pending_ops_count = 0;
    202206        return result;
    203207}
     
    340344        rc = usb_device_auto_poll(hub_info->usb_device, 0,
    341345            hub_port_changes_callback, ((hub_info->port_count + 1) / 8) + 1,
    342             usb_hub_polling_terminted_callback, hub_info);
     346            usb_hub_polling_terminated_callback, hub_info);
    343347        if (rc != EOK) {
    344348                usb_log_error("Failed to create polling fibril: %s.\n",
     
    473477 * @param data pointer to usb_hub_info_t structure
    474478 */
    475 static void usb_hub_polling_terminted_callback(usb_device_t * device,
     479static void usb_hub_polling_terminated_callback(usb_device_t * device,
    476480    bool was_error, void * data){
    477         usb_hub_info_t * hub_info = data;
    478         if(!hub_info) return;
    479         free(hub_info->ports);
    480         free(hub_info);
     481        usb_hub_info_t * hub = data;
     482        assert(hub);
     483
     484        fibril_mutex_lock(&hub->pending_ops_mutex);
     485        while (hub->pending_ops_count > 0) {
     486                fibril_condvar_wait(&hub->pending_ops_cv,
     487                    &hub->pending_ops_mutex);
     488        }
     489        fibril_mutex_unlock(&hub->pending_ops_mutex);
     490
     491        free(hub->ports);
     492        free(hub);
    481493}
    482494
Note: See TracChangeset for help on using the changeset viewer.