Fixed validation of extension field descriptors.
diff --git a/python/message.c b/python/message.c
index 7a3c8f6..736358c 100644
--- a/python/message.c
+++ b/python/message.c
@@ -1068,13 +1068,8 @@
static PyObject* PyUpb_CMessage_ClearExtension(PyObject* _self, PyObject* arg) {
PyUpb_CMessage* self = (void*)_self;
PyUpb_CMessage_AssureReified(self);
- const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
- const upb_fielddef* f = PyUpb_FieldDescriptor_GetDef(arg);
+ const upb_fielddef* f = PyUpb_CMessage_GetExtensionDef(_self, arg);
if (!f) return NULL;
- if (upb_fielddef_containingtype(f) != msgdef) {
- PyErr_Format(PyExc_ValueError, "Extension doesn't match (%s vs %s)",
- upb_msgdef_fullname(msgdef), upb_fielddef_fullname(f));
- }
PyUpb_CMessage_DoClearField(_self, f);
Py_RETURN_NONE;
}
@@ -1159,11 +1154,38 @@
goto done;
}
+const upb_fielddef* PyUpb_CMessage_GetExtensionDef(PyObject* _self, PyObject* key) {
+ const upb_fielddef* f = PyUpb_FieldDescriptor_GetDef(key);
+ if (!f) {
+ PyErr_Clear();
+ PyErr_Format(PyExc_KeyError, "Object %R is not a field descriptor\n", key);
+ return NULL;
+ }
+ if (!upb_fielddef_isextension(f)) {
+ PyErr_Format(PyExc_KeyError, "Field %s is not an extension\n",
+ upb_fielddef_fullname(f));
+ return NULL;
+ }
+ const upb_msgdef* msgdef = PyUpb_CMessage_GetMsgdef(_self);
+ if (upb_fielddef_containingtype(f) != msgdef) {
+ PyErr_Format(PyExc_KeyError, "Extension doesn't match (%s vs %s)",
+ upb_msgdef_fullname(msgdef), upb_fielddef_fullname(f));
+ return NULL;
+ }
+ return f;
+}
+
+
static PyObject* PyUpb_CMessage_HasExtension(PyObject* _self,
PyObject* ext_desc) {
upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
- const upb_fielddef* f = PyUpb_FieldDescriptor_GetDef(ext_desc);
+ const upb_fielddef* f = PyUpb_CMessage_GetExtensionDef(_self, ext_desc);
if (!f) return NULL;
+ if (upb_fielddef_isseq(f)) {
+ PyErr_SetString(PyExc_KeyError,
+ "Field is repeated. A singular method is required.");
+ return NULL;
+ }
if (!msg) Py_RETURN_FALSE;
return PyBool_FromLong(upb_msg_has(msg, f));
}