diff --git a/include/dicformat/context.h b/include/dicformat/context.h index 4571095..5acd918 100644 --- a/include/dicformat/context.h +++ b/include/dicformat/context.h @@ -46,18 +46,20 @@ typedef struct dicformatContext struct dataLinkedList *mediaTagsHead; struct dataLinkedList *mediaTagsTail; unsigned char *sectorPrefix; - unsigned char *sectorPrefixCorrected; - unsigned char *sectorSuffix; - unsigned char *sectorSuffixCorrected; - unsigned char *sectorSubchannel; - unsigned char *mode2Subheaders; - unsigned char shift; - bool inMemoryDdt; - uint64_t *userDataDdt; - size_t mappedMemoryDdtSize; - uint32_t *sectorPrefixDdt; - uint32_t *sectorSuffixDdt; - GeometryBlockHeader geometryBlock; + unsigned char *sectorPrefixCorrected; + unsigned char *sectorSuffix; + unsigned char *sectorSuffixCorrected; + unsigned char *sectorSubchannel; + unsigned char *mode2Subheaders; + unsigned char shift; + bool inMemoryDdt; + uint64_t *userDataDdt; + size_t mappedMemoryDdtSize; + uint32_t *sectorPrefixDdt; + uint32_t *sectorSuffixDdt; + GeometryBlockHeader geometryBlock; + MetadataBlockHeader metadataBlockHeader; + unsigned char *metadataBlock; } dicformatContext; typedef struct dataLinkedList diff --git a/src/close.c b/src/close.c index a027d2e..58bbf11 100644 --- a/src/close.c +++ b/src/close.c @@ -91,6 +91,8 @@ int close(void *context) free(ctx->sectorPrefixDdt); free(ctx->sectorSuffixDdt); + free(ctx->metadataBlock); + free(context); return 0; diff --git a/src/open.c b/src/open.c index 58af65a..41ef9b4 100644 --- a/src/open.c +++ b/src/open.c @@ -463,6 +463,7 @@ void *open(const char *filepath) if(readBytes != sizeof(GeometryBlockHeader)) { + memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); fprintf(stderr, "Could not read geometry block, continuing..."); break; } @@ -485,8 +486,48 @@ void *open(const char *filepath) memset(&ctx->geometryBlock, 0, sizeof(GeometryBlockHeader)); break; - case MetadataBlock: - // TODO + // Metadata block + case MetadataBlock:readBytes = + fread(&ctx->metadataBlockHeader, + sizeof(MetadataBlockHeader), + 1, + ctx->imageStream); + + if(readBytes != sizeof(MetadataBlockHeader)) + { + memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); + fprintf(stderr, "Could not read metadata block header, continuing..."); + break; + } + + if(ctx->metadataBlockHeader.identifier != idxEntries[i].blockType) + { + memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); + fprintf(stderr, + + "libdicformat: Incorrect identifier for data block at position %"PRIu64"", + idxEntries[i].offset); + break; + } + + ctx->metadataBlock = malloc(ctx->metadataBlockHeader.blockSize); + + if(ctx->metadataBlock == NULL) + { + memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); + fprintf(stderr, "libdicformat: Could not allocate memory for metadata block, continuing..."); + break; + } + + readBytes = fread(ctx->metadataBlock, ctx->metadataBlockHeader.blockSize, 1, ctx->imageStream); + + if(readBytes != ctx->metadataBlockHeader.blockSize) + { + memset(&ctx->metadataBlockHeader, 0, sizeof(MetadataBlockHeader)); + free(ctx->metadataBlock); + fprintf(stderr, "Could not read metadata block, continuing..."); + } + break; case TracksBlock: // TODO