[Bf-blender-cvs] [292444e] temp_custom_loop_normals: RNA image.pack(): fix possible memleak, add possibility to pass raw bytes data.

Bastien Montagne noreply at git.blender.org
Wed Feb 4 16:12:23 CET 2015


Commit: 292444e3f5c2c1df45a949cca0a0be430a5ba57c
Author: Bastien Montagne
Date:   Wed Feb 4 14:46:22 2015 +0100
Branches: temp_custom_loop_normals
https://developer.blender.org/rB292444e3f5c2c1df45a949cca0a0be430a5ba57c

RNA image.pack(): fix possible memleak, add possibility to pass raw bytes data.

Note passing data assumes user knows what he is doing, else segfault is guaranted
(there is no good ways to pass raw bytes data to RNA func currently, and using
int array is way too heavy in this case).

And image->packedfile was never freed...

===================================================================

M	source/blender/makesrna/intern/rna_image_api.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c
index 90f90ea..63bd50e 100644
--- a/source/blender/makesrna/intern/rna_image_api.c
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -144,7 +144,7 @@ static void rna_Image_save(Image *image, bContext *C, ReportList *reports)
 	WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, image);
 }
 
-static void rna_Image_pack(Image *image, bContext *C, ReportList *reports, int as_png)
+static void rna_Image_pack(Image *image, bContext *C, ReportList *reports, int as_png, const char *data, int data_len)
 {
 	ImBuf *ibuf = BKE_image_acquire_ibuf(image, NULL, NULL);
 
@@ -152,9 +152,18 @@ static void rna_Image_pack(Image *image, bContext *C, ReportList *reports, int a
 		BKE_report(reports, RPT_ERROR, "Cannot pack edited image from disk, only as internal PNG");
 	}
 	else {
+		if (image->packedfile) {
+			freePackedFile(image->packedfile);
+			image->packedfile = NULL;
+		}
 		if (as_png) {
 			BKE_image_memorypack(image);
 		}
+		else if (data) {
+			char *data_dup = MEM_mallocN(sizeof(*data_dup) * (size_t)data_len, __func__);
+			memcpy(data_dup, data, (size_t)data_len);
+			image->packedfile = newPackedFileMemory(data_dup, data_len);
+		}
 		else {
 			image->packedfile = newPackedFile(reports, image->name, ID_BLEND_PATH(G.main, &image->id));
 		}
@@ -307,6 +316,10 @@ void RNA_api_image(StructRNA *srna)
 	RNA_def_function_ui_description(func, "Pack an image as embedded data into the .blend file");
 	RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
 	RNA_def_boolean(func, "as_png", 0, "as_png", "Pack the image as PNG (needed for generated/dirty images)");
+	parm = RNA_def_property(func, "data", PROP_STRING, PROP_BYTESTRING);
+	RNA_def_property_ui_text(parm, "data", "Raw data (bytes, exact content of the embedded file)");
+	RNA_def_int(func, "data_len", 0, 0, INT_MAX,
+	            "data_len", "length of given data (mandatory if data is provided)", 0, INT_MAX);
 
 	func = RNA_def_function(srna, "unpack", "rna_Image_unpack");
 	RNA_def_function_ui_description(func, "Save an image packed in the .blend file to disk");




More information about the Bf-blender-cvs mailing list