flexnbd: Avoid a SIGSEGV when the allocation map fails to build.

In the event of a fiemap ioctl failing (when the file is on a tmpfs,
for instance), we would free() serve->allocation_map, but it would
remain not NULL, leading to segfaults in client.c when responding to
write requests.

Keeping the free() behaviour is more hassle than it's worth, as there
are synchronization problems with setting serve->allocation_map to
NULL, so we just omit the free() instead to avoid the segfault. This
is safe because we never consult the map until allocation_map_built is
set to true, and we never do that when the builder thread fails.
This commit is contained in:
nick
2013-02-08 16:17:16 +00:00
parent 2dd3db95bc
commit 8c04564645
3 changed files with 20 additions and 21 deletions

View File

@@ -773,6 +773,11 @@ void* build_allocation_map_thread(void* serve_uncast)
serve->allocation_map_built = 1;
}
else {
/* We can operate without it, but we can't free it without a race.
* All that happens if we leave it is that it gradually builds up an
* *incomplete* record of writes. Nobody will use it, as
* allocation_map_built == 0 for the lifetime of the process.
*/
warn( "Didn't build allocation map for %s", serve->filename );
}