diff --git a/tools/acrn-crashlog/acrnprobe/android_events.c b/tools/acrn-crashlog/acrnprobe/android_events.c index 7750ba8bd..47c13db96 100644 --- a/tools/acrn-crashlog/acrnprobe/android_events.c +++ b/tools/acrn-crashlog/acrnprobe/android_events.c @@ -72,7 +72,7 @@ static char *next_vm_event(const char *cursor, const char *data, size_t dlen, const struct vm_t *vm) { char *line_to_sync = (char *)~(0); - char *syncevent; + const char *syncevent; int id; if (!cursor || !vm) @@ -408,7 +408,7 @@ static void sync_lines_stage2(const struct sender_t *sender, continue; } - vm = get_vm_by_name(vm_name); + vm = get_vm_by_name((const char *)vm_name); if (!vm || !vm->history_data) continue; diff --git a/tools/acrn-crashlog/acrnprobe/channels.c b/tools/acrn-crashlog/acrnprobe/channels.c index 8599d04f1..be64c7b31 100644 --- a/tools/acrn-crashlog/acrnprobe/channels.c +++ b/tools/acrn-crashlog/acrnprobe/channels.c @@ -60,8 +60,8 @@ static struct channel_t channels[] = { * or NULL on error. */ static struct event_t *create_event(enum event_type_t event_type, - char *channel, void *private, - int watchfd, char *path) + const char *channel, void *private, + int watchfd, const char *path) { struct event_t *e; int path_len = 0; diff --git a/tools/acrn-crashlog/acrnprobe/crash_reclassify.c b/tools/acrn-crashlog/acrnprobe/crash_reclassify.c index 8c8aa8dbe..c66d0a702 100644 --- a/tools/acrn-crashlog/acrnprobe/crash_reclassify.c +++ b/tools/acrn-crashlog/acrnprobe/crash_reclassify.c @@ -84,7 +84,7 @@ static int crash_has_mightcontents(const struct crash_t *crash, int ret = 1; int ret_exp; int expid, cntid; - char * const *exp; + const char * const *exp; const char *content; for_each_expression_crash(expid, exp, crash) { @@ -128,7 +128,7 @@ static int crash_match_content(const struct crash_t *crash, const char *file) static int _get_data(const char *file, const struct crash_t *crash, char **data, const int index) { - char *search_key; + const char *search_key; char *value; char *end; int size; diff --git a/tools/acrn-crashlog/acrnprobe/history.c b/tools/acrn-crashlog/acrnprobe/history.c index 0cf9806e2..cf9e918f8 100644 --- a/tools/acrn-crashlog/acrnprobe/history.c +++ b/tools/acrn-crashlog/acrnprobe/history.c @@ -40,12 +40,12 @@ "#EVENT ID DATE TYPE\n" struct history_entry { - char *event; - char *type; - char *log; + const char *event; + const char *type; + const char *log; const char *lastuptime; /* for uptime */ - char *key; - char *eventtime; + const char *key; + const char *eventtime; }; char *history_file; @@ -115,8 +115,8 @@ free: free(des); } -void hist_raise_event(char *event, char *type, char *log, char *lastuptime, - char *key) +void hist_raise_event(const char *event, const char *type, const char *log, + const char *lastuptime, const char *key) { char line[MAXLINESIZE]; char eventtime[LONG_TIME_SIZE]; diff --git a/tools/acrn-crashlog/acrnprobe/include/event_queue.h b/tools/acrn-crashlog/acrnprobe/include/event_queue.h index 512668855..617f76e2b 100644 --- a/tools/acrn-crashlog/acrnprobe/include/event_queue.h +++ b/tools/acrn-crashlog/acrnprobe/include/event_queue.h @@ -22,7 +22,7 @@ __extension__ struct event_t { int watchfd; enum event_type_t event_type; - char *channel; + const char *channel; void *private; TAILQ_ENTRY(event_t) entries; diff --git a/tools/acrn-crashlog/acrnprobe/include/history.h b/tools/acrn-crashlog/acrnprobe/include/history.h index 4e175f354..02a59bf8b 100644 --- a/tools/acrn-crashlog/acrnprobe/include/history.h +++ b/tools/acrn-crashlog/acrnprobe/include/history.h @@ -29,7 +29,7 @@ extern char *history_file; int prepare_history(void); void hist_raise_infoerror(char *type); void hist_raise_uptime(char *lastuptime); -void hist_raise_event(char *event, char *type, char *log, char *lastuptime, - char *key); +void hist_raise_event(const char *event, const char *type, const char *log, + const char *lastuptime, const char *key); #endif diff --git a/tools/acrn-crashlog/acrnprobe/include/load_conf.h b/tools/acrn-crashlog/acrnprobe/include/load_conf.h index a88889c60..24dee37c4 100644 --- a/tools/acrn-crashlog/acrnprobe/include/load_conf.h +++ b/tools/acrn-crashlog/acrnprobe/include/load_conf.h @@ -8,7 +8,6 @@ #include #include -#include #include #include "event_queue.h" #include "probeutils.h" @@ -25,43 +24,60 @@ #define VM_EVENT_TYPE_MAX 20 struct trigger_t { - char *name; - char *type; - char *path; + const char *name; + size_t name_len; + const char *type; + size_t type_len; + const char *path; + size_t path_len; }; struct vm_t { - char *name; - char *channel; - char *interval; - char *syncevent[VM_EVENT_TYPE_MAX]; + const char *name; + size_t name_len; + const char *channel; + size_t channel_len; + const char *interval; + size_t interval_len; + const char *syncevent[VM_EVENT_TYPE_MAX]; + size_t syncevent_len[VM_EVENT_TYPE_MAX]; - ext2_filsys datafs; - unsigned long history_size[SENDER_MAX]; - char *history_data; - char last_synced_line_key[SENDER_MAX][SHORT_KEY_LENGTH + 1]; + ext2_filsys datafs; + unsigned long history_size[SENDER_MAX]; + char *history_data; + char last_synced_line_key[SENDER_MAX][SHORT_KEY_LENGTH + 1]; }; struct log_t { - char *name; - char *type; - char *path; - char *lines; + const char *name; + size_t name_len; + const char *type; + size_t type_len; + const char *path; + size_t path_len; + const char *lines; + size_t lines_len; void (*get)(struct log_t *, void *); }; struct crash_t { - char *name; - char *channel; - char *interval; + const char *name; + size_t name_len; + const char *channel; + size_t channel_len; + const char *interval; + size_t interval_len; struct trigger_t *trigger; - char *content[CONTENT_MAX]; - char *mightcontent[EXPRESSION_MAX][CONTENT_MAX]; - struct log_t *log[LOG_MAX]; - char *data[DATA_MAX]; + const char *content[CONTENT_MAX]; + size_t content_len[CONTENT_MAX]; + const char *mightcontent[EXPRESSION_MAX][CONTENT_MAX]; + size_t mightcontent_len[EXPRESSION_MAX][CONTENT_MAX]; + struct log_t *log[LOG_MAX]; + const char *data[DATA_MAX]; + size_t data_len[DATA_MAX]; - struct crash_t *parents; + struct crash_t *parents; TAILQ_ENTRY(crash_t) entries; TAILQ_HEAD(, crash_t) children; @@ -73,42 +89,53 @@ struct crash_t { }; struct info_t { - char *name; - char *channel; - char *interval; + const char *name; + size_t name_len; + const char *channel; + size_t channel_len; + const char *interval; + size_t interval_len; struct trigger_t *trigger; - struct log_t *log[LOG_MAX]; + struct log_t *log[LOG_MAX]; }; struct uptime_t { - char *name; - char *frequency; - char *eventhours; + const char *name; + size_t name_len; + const char *frequency; + size_t frequency_len; + const char *eventhours; + size_t eventhours_len; int wd; char *path; }; struct sender_t { - char *name; - char *outdir; - char *maxcrashdirs; - char *maxlines; - char *spacequota; + const char *name; + size_t name_len; + const char *outdir; + size_t outdir_len; + const char *maxcrashdirs; + size_t maxcrashdirs_len; + const char *maxlines; + size_t maxlines_len; + const char *spacequota; + size_t spacequota_len; struct uptime_t *uptime; void (*send)(struct event_t *); - char *log_vmrecordid; - int sw_updated; /* each sender has their own record */ + char *log_vmrecordid; + int sw_updated; /* each sender has their own record */ }; struct conf_t { struct sender_t *sender[SENDER_MAX]; - struct vm_t *vm[VM_MAX]; + struct vm_t *vm[VM_MAX]; struct trigger_t *trigger[TRIGGER_MAX]; - struct log_t *log[LOG_MAX]; - struct crash_t *crash[CRASH_MAX]; - struct info_t *info[INFO_MAX]; + struct log_t *log[LOG_MAX]; + struct crash_t *crash[CRASH_MAX]; + struct info_t *info[INFO_MAX]; }; struct conf_t conf; @@ -168,7 +195,7 @@ struct conf_t conf; ({ \ int _ret = 0; \ int _id; \ - char *content; \ + const char *content; \ for_each_content_expression(_id, content, exp) { \ if (content) \ _ret = 1; \ @@ -204,11 +231,11 @@ struct conf_t conf; ) int load_conf(const char *path); -struct trigger_t *get_trigger_by_name(char *name); -struct log_t *get_log_by_name(char *name); +struct trigger_t *get_trigger_by_name(const char *name); +struct log_t *get_log_by_name(const char *name); struct vm_t *get_vm_by_name(const char *name); int sender_id(const struct sender_t *sender); -struct sender_t *get_sender_by_name(char *name); +struct sender_t *get_sender_by_name(const char *name); enum event_type_t get_conf_by_wd(int wd, void **private); struct crash_t *get_crash_by_wd(int wd); int crash_depth(struct crash_t *tcrash); diff --git a/tools/acrn-crashlog/acrnprobe/include/probeutils.h b/tools/acrn-crashlog/acrnprobe/include/probeutils.h index eba6eb6d2..45530190e 100644 --- a/tools/acrn-crashlog/acrnprobe/include/probeutils.h +++ b/tools/acrn-crashlog/acrnprobe/include/probeutils.h @@ -43,9 +43,9 @@ int get_current_time_long(char buf[32]); unsigned long long get_uptime(void); char *generate_event_id(const char *seed1, const char *seed2, enum key_type type); -void generate_crashfile(char *dir, char *event, char *hashkey, - char *type, char *data0, - char *data1, char *data2); +void generate_crashfile(const char *dir, const char *event, const char *hashkey, + const char *type, const char *data0, + const char *data1, const char *data2); char *generate_log_dir(enum e_dir_mode mode, char *hashkey); int is_boot_id_changed(void); diff --git a/tools/acrn-crashlog/acrnprobe/load_conf.c b/tools/acrn-crashlog/acrnprobe/load_conf.c index dad45cb78..9060c6d46 100644 --- a/tools/acrn-crashlog/acrnprobe/load_conf.c +++ b/tools/acrn-crashlog/acrnprobe/load_conf.c @@ -9,6 +9,7 @@ #include "load_conf.h" #include "event_queue.h" #include "log_sys.h" +#include "strutils.h" static void print(void) { @@ -21,7 +22,6 @@ static void print(void) struct info_t *info; struct crash_t *crash; struct crash_t *crash_tmp; - char buf[512]; #define print_id_item(item, root, id) \ LOGD("%-8s(%d): %-15s:(%s)\n", #root, id, #item, root->item) @@ -90,17 +90,36 @@ static void print(void) } for_each_crash(id, crash, conf) { + char buf[512]; + char *tail; + int len; + if (!crash) continue; print_id_item(name, crash, id); - memset(buf, 0, sizeof(*buf)); + memset(buf, 0, sizeof(buf)); LOGD("%-8s(%d): properties: %s, %s\n", "crash", id, is_root_crash(crash) ? "root" : "non-root", is_leaf_crash(crash) ? "leaf" : "non-leaf"); - sprintf(buf + strlen(buf), "%-8s(%d): children: ", "crash", id); - for_crash_children(crash_tmp, crash) - sprintf(buf + strlen(buf), "%s ", crash_tmp->name); + len = snprintf(buf, sizeof(buf), "%-8s(%d): children: ", + "crash", id); + if (s_not_expect(len, sizeof(buf))) { + LOGE("failed to construct the children of crash\n"); + continue; + } + tail = buf + len; + for_crash_children(crash_tmp, crash) { + if (len + crash_tmp->name_len + 2 >= sizeof(buf)) { + LOGE("names of children too long - truncate\n"); + break;; + } + tail = mempcpy(tail, crash_tmp->name, + crash_tmp->name_len); + *tail++ = ' '; + len += crash_tmp->name_len + 1; + } + *tail = '\0'; LOGD("%s\n", buf); print_id_item(trigger->name, crash, id); print_id_item(channel, crash, id); @@ -173,7 +192,8 @@ static int get_expid_index(xmlNodePtr cur, const int max) int _ret = -1; \ load##mem = xmlNodeGetContent(cur); \ if (load##mem) { \ - type->mem = (char *)load##mem; \ + type->mem = (const char *)load##mem; \ + type->mem##_len = xmlStrlen(load##mem); \ _ret = 0; \ } \ _ret; \ @@ -190,7 +210,8 @@ static int get_expid_index(xmlNodePtr cur, const int max) if (load##mem) { \ index = get_id_index(cur, max); \ if (index != -1) { \ - type->mem[index] = (char *)load##mem; \ + type->mem[index] = (const char *)load##mem; \ + type->mem##_len[index] = xmlStrlen(load##mem); \ _ret = 0; \ } \ } \ @@ -201,9 +222,15 @@ static int get_expid_index(xmlNodePtr cur, const int max) #define load_trigger(cur, event) \ (__extension__ \ ({ \ + int _ret = -1; \ xmlChar *content = xmlNodeGetContent(cur); \ - event->trigger = get_trigger_by_name((char *)content); \ - xmlFree(content); \ + if (content) { \ + event->trigger = \ + get_trigger_by_name((const char *)content); \ + xmlFree(content); \ + _ret = 0; \ + } \ + _ret; \ }) \ ) @@ -276,7 +303,7 @@ int sender_id(const struct sender_t *s) return -1; } -struct sender_t *get_sender_by_name(char *name) +struct sender_t *get_sender_by_name(const char *name) { int id; struct sender_t *sender; @@ -291,7 +318,7 @@ struct sender_t *get_sender_by_name(char *name) return NULL; } -struct trigger_t *get_trigger_by_name(char *name) +struct trigger_t *get_trigger_by_name(const char *name) { int id; struct trigger_t *trigger; @@ -305,7 +332,7 @@ struct trigger_t *get_trigger_by_name(char *name) return NULL; } -struct log_t *get_log_by_name(char *name) +struct log_t *get_log_by_name(const char *name) { int id; struct log_t *log; @@ -388,7 +415,9 @@ static int parse_info(xmlNodePtr cur, struct info_t *info) if (id == -1) return -1; content = xmlNodeGetContent(cur); - info->log[id] = get_log_by_name((char *)content); + if (!content) + return -1; + info->log[id] = get_log_by_name((const char *)content); xmlFree(content); } @@ -450,7 +479,9 @@ static int parse_crash(xmlNodePtr cur, struct crash_t *crash) return -1; content = xmlNodeGetContent(cur); - crash->log[id] = get_log_by_name((char *)content); + if (!content) + return -1; + crash->log[id] = get_log_by_name((const char *)content); xmlFree(content); } else if (name_is(cur, "data")) res = load_cur_content_with_id(cur, crash, @@ -462,7 +493,10 @@ static int parse_crash(xmlNodePtr cur, struct crash_t *crash) return -1; content = xmlNodeGetContent(cur); - crash->mightcontent[expid][id] = (char *)content; + if (!content) + return -1; + crash->mightcontent[expid][id] = (const char *)content; + crash->mightcontent_len[expid][id] = xmlStrlen(content); } if (res) diff --git a/tools/acrn-crashlog/acrnprobe/probeutils.c b/tools/acrn-crashlog/acrnprobe/probeutils.c index 040228211..1839bf762 100644 --- a/tools/acrn-crashlog/acrnprobe/probeutils.c +++ b/tools/acrn-crashlog/acrnprobe/probeutils.c @@ -206,7 +206,7 @@ static int reserve_log_folder(enum e_dir_mode mode, char *dir, int plen; int dlen; struct sender_t *crashlog; - char *outdir; + const char *outdir; unsigned int maxdirs; crashlog = get_sender_by_name("crashlog"); @@ -273,9 +273,9 @@ static int reserve_log_folder(enum e_dir_mode mode, char *dir, * @param type Subtype of this event. * @param data* String obtained by get_data. */ -void generate_crashfile(char *dir, char *event, char *hashkey, - char *type, char *data0, - char *data1, char *data2) +void generate_crashfile(const char *dir, const char *event, const char *hashkey, + const char *type, const char *data0, + const char *data1, const char *data2) { char *buf; char *path; diff --git a/tools/acrn-crashlog/common/fsutils.c b/tools/acrn-crashlog/common/fsutils.c index ddb31d36d..863027fe2 100644 --- a/tools/acrn-crashlog/common/fsutils.c +++ b/tools/acrn-crashlog/common/fsutils.c @@ -72,7 +72,7 @@ static int close_file(const char *filename, FILE *fp) * * @return 0 if successful, or a negative errno-style value if not. */ -int mkdir_p(char *path) +int mkdir_p(const char *path) { if (!path) return -EINVAL; @@ -621,7 +621,7 @@ int do_copy_eof(const char *src, const char *des) * @return 1 if the percentage of using space is lower than the specified quota. * or 0 if not. */ -int space_available(char *path, int quota) +int space_available(const char *path, int quota) { struct statfs diskInfo; unsigned long long totalBlocks; @@ -1070,7 +1070,8 @@ free: * * @return the count of searched files on success, or -1 on error. */ -int find_file(char *dir, char *target_file, int depth, char *path[], int limit) +int find_file(const char *dir, char *target_file, int depth, char *path[], + int limit) { int i, ret; int count = 0; diff --git a/tools/acrn-crashlog/common/include/fsutils.h b/tools/acrn-crashlog/common/include/fsutils.h index c5ba5fa71..d0f676a2f 100644 --- a/tools/acrn-crashlog/common/include/fsutils.h +++ b/tools/acrn-crashlog/common/include/fsutils.h @@ -71,7 +71,7 @@ static inline int get_file_size(const char *filepath) } char *mm_get_line(struct mm_file_t *mfile, int line); -int mkdir_p(char *path); +int mkdir_p(const char *path); int mm_count_lines(struct mm_file_t *mfile); struct mm_file_t *mmap_file(const char *path); void unmap_file(struct mm_file_t *mfile); @@ -89,7 +89,7 @@ int file_read_int(const char *filename, unsigned int *pcurrent); int file_update_int(const char *filename, unsigned int current, unsigned int max); int do_copy_eof(const char *src, const char *des); -int space_available(char *path, int quota); +int space_available(const char *path, int quota); int count_lines_in_file(const char *filename); int read_full_binary_file(const char *path, unsigned long *size, void **data); @@ -108,7 +108,8 @@ int filter_filename_startswith(const struct dirent *entry, const void *arg); int dir_contains(const char *dir, const char *filename, int exact); int lsdir(const char *dir, char *fullname[], int limit); -int find_file(char *dir, char *target_file, int depth, char *path[], int limit); +int find_file(const char *dir, char *target_file, int depth, char *path[], + int limit); int read_file(const char *path, unsigned long *size, void **data); int is_ac_filefmt(const char *file_fmt); int config_fmt_to_files(const char *file_fmt, char ***out);