Fix field descriptor sizing with submsg_callback option (#545)
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index a6e0d31..07beed3 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -683,6 +683,9 @@
                 size = dependencies[str(self.submsgname)].data_size(dependencies)
             else:
                 size = 256 # Message is in other file, this is reasonable guess for most cases
+
+            if self.pbtype == 'MSG_W_CB':
+                size += 16
         elif self.pbtype in ['STRING', 'FIXED_LENGTH_BYTES']:
             size = self.max_size
         elif self.pbtype == 'BYTES':
diff --git a/tests/regression/issue_545/SConscript b/tests/regression/issue_545/SConscript
new file mode 100644
index 0000000..de7fb78
--- /dev/null
+++ b/tests/regression/issue_545/SConscript
@@ -0,0 +1,7 @@
+# Regression test for #545:
+# Field descriptor width automatic sizing is inaccurate with oneofs
+
+Import("env")
+env.NanopbProto("submsg_callback")
+env.Object("submsg_callback.pb.c")
+
diff --git a/tests/regression/issue_545/submsg_callback.proto b/tests/regression/issue_545/submsg_callback.proto
new file mode 100644
index 0000000..9d26abd
--- /dev/null
+++ b/tests/regression/issue_545/submsg_callback.proto
@@ -0,0 +1,23 @@
+syntax = "proto2";
+
+import "nanopb.proto";
+
+message SubMessage3 {
+    required uint32 foo = 1;
+}
+
+message SubMessage2 {
+    oneof oneof {
+        SubMessage3 submsg = 1 [(nanopb).submsg_callback = true];
+    }
+}
+
+message SubMessage1 {
+    repeated SubMessage2 msgs = 1 [(nanopb).max_count = 16];
+}
+
+message MainMessage {
+    required SubMessage1 msg = 1;
+    required uint32 foo = 2;
+}
+