Skip to content

Commit b234305

Browse files
anandoleecopybara-github
authored andcommitted
Fix upb to escape DefinitelyNeedsEscape (like " and ') for bytes field
PiperOrigin-RevId: 740056596
1 parent 18bc818 commit b234305

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

python/google/protobuf/internal/text_format_test.py

+8
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,14 @@ def testPrintUnknownFieldsEmbeddedMessageInBytes(self, message_module):
609609
print_unknown_fields=True,
610610
as_one_line=True))
611611

612+
def testBytestDoubleQuotes(self, message_module):
613+
msg = message_module.TestAllTypes(optional_bytes=b'"')
614+
self.assertEqual(str(msg), 'optional_bytes: "\\""\n')
615+
616+
def testBytesSingleQuote(self, message_module):
617+
msg = message_module.TestAllTypes(optional_bytes=b"'")
618+
self.assertEqual(str(msg), 'optional_bytes: "\\\'"\n')
619+
612620

613621
@parameterized.parameters(unittest_pb2, unittest_proto3_arena_pb2)
614622
class TextFormatMessageToTextBytesTests(TextFormatBase):

upb/text/internal/encode.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,8 @@ UPB_INLINE void UPB_PRIVATE(_upb_TextEncode_Bytes)(txtenc* e,
207207
UPB_PRIVATE(_upb_TextEncode_PutStr)(e, "\"");
208208
for (; ptr < end; ptr++) {
209209
unsigned char uc = *ptr;
210-
if (UPB_PRIVATE(_upb_AsciiIsPrint)(uc)) {
210+
if (UPB_PRIVATE(_upb_AsciiIsPrint)(uc) &&
211+
!UPB_PRIVATE(_upb_DefinitelyNeedsEscape)(uc)) {
211212
UPB_PRIVATE(_upb_TextEncode_PutBytes)(e, ptr, 1);
212213
} else {
213214
UPB_PRIVATE(_upb_TextEncode_Escaped)(e, uc);

0 commit comments

Comments
 (0)