From b0ed763a41600e646041c509ecaba06eb92234fc Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Wed, 13 Jul 2022 16:39:12 -0700 Subject: [PATCH] Fixed some corner cases around empty packages in upb. 1. upb now tolerates a present-but-empty package name in a `FileDescriptorProto`. 2. upb now always returns a non-NULL string for `upb_FileDef_Package()`. If the package was empty or missing, the returned string is zero-length. This better matches the proto2 behavior: `proto2::FileDescriptor::package()` always returns a package string, which may be empty. PiperOrigin-RevId: 460831797 --- python/descriptor.c | 2 +- upb/def.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/python/descriptor.c b/python/descriptor.c index e7bef1214b..105461294a 100644 --- a/python/descriptor.c +++ b/python/descriptor.c @@ -1105,7 +1105,7 @@ static const void* PyUpb_FileDescriptor_NestedLookup( PyUpb_FileDescriptor_LookupFunc* func) { const upb_DefPool* symtab = upb_FileDef_Pool(filedef); const char* package = upb_FileDef_Package(filedef); - if (package) { + if (strlen(package)) { PyObject* qname = PyUnicode_FromFormat("%s.%s", package, name); const void* ret = func(symtab, PyUnicode_AsUTF8AndSize(qname, NULL)); Py_DECREF(qname); diff --git a/upb/def.c b/upb/def.c index e980afcfc5..c1a9d211e6 100644 --- a/upb/def.c +++ b/upb/def.c @@ -927,7 +927,9 @@ bool upb_FileDef_HasOptions(const upb_FileDef* f) { const char* upb_FileDef_Name(const upb_FileDef* f) { return f->name; } -const char* upb_FileDef_Package(const upb_FileDef* f) { return f->package; } +const char* upb_FileDef_Package(const upb_FileDef* f) { + return f->package ? f->package : ""; +} upb_Syntax upb_FileDef_Syntax(const upb_FileDef* f) { return f->syntax; } @@ -2897,8 +2899,8 @@ static void build_filedef( file->name = strviewdup(ctx, google_protobuf_FileDescriptorProto_name(file_proto)); - if (google_protobuf_FileDescriptorProto_has_package(file_proto)) { - upb_StringView package = google_protobuf_FileDescriptorProto_package(file_proto); + upb_StringView package = google_protobuf_FileDescriptorProto_package(file_proto); + if (package.size) { check_ident(ctx, package, true); file->package = strviewdup(ctx, package); } else {