hostap_driver_data vs. driver_ops. A bug?
Jouni Malinen
jkmaline
Sat Mar 26 18:00:12 PST 2005
On Sat, Mar 26, 2005 at 03:53:58PM -0800, wayne liu wrote:
> hostap_driver_deinit() takes a parameter, void* priv, and casts it as
> hostap_driver_data. But the caller of this routine, hostapd_driver_deinit(),
> is passing in a param of type struct driver_ops when doing
> hapd->driver->deinit(hapd->driver);
The driver interface code (driver.c) uses struct hostap_driver_data as a
data structure that starts with struct driver_ops, but has private
variables in the end. Generic hostapd code does not know about these and
only has a pointer to struct driver_ops. Anyway, these are pointing to
the same address.
> As a related issue, in hostap_init(), the locally malloc'ed
> hostap_driver_data *drv does not seem to be held by anybody or free()'ed
> at the end and hence is lost when call is returned.
This pointer is stored in hapd->driver; this is due to drv and &drv->ops
pointing to the same address.
> So the question is should hapd->driver be pointing to hostap_driver_data
> instead of driver_ops ?
No, core hostapd code should not know anything about private driver
interface structures (e.g., struct hostap_driver_data).
> Given that the 1st variable of struct
> hostap_driver_data
> is driver_ops (by design?), access to any APIs in the driver_ops won't be
> messed up by the mismatch of the param. But what about other data fields?
Yes, this is by design; and no, this does not mess up other fields.
--
Jouni Malinen PGP id EFC895FA
More information about the Hostap
mailing list