hastd segfaults reading metadata from not initialized provider
Pawel Jakub Dawidek
pjd at FreeBSD.org
Wed Apr 28 22:43:36 UTC 2010
On Mon, Apr 26, 2010 at 11:07:31PM +0300, Mikolaj Golub wrote:
> Hi,
>
> When configuring a new provider if one forgets to do
>
> hastctl create tank
>
> before
>
> 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:
>
> (gdb) bt
> #0 strcmp () at /usr/src/lib/libc/i386/string/strcmp.S:61
> #1 0x0804fa18 in metadata_read (res=0x284cb600, openrw=true) at /usr/src/sbin/hastd/metadata.c:120
> #2 0x080570ac in init_local (res=0x284cb600) at /usr/src/sbin/hastd/primary.c:425
> #3 0x08057f88 in hastd_primary (res=0x284cb600) 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=0, argv=0xbfbfed84) at /usr/src/sbin/hastd/hastd.c:520
> Current language: auto; currently asm
> (gdb) fr 1
> #1 0x0804fa18 in metadata_read (res=0x284cb600, openrw=true) at /usr/src/sbin/hastd/metadata.c:120
> 120 if (strcmp(str, res->hr_name) != 0) {
> Current language: auto; currently c
> (gdb) list
> 115 ebuf_free(eb);
> 116 goto fail;
> 117 }
> 118
> 119 str = nv_get_string(nv, "resource");
> 120 if (strcmp(str, res->hr_name) != 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 = 0x0
>
> 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:
>
> 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=6196, status=66).
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 != NULL) check was
missing. Thanks for the report, I committed fix to HEAD.
--
Pawel Jakub Dawidek http://www.wheelsystems.com
pjd at FreeBSD.org http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!
-------------- 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/freebsd-fs/attachments/20100428/33826574/attachment.pgp
More information about the freebsd-fs
mailing list