Fix T50305: Blender truncates a long multibyte character object's name to an invalid utf-8 string.
Add logic in RNA to ensure we pass valid utf8 string to BKE ID new functions...
This commit is contained in:
parent
c1e3041051
commit
752a783fa4
Notes:
blender-bot
2023-02-14 07:19:56 +01:00
Referenced by issue #50305, Blender truncates a long multibyte character object's name to an invalid utf-8 string
|
@ -116,6 +116,13 @@
|
|||
#endif
|
||||
|
||||
|
||||
static void rna_idname_validate(const char *name, char *r_name)
|
||||
{
|
||||
BLI_strncpy(r_name, name, MAX_ID_NAME - 2);
|
||||
BLI_utf8_invalid_strip(r_name, strlen(r_name));
|
||||
}
|
||||
|
||||
|
||||
static void rna_Main_ID_remove(Main *bmain, ReportList *reports, PointerRNA *id_ptr, int do_unlink)
|
||||
{
|
||||
ID *id = id_ptr->data;
|
||||
|
@ -137,14 +144,20 @@ static void rna_Main_ID_remove(Main *bmain, ReportList *reports, PointerRNA *id_
|
|||
|
||||
static Camera *rna_Main_cameras_new(Main *bmain, const char *name)
|
||||
{
|
||||
ID *id = BKE_camera_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
ID *id = BKE_camera_add(bmain, safe_name);
|
||||
id_us_min(id);
|
||||
return (Camera *)id;
|
||||
}
|
||||
|
||||
static Scene *rna_Main_scenes_new(Main *bmain, const char *name)
|
||||
{
|
||||
return BKE_scene_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
return BKE_scene_add(bmain, safe_name);
|
||||
}
|
||||
static void rna_Main_scenes_remove(Main *bmain, bContext *C, ReportList *reports, PointerRNA *scene_ptr, int do_unlink)
|
||||
{
|
||||
|
@ -180,6 +193,9 @@ static void rna_Main_scenes_remove(Main *bmain, bContext *C, ReportList *reports
|
|||
|
||||
static Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char *name, ID *data)
|
||||
{
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Object *ob;
|
||||
int type = OB_EMPTY;
|
||||
if (data) {
|
||||
|
@ -223,7 +239,7 @@ static Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char
|
|||
id_us_plus(data);
|
||||
}
|
||||
|
||||
ob = BKE_object_add_only_object(bmain, type, name);
|
||||
ob = BKE_object_add_only_object(bmain, type, safe_name);
|
||||
id_us_min(&ob->id);
|
||||
|
||||
ob->data = data;
|
||||
|
@ -234,7 +250,10 @@ static Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char
|
|||
|
||||
static Material *rna_Main_materials_new(Main *bmain, const char *name)
|
||||
{
|
||||
ID *id = (ID *)BKE_material_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
ID *id = (ID *)BKE_material_add(bmain, safe_name);
|
||||
id_us_min(id);
|
||||
return (Material *)id;
|
||||
}
|
||||
|
@ -245,20 +264,27 @@ static EnumPropertyItem *rna_Main_nodetree_type_itemf(bContext *UNUSED(C), Point
|
|||
}
|
||||
static struct bNodeTree *rna_Main_nodetree_new(Main *bmain, const char *name, int type)
|
||||
{
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
bNodeTreeType *typeinfo = rna_node_tree_type_from_enum(type);
|
||||
if (typeinfo) {
|
||||
bNodeTree *ntree = ntreeAddTree(bmain, name, typeinfo->idname);
|
||||
bNodeTree *ntree = ntreeAddTree(bmain, safe_name, typeinfo->idname);
|
||||
|
||||
id_us_min(&ntree->id);
|
||||
return ntree;
|
||||
}
|
||||
else
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static Mesh *rna_Main_meshes_new(Main *bmain, const char *name)
|
||||
{
|
||||
Mesh *me = BKE_mesh_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Mesh *me = BKE_mesh_add(bmain, safe_name);
|
||||
id_us_min(&me->id);
|
||||
return me;
|
||||
}
|
||||
|
@ -286,7 +312,10 @@ Mesh *rna_Main_meshes_new_from_object(
|
|||
|
||||
static Lamp *rna_Main_lamps_new(Main *bmain, const char *name, int type)
|
||||
{
|
||||
Lamp *lamp = BKE_lamp_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Lamp *lamp = BKE_lamp_add(bmain, safe_name);
|
||||
lamp->type = type;
|
||||
id_us_min(&lamp->id);
|
||||
return lamp;
|
||||
|
@ -294,8 +323,11 @@ static Lamp *rna_Main_lamps_new(Main *bmain, const char *name, int type)
|
|||
|
||||
static Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer, int stereo3d)
|
||||
{
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
float color[4] = {0.0, 0.0, 0.0, 1.0};
|
||||
Image *image = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, float_buffer, 0, color, stereo3d);
|
||||
Image *image = BKE_image_add_generated(bmain, width, height, safe_name, alpha ? 32 : 24, float_buffer, 0, color, stereo3d);
|
||||
id_us_min(&image->id);
|
||||
return image;
|
||||
}
|
||||
|
@ -322,21 +354,30 @@ static Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char
|
|||
|
||||
static Lattice *rna_Main_lattices_new(Main *bmain, const char *name)
|
||||
{
|
||||
Lattice *lt = BKE_lattice_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Lattice *lt = BKE_lattice_add(bmain, safe_name);
|
||||
id_us_min(<->id);
|
||||
return lt;
|
||||
}
|
||||
|
||||
static Curve *rna_Main_curves_new(Main *bmain, const char *name, int type)
|
||||
{
|
||||
Curve *cu = BKE_curve_add(bmain, name, type);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Curve *cu = BKE_curve_add(bmain, safe_name, type);
|
||||
id_us_min(&cu->id);
|
||||
return cu;
|
||||
}
|
||||
|
||||
static MetaBall *rna_Main_metaballs_new(Main *bmain, const char *name)
|
||||
{
|
||||
MetaBall *mb = BKE_mball_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
MetaBall *mb = BKE_mball_add(bmain, safe_name);
|
||||
id_us_min(&mb->id);
|
||||
return mb;
|
||||
}
|
||||
|
@ -364,7 +405,10 @@ static VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, const char *
|
|||
|
||||
static Tex *rna_Main_textures_new(Main *bmain, const char *name, int type)
|
||||
{
|
||||
Tex *tex = BKE_texture_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Tex *tex = BKE_texture_add(bmain, safe_name);
|
||||
BKE_texture_type_set(tex, type);
|
||||
id_us_min(&tex->id);
|
||||
return tex;
|
||||
|
@ -372,26 +416,38 @@ static Tex *rna_Main_textures_new(Main *bmain, const char *name, int type)
|
|||
|
||||
static Brush *rna_Main_brushes_new(Main *bmain, const char *name, int mode)
|
||||
{
|
||||
Brush *brush = BKE_brush_add(bmain, name, mode);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Brush *brush = BKE_brush_add(bmain, safe_name, mode);
|
||||
id_us_min(&brush->id);
|
||||
return brush;
|
||||
}
|
||||
|
||||
static World *rna_Main_worlds_new(Main *bmain, const char *name)
|
||||
{
|
||||
World *world = add_world(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
World *world = add_world(bmain, safe_name);
|
||||
id_us_min(&world->id);
|
||||
return world;
|
||||
}
|
||||
|
||||
static Group *rna_Main_groups_new(Main *bmain, const char *name)
|
||||
{
|
||||
return BKE_group_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
return BKE_group_add(bmain, safe_name);
|
||||
}
|
||||
|
||||
static Speaker *rna_Main_speakers_new(Main *bmain, const char *name)
|
||||
{
|
||||
Speaker *speaker = BKE_speaker_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Speaker *speaker = BKE_speaker_add(bmain, safe_name);
|
||||
id_us_min(&speaker->id);
|
||||
return speaker;
|
||||
}
|
||||
|
@ -413,7 +469,10 @@ static bSound *rna_Main_sounds_load(Main *bmain, const char *name, int check_exi
|
|||
|
||||
static Text *rna_Main_texts_new(Main *bmain, const char *name)
|
||||
{
|
||||
return BKE_text_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
return BKE_text_add(bmain, safe_name);
|
||||
}
|
||||
|
||||
static Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *filepath, int is_internal)
|
||||
|
@ -432,28 +491,40 @@ static Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *f
|
|||
|
||||
static bArmature *rna_Main_armatures_new(Main *bmain, const char *name)
|
||||
{
|
||||
bArmature *arm = BKE_armature_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
bArmature *arm = BKE_armature_add(bmain, safe_name);
|
||||
id_us_min(&arm->id);
|
||||
return arm;
|
||||
}
|
||||
|
||||
static bAction *rna_Main_actions_new(Main *bmain, const char *name)
|
||||
{
|
||||
bAction *act = add_empty_action(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
bAction *act = add_empty_action(bmain, safe_name);
|
||||
id_fake_user_clear(&act->id);
|
||||
return act;
|
||||
}
|
||||
|
||||
static ParticleSettings *rna_Main_particles_new(Main *bmain, const char *name)
|
||||
{
|
||||
ParticleSettings *part = psys_new_settings(name, bmain);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
ParticleSettings *part = psys_new_settings(safe_name, bmain);
|
||||
id_us_min(&part->id);
|
||||
return part;
|
||||
}
|
||||
|
||||
static Palette *rna_Main_palettes_new(Main *bmain, const char *name)
|
||||
{
|
||||
Palette *palette = BKE_palette_add(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
Palette *palette = BKE_palette_add(bmain, safe_name);
|
||||
id_us_min(&palette->id);
|
||||
return (Palette *)palette;
|
||||
}
|
||||
|
@ -481,16 +552,18 @@ static MovieClip *rna_Main_movieclip_load(Main *bmain, ReportList *reports, cons
|
|||
|
||||
static Mask *rna_Main_mask_new(Main *bmain, const char *name)
|
||||
{
|
||||
Mask *mask;
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
mask = BKE_mask_new(bmain, name);
|
||||
|
||||
return mask;
|
||||
return BKE_mask_new(bmain, safe_name);
|
||||
}
|
||||
|
||||
static FreestyleLineStyle *rna_Main_linestyles_new(Main *bmain, const char *name)
|
||||
{
|
||||
FreestyleLineStyle *linestyle = BKE_linestyle_new(bmain, name);
|
||||
char safe_name[MAX_ID_NAME - 2];
|
||||
rna_idname_validate(name, safe_name);
|
||||
|
||||
FreestyleLineStyle *linestyle = BKE_linestyle_new(bmain, safe_name);
|
||||
id_us_min(&linestyle->id);
|
||||
return linestyle;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue