Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2020-09-22 18:33:30 +0300
committerJulian Eisel <julian@blender.org>2020-09-22 18:33:30 +0300
commit2b1345d347f67d4b6aae8b5a4467cee1dbebfac7 (patch)
tree192454e8482de7cad6dc7366ff21839e89652ebf /source/blender/blenloader/intern/writefile.c
parent67da49df4dea1d55e65b72253d5caa356e4d161e (diff)
parentdab50ad7183458aa5ad5b982097da844397be3d9 (diff)
Merge branch 'master' into asset-metadata
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r--source/blender/blenloader/intern/writefile.c72
1 files changed, 43 insertions, 29 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index a57387ed169..4e2ef58d442 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -298,7 +298,7 @@ typedef struct {
/** Use for file and memory writing (fixed size of #MYWRITE_BUFFER_SIZE). */
uchar *buf;
/** Number of bytes used in #WriteData.buf (flushed when exceeded). */
- int buf_used_len;
+ size_t buf_used_len;
#ifdef USE_WRITE_DATA_LEN
/** Total number of bytes written. */
@@ -340,12 +340,17 @@ static WriteData *writedata_new(WriteWrap *ww)
return wd;
}
-static void writedata_do_write(WriteData *wd, const void *mem, int memlen)
+static void writedata_do_write(WriteData *wd, const void *mem, size_t memlen)
{
if ((wd == NULL) || wd->error || (mem == NULL) || memlen < 1) {
return;
}
+ if (memlen > INT_MAX) {
+ BLI_assert(!"Cannot write chunks bigger than INT_MAX.");
+ return;
+ }
+
if (UNLIKELY(wd->error)) {
return;
}
@@ -381,7 +386,7 @@ static void writedata_free(WriteData *wd)
*/
static void mywrite_flush(WriteData *wd)
{
- if (wd->buf_used_len) {
+ if (wd->buf_used_len != 0) {
writedata_do_write(wd, wd->buf, wd->buf_used_len);
wd->buf_used_len = 0;
}
@@ -392,7 +397,7 @@ static void mywrite_flush(WriteData *wd)
* \param adr: Pointer to new chunk of data
* \param len: Length of new chunk of data
*/
-static void mywrite(WriteData *wd, const void *adr, int len)
+static void mywrite(WriteData *wd, const void *adr, size_t len)
{
if (UNLIKELY(wd->error)) {
return;
@@ -414,13 +419,13 @@ static void mywrite(WriteData *wd, const void *adr, int len)
/* if we have a single big chunk, write existing data in
* buffer and write out big chunk in smaller pieces */
if (len > MYWRITE_MAX_CHUNK) {
- if (wd->buf_used_len) {
+ if (wd->buf_used_len != 0) {
writedata_do_write(wd, wd->buf, wd->buf_used_len);
wd->buf_used_len = 0;
}
do {
- int writelen = MIN2(len, MYWRITE_MAX_CHUNK);
+ size_t writelen = MIN2(len, MYWRITE_MAX_CHUNK);
writedata_do_write(wd, adr, writelen);
adr = (const char *)adr + writelen;
len -= writelen;
@@ -468,7 +473,7 @@ static WriteData *mywrite_begin(WriteWrap *ww, MemFile *compare, MemFile *curren
*/
static bool mywrite_end(WriteData *wd)
{
- if (wd->buf_used_len) {
+ if (wd->buf_used_len != 0) {
writedata_do_write(wd, wd->buf, wd->buf_used_len);
wd->buf_used_len = 0;
}
@@ -558,7 +563,7 @@ static void writestruct_at_address_nr(
}
mywrite(wd, &bh, sizeof(BHead));
- mywrite(wd, data, bh.len);
+ mywrite(wd, data, (size_t)bh.len);
}
static void writestruct_nr(
@@ -568,7 +573,7 @@ static void writestruct_nr(
}
/* do not use for structs */
-static void writedata(WriteData *wd, int filecode, int len, const void *adr)
+static void writedata(WriteData *wd, int filecode, size_t len, const void *adr)
{
BHead bh;
@@ -576,15 +581,20 @@ static void writedata(WriteData *wd, int filecode, int len, const void *adr)
return;
}
+ if (len > INT_MAX) {
+ BLI_assert(!"Cannot write chunks bigger than INT_MAX.");
+ return;
+ }
+
/* align to 4 (writes uninitialized bytes in some cases) */
- len = (len + 3) & ~3;
+ len = (len + 3) & ~((size_t)3);
/* init BHead */
bh.code = filecode;
bh.old = adr;
bh.nr = 1;
bh.SDNAnr = 0;
- bh.len = len;
+ bh.len = (int)len;
mywrite(wd, &bh, sizeof(BHead));
mywrite(wd, adr, len);
@@ -1680,10 +1690,10 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address)
if (sce->r.avicodecdata) {
BLO_write_struct(writer, AviCodecData, sce->r.avicodecdata);
if (sce->r.avicodecdata->lpFormat) {
- BLO_write_raw(writer, sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat);
+ BLO_write_raw(writer, (size_t)sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat);
}
if (sce->r.avicodecdata->lpParms) {
- BLO_write_raw(writer, sce->r.avicodecdata->cbParms, sce->r.avicodecdata->lpParms);
+ BLO_write_raw(writer, (size_t)sce->r.avicodecdata->cbParms, sce->r.avicodecdata->lpParms);
}
}
if (sce->r.ffcodecdata.properties) {
@@ -1693,6 +1703,10 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address)
/* writing dynamic list of TimeMarkers to the blend file */
LISTBASE_FOREACH (TimeMarker *, marker, &sce->markers) {
BLO_write_struct(writer, TimeMarker, marker);
+
+ if (marker->prop != NULL) {
+ IDP_BlendWrite(writer, marker->prop);
+ }
}
/* writing dynamic list of TransformOrientations to the blend file */
@@ -1948,7 +1962,7 @@ static void write_area_regions(BlendWriter *writer, ScrArea *area)
LISTBASE_FOREACH (ConsoleLine *, cl, &con->history) {
/* 'len_alloc' is invalid on write, set from 'len' on read */
BLO_write_struct(writer, ConsoleLine, cl);
- BLO_write_raw(writer, cl->len + 1, cl->line);
+ BLO_write_raw(writer, (size_t)cl->len + 1, cl->line);
}
BLO_write_struct(writer, SpaceConsole, sl);
}
@@ -2412,7 +2426,7 @@ static bool write_file_handle(Main *mainvar,
*
* Note that we *borrow* the pointer to 'DNAstr',
* so writing each time uses the same address and doesn't cause unnecessary undo overhead. */
- writedata(wd, DNA1, wd->sdna->data_len, wd->sdna->data);
+ writedata(wd, DNA1, (size_t)wd->sdna->data_len, wd->sdna->data);
/* end of file */
memset(&bhead, 0, sizeof(BHead));
@@ -2633,7 +2647,7 @@ bool BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int w
return (err == 0);
}
-void BLO_write_raw(BlendWriter *writer, int size_in_bytes, const void *data_ptr)
+void BLO_write_raw(BlendWriter *writer, size_t size_in_bytes, const void *data_ptr)
{
writedata(writer->wd, DATA, size_in_bytes, data_ptr);
}
@@ -2709,38 +2723,38 @@ int BLO_get_struct_id_by_name(BlendWriter *writer, const char *struct_name)
return struct_id;
}
-void BLO_write_int32_array(BlendWriter *writer, int size, const int32_t *data_ptr)
+void BLO_write_int32_array(BlendWriter *writer, uint num, const int32_t *data_ptr)
{
- BLO_write_raw(writer, sizeof(int32_t) * size, data_ptr);
+ BLO_write_raw(writer, sizeof(int32_t) * (size_t)num, data_ptr);
}
-void BLO_write_uint32_array(BlendWriter *writer, int size, const uint32_t *data_ptr)
+void BLO_write_uint32_array(BlendWriter *writer, uint num, const uint32_t *data_ptr)
{
- BLO_write_raw(writer, sizeof(uint32_t) * size, data_ptr);
+ BLO_write_raw(writer, sizeof(uint32_t) * (size_t)num, data_ptr);
}
-void BLO_write_float_array(BlendWriter *writer, int size, const float *data_ptr)
+void BLO_write_float_array(BlendWriter *writer, uint num, const float *data_ptr)
{
- BLO_write_raw(writer, sizeof(float) * size, data_ptr);
+ BLO_write_raw(writer, sizeof(float) * (size_t)num, data_ptr);
}
-void BLO_write_pointer_array(BlendWriter *writer, int size, const void *data_ptr)
+void BLO_write_pointer_array(BlendWriter *writer, uint num, const void *data_ptr)
{
- BLO_write_raw(writer, sizeof(void *) * size, data_ptr);
+ BLO_write_raw(writer, sizeof(void *) * (size_t)num, data_ptr);
}
-void BLO_write_float3_array(BlendWriter *writer, int size, const float *data_ptr)
+void BLO_write_float3_array(BlendWriter *writer, uint num, const float *data_ptr)
{
- BLO_write_raw(writer, sizeof(float[3]) * size, data_ptr);
+ BLO_write_raw(writer, sizeof(float[3]) * (size_t)num, data_ptr);
}
/**
* Write a null terminated string.
*/
-void BLO_write_string(BlendWriter *writer, const char *str)
+void BLO_write_string(BlendWriter *writer, const char *data_ptr)
{
- if (str != NULL) {
- BLO_write_raw(writer, strlen(str) + 1, str);
+ if (data_ptr != NULL) {
+ BLO_write_raw(writer, strlen(data_ptr) + 1, data_ptr);
}
}