svn commit: r220062 - head/sys/geom/gate
Kostik Belousov
kostikbel at gmail.com
Sun Mar 27 20:08:09 UTC 2011
On Sun, Mar 27, 2011 at 07:56:55PM +0000, Mikolaj Golub wrote:
> Author: trociny
> Date: Sun Mar 27 19:56:55 2011
> New Revision: 220062
> URL: http://svn.freebsd.org/changeset/base/220062
>
> Log:
> In g_gate_create() there is a window between when g_gate_softc is
> registered in g_gate_units array and when its sc_provider field is
> filled. If during this period g_gate_units is accessed by another
> thread that is checking for provider name collision the crash is
> possible.
>
> Fix this by adding sc_name field to struct g_gate_softc. In
> g_gate_create() when g_gate_softc is created but sc_provider is still
> not sc_name points to provider name stored in the local array.
>
> Approved by: pjd (mentor)
> Reported by: Freddie Cash <fjwcash at gmail.com>
> MFC after: 1 week
>
> Modified:
> head/sys/geom/gate/g_gate.c
> head/sys/geom/gate/g_gate.h
>
> Modified: head/sys/geom/gate/g_gate.c
> ==============================================================================
> --- head/sys/geom/gate/g_gate.c Sun Mar 27 19:29:18 2011 (r220061)
> +++ head/sys/geom/gate/g_gate.c Sun Mar 27 19:56:55 2011 (r220062)
> @@ -409,13 +409,14 @@ g_gate_create(struct g_gate_ctl_create *
> for (unit = 0; unit < g_gate_maxunits; unit++) {
> if (g_gate_units[unit] == NULL)
> continue;
> - if (strcmp(name, g_gate_units[unit]->sc_provider->name) != 0)
> + if (strcmp(name, g_gate_units[unit]->sc_name) != 0)
> continue;
> mtx_unlock(&g_gate_units_lock);
> mtx_destroy(&sc->sc_queue_mtx);
> free(sc, M_GATE);
> return (EEXIST);
> }
> + sc->sc_name = name;
> g_gate_units[sc->sc_unit] = sc;
> g_gate_nunits++;
> mtx_unlock(&g_gate_units_lock);
> @@ -434,6 +435,9 @@ g_gate_create(struct g_gate_ctl_create *
> sc->sc_provider = pp;
> g_error_provider(pp, 0);
> g_topology_unlock();
> + mtx_lock(&g_gate_units_lock);
> + sc->sc_name = sc->sc_provider->name;
> + mtx_unlock(&g_gate_units_lock);
I think you do not need a mutex locked around the single assignment.
As I understand, sc_provider->name is constant ?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/svn-src-head/attachments/20110327/9afaaeaf/attachment.pgp
More information about the svn-src-head
mailing list