Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Apr 2010 00:43:26 +0200
From:      Pawel Jakub Dawidek <pjd@FreeBSD.org>
To:        Mikolaj Golub <to.my.trociny@gmail.com>
Cc:        freebsd-fs <freebsd-fs@freebsd.org>
Subject:   Re: hastd segfaults reading metadata from not initialized provider
Message-ID:  <20100428224326.GE1677@garage.freebsd.pl>
In-Reply-To: <86iq7ex9j0.fsf@kopusha.onet>
References:  <86iq7ex9j0.fsf@kopusha.onet>

next in thread | previous in thread | raw e-mail | index | archive | help

--C94crkcyjafcjHxo
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Mon, Apr 26, 2010 at 11:07:31PM +0300, Mikolaj Golub wrote:
> Hi,
>=20
> When configuring a new provider if one forgets to do=20
>=20
> hastctl create tank
>=20
> before=20
>=20
> hastctl role primary tank

In my tests I cannot reproduce it. If metadata is empty hastd should
notice that, but check for NULL was missing anyway.

> the worker core dumps on reading metadata:
>=20
> (gdb) bt
> #0  strcmp () at /usr/src/lib/libc/i386/string/strcmp.S:61
> #1  0x0804fa18 in metadata_read (res=3D0x284cb600, openrw=3Dtrue) at /usr=
/src/sbin/hastd/metadata.c:120
> #2  0x080570ac in init_local (res=3D0x284cb600) at /usr/src/sbin/hastd/pr=
imary.c:425
> #3  0x08057f88 in hastd_primary (res=3D0x284cb600) at /usr/src/sbin/hastd=
/primary.c:754
> #4  0x0804e270 in child_exit () at /usr/src/sbin/hastd/hastd.c:145
> #5  0x0804edd1 in main_loop () at /usr/src/sbin/hastd/hastd.c:389
> #6  0x0804f3d8 in main (argc=3D0, argv=3D0xbfbfed84) at /usr/src/sbin/has=
td/hastd.c:520
> Current language:  auto; currently asm
> (gdb) fr 1
> #1  0x0804fa18 in metadata_read (res=3D0x284cb600, openrw=3Dtrue) at /usr=
/src/sbin/hastd/metadata.c:120
> 120             if (strcmp(str, res->hr_name) !=3D 0) {
> Current language:  auto; currently c
> (gdb) list
> 115                     ebuf_free(eb);
> 116                     goto fail;
> 117             }
> 118
> 119             str =3D nv_get_string(nv, "resource");
> 120             if (strcmp(str, res->hr_name) !=3D 0) {
> 121                     pjdlog_error("Provider %s is not part of resource=
 %s.",
> 122                         res->hr_localpath, res->hr_name);
> 123                     nv_free(nv);
> 124                     goto fail;
> (gdb) p str
> $1 =3D 0x0
>=20
> In the attached patch the check for str is added so we would have a
> termination with the error message instead of a core dump:
>=20
> Apr 26 22:46:06 hasta hastd: [tank] (primary) Metadata read from /dev/ad6=
 is invalid.
> Apr 26 22:46:06 hasta hastd: [tank] (primary) Worker process failed (pid=
=3D6196, status=3D66).

I fixed it a bit different. In general nv API is constructued in a way
that the consumer might execute various calls and check for error at the
end. This is what we do there already, only (str !=3D NULL) check was
missing. Thanks for the report, I committed fix to HEAD.

--=20
Pawel Jakub Dawidek                       http://www.wheelsystems.com
pjd@FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!

--C94crkcyjafcjHxo
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (FreeBSD)

iEYEARECAAYFAkvYug4ACgkQForvXbEpPzQF+QCglCAj4IMHWZR5KPQqIS9itw5m
lSYAoNNSQHuEsekxz7zrQdJtFbMQLWgT
=M1ca
-----END PGP SIGNATURE-----

--C94crkcyjafcjHxo--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100428224326.GE1677>