diff --git a/toolkit/mozapps/update/updater/bspatch.cpp b/toolkit/mozapps/update/updater/bspatch.cpp index e4b5706ef2de..87256969c921 100644 --- a/toolkit/mozapps/update/updater/bspatch.cpp +++ b/toolkit/mozapps/update/updater/bspatch.cpp @@ -71,16 +71,33 @@ MBS_ReadHeader(FILE* file, MBSPatchHeader *header) struct stat hs; s = fstat(fileno(file), &hs); - if (s) + if (s != 0) return READ_ERROR; if (memcmp(header->tag, "MBDIFF10", 8) != 0) return UNEXPECTED_BSPATCH_ERROR; - if (sizeof(MBSPatchHeader) + - header->cblen + - header->difflen + - header->extralen != uint32_t(hs.st_size)) + if (hs.st_size > INT_MAX) + return UNEXPECTED_BSPATCH_ERROR; + + size_t size = static_cast(hs.st_size); + if (size < sizeof(MBSPatchHeader)) + return UNEXPECTED_BSPATCH_ERROR; + size -= sizeof(MBSPatchHeader); + + if (size < header->cblen) + return UNEXPECTED_BSPATCH_ERROR; + size -= header->cblen; + + if (size < header->difflen) + return UNEXPECTED_BSPATCH_ERROR; + size -= header->difflen; + + if (size < header->extralen) + return UNEXPECTED_BSPATCH_ERROR; + size -= header->extralen; + + if (size != 0) return UNEXPECTED_BSPATCH_ERROR; return OK; @@ -90,6 +107,7 @@ int MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, unsigned char *fbuffer, FILE* file) { + unsigned char *fbufstart = fbuffer; unsigned char *fbufend = fbuffer + header->slen; unsigned char *buf = (unsigned char*) malloc(header->cblen + @@ -112,10 +130,20 @@ MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, r -= c; wb += c; + + if (c == 0 && r) { + rv = UNEXPECTED_BSPATCH_ERROR; + goto end; + } } { MBSPatchTriple *ctrlsrc = (MBSPatchTriple*) buf; + if (header->cblen % sizeof(MBSPatchTriple) != 0) { + rv = UNEXPECTED_BSPATCH_ERROR; + goto end; + } + unsigned char *diffsrc = buf + header->cblen; unsigned char *extrasrc = diffsrc + header->difflen; @@ -123,7 +151,7 @@ MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, unsigned char *diffend = extrasrc; unsigned char *extraend = extrasrc + header->extralen; - do { + while (ctrlsrc < ctrlend) { ctrlsrc->x = ntohl(ctrlsrc->x); ctrlsrc->y = ntohl(ctrlsrc->y); ctrlsrc->z = ntohl(ctrlsrc->z); @@ -140,8 +168,8 @@ MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, /* Add x bytes from oldfile to x bytes from the diff block */ - if (fbuffer + ctrlsrc->x > fbufend || - diffsrc + ctrlsrc->x > diffend) { + if (ctrlsrc->x > static_cast(fbufend - fbuffer) || + ctrlsrc->x > static_cast(diffend - diffsrc)) { rv = UNEXPECTED_BSPATCH_ERROR; goto end; } @@ -157,7 +185,7 @@ MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, /* Copy y bytes from the extra block */ - if (extrasrc + ctrlsrc->y > extraend) { + if (ctrlsrc->y > static_cast(extraend - extrasrc)) { rv = UNEXPECTED_BSPATCH_ERROR; goto end; } @@ -169,7 +197,8 @@ MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, /* "seek" forwards in oldfile by z bytes */ - if (fbuffer + ctrlsrc->z > fbufend) { + if (ctrlsrc->z < fbufstart - fbuffer || + ctrlsrc->z > fbufend - fbuffer) { rv = UNEXPECTED_BSPATCH_ERROR; goto end; } @@ -178,7 +207,7 @@ MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, /* and on to the next control block */ ++ctrlsrc; - } while (ctrlsrc < ctrlend); + } } end: