partial fix for [#32581] Mesh properties API does not allow for zeros in byte array

bmesh access allows zero bytes, support still needs adding via RNA.
This commit is contained in:
Campbell Barton
2013-01-09 13:25:46 +00:00
parent 2d526c23dd
commit f9c87b86fc
3 changed files with 30 additions and 5 deletions

View File

@@ -167,7 +167,7 @@ typedef struct MIntProperty {
int i; int i;
} MIntProperty; } MIntProperty;
typedef struct MStringProperty { typedef struct MStringProperty {
char s[256]; char s[255], s_len;
} MStringProperty; } MStringProperty;
typedef struct OrigSpaceFace { typedef struct OrigSpaceFace {

View File

@@ -1233,6 +1233,26 @@ static char *rna_MeshStringProperty_path(PointerRNA *ptr)
return rna_PolyCustomData_data_path(ptr, "layers_string", CD_PROP_STR); return rna_PolyCustomData_data_path(ptr, "layers_string", CD_PROP_STR);
} }
/* XXX, we dont have propper byte string support yet, so for now use the (bytes + 1)
* bmesh API exposes correct python/bytestring access */
void rna_MeshStringProperty_s_get(PointerRNA *ptr, char *value)
{
MStringProperty *ms = (MStringProperty *)ptr->data;
BLI_strncpy(value, ms->s, (int)ms->s_len + 1);
}
int rna_MeshStringProperty_s_length(PointerRNA *ptr)
{
MStringProperty *ms = (MStringProperty *)ptr->data;
return (int)ms->s_len + 1;
}
void rna_MeshStringProperty_s_set(PointerRNA *ptr, const char *value)
{
MStringProperty *ms = (MStringProperty *)ptr->data;
BLI_strncpy(ms->s, value, sizeof(ms->s));
}
static int rna_Mesh_tot_vert_get(PointerRNA *ptr) static int rna_Mesh_tot_vert_get(PointerRNA *ptr)
{ {
Mesh *me = rna_mesh(ptr); Mesh *me = rna_mesh(ptr);
@@ -2161,6 +2181,7 @@ static void rna_def_mproperties(BlenderRNA *brna)
/* low level mesh data access, treat as bytes */ /* low level mesh data access, treat as bytes */
prop = RNA_def_property(srna, "value", PROP_STRING, PROP_BYTESTRING); prop = RNA_def_property(srna, "value", PROP_STRING, PROP_BYTESTRING);
RNA_def_property_string_sdna(prop, NULL, "s"); RNA_def_property_string_sdna(prop, NULL, "s");
RNA_def_property_string_funcs(prop, "rna_MeshStringProperty_s_get", "rna_MeshStringProperty_s_length", "rna_MeshStringProperty_s_set");
RNA_def_property_ui_text(prop, "Value", ""); RNA_def_property_ui_text(prop, "Value", "");
RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
} }

View File

@@ -981,7 +981,7 @@ PyObject *BPy_BMLayerItem_GetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer)
case CD_PROP_STR: case CD_PROP_STR:
{ {
MStringProperty *mstring = value; MStringProperty *mstring = value;
ret = PyBytes_FromStringAndSize(mstring->s, BLI_strnlen(mstring->s, sizeof(mstring->s))); ret = PyBytes_FromStringAndSize(mstring->s, mstring->s_len);
break; break;
} }
case CD_MTEXPOLY: case CD_MTEXPOLY:
@@ -1067,13 +1067,17 @@ int BPy_BMLayerItem_SetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer, PyObj
case CD_PROP_STR: case CD_PROP_STR:
{ {
MStringProperty *mstring = value; MStringProperty *mstring = value;
const char *tmp_val = PyBytes_AsString(py_value); char *tmp_val;
if (UNLIKELY(tmp_val == NULL)) { Py_ssize_t tmp_val_len;
if (UNLIKELY(PyBytes_AsStringAndSize(py_value, &tmp_val, &tmp_val_len) == -1)) {
PyErr_Format(PyExc_TypeError, "expected bytes, not a %.200s", Py_TYPE(py_value)->tp_name); PyErr_Format(PyExc_TypeError, "expected bytes, not a %.200s", Py_TYPE(py_value)->tp_name);
ret = -1; ret = -1;
} }
else { else {
BLI_strncpy(mstring->s, tmp_val, min_ii(PyBytes_Size(py_value), sizeof(mstring->s))); if (tmp_val_len > sizeof(mstring->s))
tmp_val_len = sizeof(mstring->s);
memcpy(mstring->s, tmp_val, tmp_val_len);
mstring->s_len = tmp_val_len;
} }
break; break;
} }