Fix buffer size handling in metadata chunks.

This commit is contained in:
Moinak Ghosh 2014-11-29 13:18:01 +05:30
parent 753360e479
commit 4c62e4db60

View file

@ -35,7 +35,7 @@
#include <limits.h> #include <limits.h>
#include <unistd.h> #include <unistd.h>
#include "pcompress.h" #include "pcompress.h"
#include "delta2/delta2.h" #include "filters/delta2/delta2.h"
#include "utils/utils.h" #include "utils/utils.h"
#include "lzma/lzma_crc.h" #include "lzma/lzma_crc.h"
#include "allocator.h" #include "allocator.h"
@ -104,6 +104,7 @@ compress_and_write(meta_ctx_t *mctx)
*/ */
tobuf = mctx->tobuf; tobuf = mctx->tobuf;
U64_P(tobuf) = htonll(METADATA_INDICATOR); U64_P(tobuf) = htonll(METADATA_INDICATOR);
U64_P(tobuf + 16) = LE64(mctx->frompos); // Record original length
comp_chunk = tobuf + METADATA_HDR_SZ; comp_chunk = tobuf + METADATA_HDR_SZ;
dstlen = mctx->frompos; dstlen = mctx->frompos;
@ -148,7 +149,6 @@ compress_and_write(meta_ctx_t *mctx)
* for the header. * for the header.
*/ */
U64_P(tobuf + 8) = LE64(dstlen); U64_P(tobuf + 8) = LE64(dstlen);
U64_P(tobuf + 16) = LE64(mctx->frompos);
*(tobuf + 24) = type; *(tobuf + 24) = type;
if (!pctx->encrypt_type) if (!pctx->encrypt_type)
@ -354,13 +354,14 @@ decompress_data(meta_ctx_t *mctx)
} }
if (type & PREPROC_TYPE_DELTA2) { if (type & PREPROC_TYPE_DELTA2) {
dstlen = origlen; uint64_t _dstlen = origlen;
rv = delta2_decode(ubuf, len_cmp, cseg, &dstlen); rv = delta2_decode(ubuf, dstlen, cseg, &_dstlen);
if (rv == -1) { if (rv == -1) {
log_msg(LOG_ERR, 0, "Metadata chunk %d, Delta2 decoding failed.", mctx->id); log_msg(LOG_ERR, 0, "Metadata chunk %d, Delta2 decoding failed.", mctx->id);
return (0); return (0);
} }
memcpy(ubuf, cseg, dstlen); memcpy(ubuf, cseg, _dstlen);
dstlen = _dstlen;
} }
/* /*