scripts: Make SafeStruct deep-copy strings

Change-Id: I7e31207851ffec447f4f042ccac06916c98dfb58
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index cee626c..c7a50af 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -1234,6 +1234,7 @@
                                    '    if (pCode)\n'
                                    '        delete[] reinterpret_cast<const uint8_t *>(pCode);\n' }
             copy_pnext = ''
+            copy_strings = ''
             for member in item.members:
                 m_type = member.type
                 if member.name == 'pNext':
@@ -1246,9 +1247,27 @@
                     # Ptr types w/o a safe_struct, for non-null case need to allocate new ptr and copy data in
                     if m_type in ['void', 'char']:
                         if member.name != 'pNext':
-                            # For these exceptions just copy initial value over for now
-                            init_list += '\n    %s(in_struct->%s),' % (member.name, member.name)
-                            init_func_txt += '    %s = in_struct->%s;\n' % (member.name, member.name)
+                            if m_type == 'char':
+                                # Create deep copies of strings
+                                if member.len:
+                                    copy_strings += '    %s = new char *[in_struct->%s];\n' % (member.name, member.len)
+                                    copy_strings += '    for (uint32_t i = 0; i < %s; ++i) {\n' % member.len
+                                    copy_strings += '        (const_cast<const char **>(%s))[i] = SafeStringCopy(in_struct->%s[i]);\n' % (member.name, member.name)
+                                    copy_strings += '    }\n'
+
+                                    destruct_txt += '    if (%s) {\n' % member.name
+                                    destruct_txt += '        for (uint32_t i = 0; i < %s; ++i) {\n' % member.len
+                                    destruct_txt += '            delete [] %s[i];\n' % member.name
+                                    destruct_txt += '        }\n'
+                                    destruct_txt += '        delete [] %s;\n' % member.name
+                                    destruct_txt += '    }\n'
+                                else:
+                                    copy_strings += '    %s = SafeStringCopy(in_struct->%s);\n' % (member.name, member.name)
+                                    destruct_txt += '    if (%s) delete [] %s;\n' % (member.name, member.name)
+                            else:
+                                # For these exceptions just copy initial value over for now
+                                init_list += '\n    %s(in_struct->%s),' % (member.name, member.name)
+                                init_func_txt += '    %s = in_struct->%s;\n' % (member.name, member.name)
                         default_init_list += '\n    %s(nullptr),' % (member.name)
                     else:
                         default_init_list += '\n    %s(nullptr),' % (member.name)
@@ -1318,7 +1337,7 @@
             if item.name in custom_construct_txt:
                 construct_txt = custom_construct_txt[item.name]
 
-            construct_txt = copy_pnext + construct_txt
+            construct_txt = copy_pnext + copy_strings + construct_txt
 
             if item.name in custom_destruct_txt:
                 destruct_txt = custom_destruct_txt[item.name]