6ae0fea2deee7e4e06f609fc2254cc5b710c0615
galt
  Wed Sep 20 16:34:08 2017 -0700
Handles the case in udc where sparseData is size zero (due to some previous race condition) and should not be. Fixes #20133

diff --git src/lib/udc.c src/lib/udc.c
index c9f4304..34fcaef 100644
--- src/lib/udc.c
+++ src/lib/udc.c
@@ -831,33 +831,34 @@
  * cacheDir/sparseData and cacheDir/bitmap files. */
 {
 bits32 version = 0;
 
 /* Get existing bitmap, and if it's stale clean up. */
 struct udcBitmap *bits = udcBitmapOpen(file->bitmapFileName);
 if (bits != NULL)
     {
     if (useCacheInfo)
 	{
 	file->size = bits->fileSize;
 	file->updateTime = bits->remoteUpdate;
 	}
     version = bits->version;
     if (bits->remoteUpdate != file->updateTime || bits->fileSize != file->size ||
-	!fileExists(file->sparseFileName))
+	!fileExists(file->sparseFileName) ||
+	(fileSize(file->sparseFileName) == 0 && file->size > 0 && fileSize(file->bitmapFileName) > udcBitmapHeaderSize))
 	{
-	verbose(4, "removing stale version (%lld! = %lld or %lld! = %lld or %s doesn't exist), "
+	verbose(4, "removing stale version (%lld! = %lld or %lld! = %lld or %s doesn't exist or should not be size 0), "
 		"new version %d\n",
 		bits->remoteUpdate, (long long)file->updateTime, bits->fileSize, file->size,
 		file->sparseFileName, version);
         udcBitmapClose(&bits);
 	remove(file->bitmapFileName);
 	remove(file->sparseFileName);
 	if (fileExists(file->redirFileName))
 	    remove(file->redirFileName);
 	++version;
 	}
     }
 else
     verbose(4, "bitmap file %s does not already exist, creating.\n", file->bitmapFileName);
 
 /* If no bitmap, then create one, and also an empty sparse data file. */