Add md5 lib checker 35/159635/7
authorVitaliy Cherepanov <v.cherepanov@samsung.com>
Fri, 15 Sep 2017 16:03:41 +0000 (19:03 +0300)
committerVitaliy Cherepanov <v.cherepanov@samsung.com>
Thu, 16 Nov 2017 13:24:32 +0000 (16:24 +0300)
Change-Id: I0f632523ce278bd74e1c1f80c7dafd44b0c5d188
Signed-off-by: Vitaliy Cherepanov <v.cherepanov@samsung.com>
scripts/gen_headers.py

index 6a2e17e0f48c2db05d9dd3ccc1482e014c8c58e0..fa096d18637c4bb7b84b096c4b14d8c1f152aef7 100755 (executable)
@@ -5,6 +5,7 @@ import sys
 import subprocess
 import re
 import os
+import hashlib
 from ctypes import *
 
 defines={}
@@ -268,6 +269,32 @@ ERR_HANDLER_NOT_FOUND_IN_LD_LIB = 1
 ERR_HANDLER_NO_FEATURE = 2
 ERR_HANDLER_FOUND_BUT_CANNOT_BE_LINKED = 3
 function_errors={}
+md5_libs={}
+
+def hashfile(afile, hasher, blocksize=65536):
+    buf = afile.read(blocksize)
+    while len(buf) > 0:
+        hasher.update(buf)
+        buf = afile.read(blocksize)
+    return hasher.digest()
+
+
+def add_lib_md5_check(lib_name):
+    if lib_name not in md5_libs:
+        hash = str( hashlib.md5(open(lib_name, 'rb').read()).hexdigest() )
+        md5_libs[lib_name] = {"md5_sum": hash}
+
+def get_md5_lib_num(lib_name):
+    if lib_name not in md5_libs:
+        return None
+
+    num = 0
+    for lib in md5_libs:
+        if lib == lib_name:
+            break
+        num = num + 1
+
+    return num
 
 def get_function_search_error(function_name):
     err = function_errors[function_name]
@@ -309,6 +336,7 @@ def iterate_over_libs(data, probe_lib):
                     if addr is not None:
                         feature_dict = __add_item(feature_dict, [handler, [feature, [libname, [funcname]]]], (addr, handler_addr, data[handler][libname][funcname][feature][1]))
                         function_errors[funcname] = ERR_NO;
+                        add_lib_md5_check(libname)
     return feature_dict
 
 ####################################################################
@@ -370,7 +398,11 @@ def __print_feature_end(file, libs_in_feature, feature_lib_list, feature_list):
     file.write("struct ld_lib_list_el_t " + feature_lib_list + "[] = {\n")
     for lib in libs_in_feature:
         libs_cnt += 1
-        file.write("\t{\"" + lib + "\", " + str(libs_in_feature[lib][0]) + ", " + libs_in_feature[lib][1] + "},\n")
+        lib_md5_num = get_md5_lib_num(lib)
+        lib_md5_struct_pointer = "NULL"
+        if lib_md5_num is not None:
+            lib_md5_struct_pointer = "&ld_lib_md5_list[%d]" % lib_md5_num
+        file.write("\t{\"" + lib + "\", " + str(libs_in_feature[lib][0]) + ", " + libs_in_feature[lib][1] + ", " + lib_md5_struct_pointer + "},\n")
 
     file.write("}; /* " + feature_lib_list + " */\n")
     file.write("\n")
@@ -455,6 +487,22 @@ def __print_features(file, data):
 
     __print_feature_list(file, features_cnt, features_list_dict, handlers_list)
 
+def __print_md5_check(file, md5_libs):
+    file.write("\n");
+    file.write("struct ld_lib_md5_check_t ld_lib_md5_list[] = {\n");
+    ind = 0
+    for lib_name in md5_libs:
+        file.write("\t/*%02d*/ {LIB_MD5_NOT_CHECKED, \"%s\", \"%s\"},\n" % (ind, str(md5_libs[lib_name]["md5_sum"]), str(lib_name)));
+        ind = ind + 1
+    file.write("};\n");
+
+def __print_ld_lib_md5_check_t(file):
+    file.write("struct ld_lib_md5_check_t {\n")
+    file.write("\tenum lib_md5_check check_result;\n")
+    file.write("\tconst char *md5_sum;\n")
+    file.write("\tconst char *lib_name;\n")
+    file.write("};\n")
+
 def __print_probe_el_t(file):
     file.write("struct ld_probe_el_t {\n")
     file.write("\tuint64_t orig_addr;\n")
@@ -468,6 +516,7 @@ def __print_lib_list_el_t(file):
     file.write("\tchar *lib_name;\n")
     file.write("\tuint32_t probe_count;\n")
     file.write("\tstruct ld_probe_el_t *probes;\n")
+    file.write("\tstruct ld_lib_md5_check_t *md5;\n")
     file.write("};\n")
 
 def __print_feature_list_el_t(file):
@@ -487,6 +536,13 @@ def __print_feature_list_t(file):
 def __print_types(file):
     file.write("#define NOFEATURE 0xFFFFFFFF\n")
     file.write("#define IFUNC_UNDEF_ADDR 0xFFFFFFFFFFFFFFFFULL\n")
+    file.write("/* MD5 checking */\n")
+    file.write("enum lib_md5_check { \n")
+    file.write("\tLIB_MD5_NOT_CHECKED = 0,\n")
+    file.write("\tLIB_MD5_OK = 1,\n")
+    file.write("\tLIB_MD5_CHECK_FAIL = 2\n")
+    file.write("};\n\n")
+    __print_ld_lib_md5_check_t(file)
     file.write("\n")
     __print_probe_el_t(file)
     file.write("\n")
@@ -536,6 +592,7 @@ def generate_headers(dict, da_inst_dir, da_lib, probe_lib):
         __print_license(file)
         __print_include_guard_top(file, "__LD_PRELOAD_PROBES__")
         __print_includes(file, (os.path.basename(c_output_types),))
+        __print_md5_check(file, md5_libs)
         __print_features(file, dict)
         __print_include_guard_bottom(file, "__LD_PRELOAD_PROBES__")