Baseline update from LYNQ_SDK_ASR_T108_V05.03.01.00(kernel build error.)

Change-Id: I56fc72cd096e82c589920026553170e5cb9692eb
diff --git a/package/utils/adbd/src/adb/file_sync_service.c b/package/utils/adbd/src/adb/file_sync_service.c
old mode 100644
new mode 100755
index 436ec02..3d83eb7
--- a/package/utils/adbd/src/adb/file_sync_service.c
+++ b/package/utils/adbd/src/adb/file_sync_service.c
@@ -33,6 +33,66 @@
 #include "adb.h"
 #include "file_sync_service.h"
 
+#ifdef MBTK_ADB_SEC_SUPPORT
+static char* mbtk_sec_files[] = {"/etc/passwd", "/etc/shadow", "/bin/adb_shell", "/bin/busybox", "/usr/bin/adbd", NULL};
+
+static bool file_name_cmp(const char *name1, const char *name2) {
+    char tmp_name1[1025] = {0};
+    char tmp_name2[1025] = {0};
+    int i = 0;
+    int j = 0;
+    while(i < strlen(name1)) {
+        if(name1[i] != '/')
+            tmp_name1[j++] = name1[i];
+        i++;
+    }
+
+    i = 0;
+    j = 0;
+    while(i < strlen(name2)) {
+        if(name2[i] != '/')
+            tmp_name2[j++] = name2[i];
+        i++;
+    }
+
+    return strcmp(tmp_name1, tmp_name2);
+}
+
+static bool mbtk_sec_file_check(bool is_pull, const char *name) {
+    struct stat file_stat;
+    memset(&file_stat, 0, sizeof(struct stat));
+    if(lstat(name, &file_stat)) { // Fail.
+        D("MBTK : lstat fail : %d\n", errno);
+        if(errno == ENOENT) { // File not exist.
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    if(S_ISREG(file_stat.st_mode)) {
+        D("MBTK : FILE REG.\n");
+        char **ptr = mbtk_sec_files;
+        while(*ptr) {
+            if(file_name_cmp(*ptr, name) == 0)
+                return false;
+            ptr++;
+        }
+        return true;
+    } else if(S_ISCHR(file_stat.st_mode)
+        || S_ISBLK(file_stat.st_mode)) {
+        D("MBTK : FILE CHR/BLK.\n");
+        if(is_pull) {
+            return true;
+        } else {
+            return false;
+        }
+    } else {
+        return false;
+    }
+}
+#endif
+
 /* TODO: use fs_config to configure permissions on /data */
 static bool is_on_system(const char *name) {
     const char *SYSTEM = "/system/";
@@ -423,6 +483,10 @@
     syncmsg msg;
     char name[1025];
     unsigned namelen;
+#ifdef MBTK_ADB_SEC_SUPPORT
+    mode_t mode = 0;
+    char file_name[1025] = {0};
+#endif
 
     char *buffer = malloc(SYNC_DATA_MAX);
     if(buffer == 0) goto fail;
@@ -447,6 +511,61 @@
 
         msg.req.namelen = 0;
         D("sync: '%s' '%s'\n", (char*) &msg.req, name);
+#ifdef MBTK_ADB_SEC_SUPPORT
+        if(msg.req.id == ID_SEND) { // push
+            // '/usr/bin/adbd,33206'
+            char *ptr = strstr(name, ",");
+            if(ptr && ptr > name) {
+                struct stat file_stat;
+                mode = 0;
+                memset(file_name, 0, sizeof(file_name));
+                memcpy(file_name, name, ptr - name);
+
+                if(!mbtk_sec_file_check(false, file_name)) {
+                    break;
+                }
+
+                memset(&file_stat, 0, sizeof(struct stat));
+                if(stat(file_name, &file_stat)) { // Fail.
+                    mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH/* | S_IXOTH*/;
+                } else {
+                    if(file_stat.st_mode & S_IRUSR) {
+                        mode |= S_IRUSR;
+                    }
+                    if(file_stat.st_mode & S_IWUSR) {
+                        mode |= S_IWUSR;
+                    }
+                    if(file_stat.st_mode & S_IXUSR) {
+                        mode |= S_IXUSR;
+                    }
+                    if(file_stat.st_mode & S_IRGRP) {
+                        mode |= S_IRGRP;
+                    }
+                    if(file_stat.st_mode & S_IWGRP) {
+                        mode |= S_IWGRP;
+                    }
+                    if(file_stat.st_mode & S_IXGRP) {
+                        mode |= S_IXGRP;
+                    }
+                    if(file_stat.st_mode & S_IROTH) {
+                        mode |= S_IROTH;
+                    }
+                    if(file_stat.st_mode & S_IWOTH) {
+                        mode |= S_IWOTH;
+                    }
+                    if(file_stat.st_mode & S_IXOTH) {
+                        mode |= S_IXOTH;
+                    }
+                }
+
+                D("MBTK : %s mode is %x\n", file_name, mode);
+            }
+        } else if(msg.req.id == ID_RECV) { // pull
+            if(!mbtk_sec_file_check(true, name)) {
+                break;
+            }
+        }
+#endif
 
         switch(msg.req.id) {
         case ID_STAT:
@@ -457,6 +576,16 @@
             break;
         case ID_SEND:
             if(do_send(fd, name, buffer)) goto fail;
+#ifdef MBTK_ADB_SEC_SUPPORT
+            if(strlen(file_name) > 0) {
+                if(chmod(file_name, mode)) {
+                    D("MBTK : chmod(%s, %x) fail.\n", file_name, mode);
+                } else {
+                    D("MBTK : chmod(%s, %x) success.\n", file_name, mode);
+                    system("sync");
+                }
+            }
+#endif
             break;
         case ID_RECV:
             if(do_recv(fd, name, buffer)) goto fail;