修复漏洞。

This commit is contained in:
Saturneic 2018-06-09 15:57:19 +08:00
parent 7fca55bf3e
commit 66b3ab551f
3 changed files with 94 additions and 21 deletions

View File

@ -25,8 +25,7 @@ int main(int argc, char **argv){
int *f_i = (int *)malloc(sizeof(int)); int *f_i = (int *)malloc(sizeof(int));
*f_i = 3; *f_i = 3;
char *f_s = "there"; //releaseMalloc();
Node *f_node = findByValue(t_list,"int",(void *)f_i);
releaseAll(); releaseAll();
return 0; return 0;

View File

@ -7,23 +7,28 @@
#define LIST_H #define LIST_H
typedef struct Node{ typedef struct Node{
unsigned long long id; unsigned long long id;//唯一标识符
void *value; void *value;
int if_setvalue; int if_setvalue;//记录是否已经初始化值
const char *type; const char *type;//记录值的类型
struct Node *next; struct Node *next;
struct Node *last; struct Node *last;
}Node; }Node;
typedef struct List{ typedef struct List{
unsigned long long id;//唯一标识符
Node *head; Node *head;
Node *tail; Node *tail;
unsigned long long length; unsigned long long length;//链表长度
}List; }List;
int safeMode(int ifon);//Safe mode is used to make sure that all malloced will be freed. int safeMode(int ifon);//安全模式确保显式声明过的内存都会被释放
int releaseAll(void); int releaseMalloc(void);//释放所有声明过的内存
int releaseSingleList(List *p_list);
int releaseSingleNode(List *p_list);
int releaseAll(void);//安全模式最后调用的函数
List *init_list(void); List *init_list(void);
Node *init_node(void); Node *init_node(void);
int init_value(Node *,const char *,void *); int init_value(Node *,const char *,void *);
@ -44,23 +49,32 @@ unsigned long long len(List *p_list);
Node *findById(List *p_list, const unsigned long long id); Node *findById(List *p_list, const unsigned long long id);
Node *findByValue(List *p_list, const char *type, const void *value); Node *findByValue(List *p_list, const char *type, const void *value);
List *mply_findByValue(List *p_list, const char *type, const void *value); List *mply_findByValue(List *p_list, const char *type, const void *value);//寻找多个值匹配的节点
int releaseList(List *p_list); int releaseList(List *p_list);
int releaseNode(Node *p_node); int releaseNode(Node *p_node);
int isListEmpty(List *p_list); int isListEmpty(List *p_list);
/*Something about safe mode*/ /*有关安全模式的变量*/
int if_safeMode = 0; int if_safeMode = 0;
List *node_list = NULL; //Store nodes which haven't been freed. List *node_list = NULL; //储存声明过的节点.
List *list_list = NULL; //Store lists which haven't been freed. List *list_list = NULL; //储存声明过的链表.
int safeMode(int ifon){ int safeMode(int ifon){
if(ifon == 1){ if(ifon == 1){
if (node_list == NULL && list_list == NULL){ if (node_list == NULL && list_list == NULL){
node_list = (List *)malloc(sizeof(List)); node_list = (List *)malloc(sizeof(List));
list_list = (List *)malloc(sizeof(List)); list_list = (List *)malloc(sizeof(List));
list_list->head = NULL;
list_list->length = 0;
list_list->tail = NULL;
node_list->head = NULL;
node_list->length = 0;
node_list->tail = NULL;
if_safeMode = 1; if_safeMode = 1;
} }
else{ else{
@ -71,11 +85,53 @@ int safeMode(int ifon){
return ifon; return ifon;
} }
int releaseSingleList(List *p_list){
Node *p_node = p_list->head;
List *plv_node = NULL;
while(p_node != NULL){
plv_node = (List *)p_node->value;
plv_node->id = 0;
plv_node->head = NULL;
plv_node->length = 0;
plv_node->tail = NULL;
free(plv_node);
p_node = p_node->next;
}
p_list->head = NULL;
p_list->length = 0;
p_list->tail = NULL;
p_list->id = 0;
free(p_list);
return 0;
}
int releaseSingleNode(List *p_list){
Node *p_node = p_list->head;
Node *pnv_node = NULL;
while(p_node != NULL){
pnv_node = (Node *)p_node->value;
pnv_node->id = 0;
pnv_node->if_setvalue = 0;
pnv_node->last = NULL;
pnv_node->next = NULL;
pnv_node->type = NULL;
pnv_node->value = NULL;
free(pnv_node);
p_node = p_node->next;
}
p_list->id = 0;
p_list->head = NULL;
p_list->length = 0;
p_list->tail = NULL;
free(p_list);
return 0;
}
int releaseAll(void){ int releaseAll(void){
if(if_safeMode == 1){ if(if_safeMode == 1){
if_safeMode = 0; if_safeMode = 0;
releaseList(node_list); releaseList(node_list);
releaseList(list_list); releaseSingleList(list_list);
} }
return 0; return 0;
} }
@ -84,16 +140,28 @@ Node *init_node(void){
Node *p_node = (Node *) malloc(sizeof(Node)); Node *p_node = (Node *) malloc(sizeof(Node));
p_node->id = getId(); p_node->id = getId();
p_node->if_setvalue = 0; p_node->if_setvalue = 0;
if(if_safeMode) insertInTail(node_list,p_node); p_node->next = NULL;
p_node->last = NULL;
if(if_safeMode) {
if_safeMode = 0;
Node *prec_node = init_node();
if_safeMode = 1;
init_value(prec_node, "pointer", (void *)p_node);
insertInTail(node_list,prec_node);
}
return p_node; return p_node;
} }
List *init_list(void){ List *init_list(void){
List *p_list = (List *) malloc(sizeof(List)); List *p_list = (List *) malloc(sizeof(List));
p_list->id = getId();
p_list->head = NULL; p_list->head = NULL;
p_list->tail = NULL; p_list->tail = NULL;
p_list->length = 0;
if(if_safeMode){ if(if_safeMode){
if_safeMode = 0;
Node *p_node = init_node(); Node *p_node = init_node();
if_safeMode = 1;
init_value(p_node,"pointer",(void *)p_list); init_value(p_node,"pointer",(void *)p_list);
insertInTail(list_list,p_node); insertInTail(list_list,p_node);
} }
@ -161,10 +229,16 @@ int releaseNode(Node *p_node){
} }
p_node->last = NULL; p_node->last = NULL;
p_node->next = NULL; p_node->next = NULL;
p_node->type = NULL;
p_node->value = NULL;
p_node->id = 0;
p_node->if_setvalue = 0;
free(p_node); free(p_node);
return 0; return 0;
} }
int releaseList(List *p_list){ int releaseList(List *p_list){
Node *p_node, *pl_node; Node *p_node, *pl_node;
p_node = p_list->head; p_node = p_list->head;
@ -182,6 +256,7 @@ int releaseList(List *p_list){
p_list->head = NULL; p_list->head = NULL;
p_list->tail = NULL; p_list->tail = NULL;
p_list->length = 0; p_list->length = 0;
p_list->id = 0;
free(p_list); free(p_list);
return 0; return 0;
} }
@ -198,7 +273,7 @@ int removeById(List *p_list, unsigned long id){
if(tmp->id == id) { if(tmp->id == id) {
tmp->last->next = tmp->next; tmp->last->next = tmp->next;
tmp->next->last = tmp->last; tmp->next->last = tmp->last;
//releaseNode(tmp); not necessary //releaseNode(tmp); 在安全模式下不必要
p_list->length -= 1; p_list->length -= 1;
return 1;//found return 1;//found
} }
@ -218,7 +293,7 @@ int removeByNode(List *p_list, Node *p_node){
if(tmp == p_node){ if(tmp == p_node){
tmp->last->next = tmp->next; tmp->last->next = tmp->next;
tmp->next->last = tmp->last; tmp->next->last = tmp->last;
//releaseNode(tmp); not necessary //releaseNode(tmp); 在安全模式下不必要
p_list->length -= 1; p_list->length -= 1;
return 1;//found return 1;//found
} }
@ -266,9 +341,7 @@ int popFromTail(List *p_list){
return 0; return 0;
} }
/*The method in this function won't be better than going through the list /*该函数算法需要改进*/
* node by node.The worst situation happens when the matched node is in
* the middle of the list.*/
Node *findById(List *p_list, const unsigned long long id){ Node *findById(List *p_list, const unsigned long long id){
Node *ph_node = p_list->head; Node *ph_node = p_list->head;
Node *pt_node = p_list->tail; Node *pt_node = p_list->tail;
@ -295,6 +368,7 @@ Node *findById(List *p_list, const unsigned long long id){
return NULL; return NULL;
} }
Node *findByValue(List *p_list, const char *type, const void *value){ Node *findByValue(List *p_list, const char *type, const void *value){
Node *p_node = p_list->head; Node *p_node = p_list->head;
while(p_node != NULL){ while(p_node != NULL){