libcli: Shrink .data segment by 43264 bytes
authorVolker Lendecke <vl@samba.org>
Tue, 28 Feb 2023 19:53:59 +0000 (20:53 +0100)
committerJeremy Allison <jra@samba.org>
Thu, 9 Mar 2023 18:10:33 +0000 (18:10 +0000)
A case statement only references const strings, pointers in an array
need to be relocated at exec() time.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
libcli/util/doserr.c
libcli/util/wscript_build
source4/scripting/bin/gen_werror.py

index 1c9978f1ff72d342e37763425ca16a964eb4c45f..28f709e073954f6be2173cd6073e447ca80758ed 100644 (file)
@@ -126,13 +126,10 @@ const char *win_errstr(WERROR werror)
 
 const char *get_friendly_werror_msg(WERROR werror)
 {
-       size_t i = 0;
-
-       for (i = 0; i < ARRAY_SIZE(dos_err_strs); i++) {
-               if (W_ERROR_V(dos_err_strs[i].werror) ==
-                    W_ERROR_V(werror)) {
-                       return dos_err_strs[i].friendly_errstr;
-               }
+       switch W_ERROR_V(werror) {
+#include "werror_friendly_gen.c"
+       default:
+               break;
        }
 
        return win_errstr(werror);
index ec8c4b95f15ac5e558b406920c4ccec32065038f..905fb2e0b17d50c646b05ae994a1d9714a5aaed1 100644 (file)
@@ -25,10 +25,11 @@ bld.SAMBA_GENERATOR('werror_generated',
                     target='''
                     werror_gen.h
                     werror_gen.c
+                    werror_friendly_gen.c
                     py_werror.c
                     ''',
                     group='build_source',
-                    rule='${PYTHON} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${TGT[0].abspath(env)} ${TGT[1].abspath(env)} ${TGT[2].abspath(env)}'
+                    rule='${PYTHON} ${SRC[0].abspath(env)} ${SRC[1].abspath(env)} ${TGT[0].abspath(env)} ${TGT[1].abspath(env)} ${TGT[2].abspath(env)} ${TGT[3].abspath(env)}'
                    )
 
 bld.SAMBA_PYTHON('python_ntstatus',
index 1ac9d330d050f0376f157a253311faf609687653..a6256f158b0273b484d3e8699fca15b2ceaa193b 100755 (executable)
@@ -51,20 +51,18 @@ def generateSourceFile(out_file, errors):
     out_file.write("{ 0, W_ERROR(0) }\n")
     out_file.write("};\n")
 
-    out_file.write("\n/*\n")
-    out_file.write(" * Descriptions for errors generated from\n")
+def generateFriendlySourceFile(out_file, errors):
+    out_file.write("/*\n")
+    out_file.write(" * Names for errors generated from\n")
     out_file.write(" * [MS-ERREF] https://msdn.microsoft.com/en-us/library/cc231199.aspx\n")
     out_file.write(" */\n")
 
-    out_file.write("static const struct werror_str_struct dos_err_strs[] = \n")
-    out_file.write("{\n")
     for err in errors:
-        # Account for the possibility that some errors may not have descriptions
-        if err.err_string == "":
+        if (err.err_define == 'WERR_NERR_SUCCESS'):
             continue
-        out_file.write("\t{ %s, \"%s\" },\n"%(err.err_define, err.err_string))
-    out_file.write("\t{ W_ERROR(0), 0 }\n")
-    out_file.write("};")
+        out_file.write(f'\tcase {hex(err.err_code)}:\n')
+        out_file.write(f'\t\treturn \"{err.err_string}\";\n')
+        out_file.write('\t\tbreak;\n')
 
 def generatePythonFile(out_file, errors):
     out_file.write("/*\n")
@@ -118,11 +116,12 @@ def transformErrorName( error_name ):
 # [3]: [[output doserr_gen.c]]
 # [4]: [[output py_werror.c]]
 def main():
-    if len(sys.argv) == 5:
+    if len(sys.argv) == 6:
         input_file_name = sys.argv[1]
         gen_headerfile_name = sys.argv[2]
         gen_sourcefile_name = sys.argv[3]
-        gen_pythonfile_name = sys.argv[4]
+        gen_friendlysource_name = sys.argv[4]
+        gen_pythonfile_name = sys.argv[5]
     else:
         print("usage: %s winerrorfile headerfile sourcefile pythonfile" % sys.argv[0])
         sys.exit()
@@ -139,6 +138,10 @@ def main():
     out_file = io.open(gen_sourcefile_name, "wt", encoding='utf8')
     generateSourceFile(out_file, errors)
     out_file.close()
+    print("writing new source file: %s" % gen_friendlysource_name)
+    out_file = io.open(gen_friendlysource_name, "wt", encoding='utf8')
+    generateFriendlySourceFile(out_file, errors)
+    out_file.close()
     print("writing new python file: %s" % gen_pythonfile_name)
     out_file = io.open(gen_pythonfile_name, "wt", encoding='utf8')
     generatePythonFile(out_file, errors)