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. */