亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ebtables.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
			   so there is no misunderstanding */			BUGPRINT("EBT_ENTRY_OR_ENTRIES shouldn't be set "			         "in distinguisher\n");			return -EINVAL;		}		/* this checks if the previous chain has as many entries		   as it said it has */		if (*n != *cnt) {			BUGPRINT("nentries does not equal the nr of entries "		                 "in the chain\n");			return -EINVAL;		}		/* before we look at the struct, be sure it is not too big */		if ((char *)hook_entries[i] + sizeof(struct ebt_entries)		   > limit) {			BUGPRINT("entries_size too small\n");			return -EINVAL;		}		if (((struct ebt_entries *)e)->policy != EBT_DROP &&		   ((struct ebt_entries *)e)->policy != EBT_ACCEPT) {			/* only RETURN from udc */			if (i != NF_BR_NUMHOOKS ||			   ((struct ebt_entries *)e)->policy != EBT_RETURN) {				BUGPRINT("bad policy\n");				return -EINVAL;			}		}		if (i == NF_BR_NUMHOOKS) /* it's a user defined chain */			(*udc_cnt)++;		else			newinfo->hook_entry[i] = (struct ebt_entries *)e;		if (((struct ebt_entries *)e)->counter_offset != *totalcnt) {			BUGPRINT("counter_offset != totalcnt");			return -EINVAL;		}		*n = ((struct ebt_entries *)e)->nentries;		*cnt = 0;		return 0;	}	/* a plain old entry, heh */	if (sizeof(struct ebt_entry) > e->watchers_offset ||	   e->watchers_offset > e->target_offset ||	   e->target_offset >= e->next_offset) {		BUGPRINT("entry offsets not in right order\n");		return -EINVAL;	}	/* this is not checked anywhere else */	if (e->next_offset - e->target_offset < sizeof(struct ebt_entry_target)) {		BUGPRINT("target size too small\n");		return -EINVAL;	}	(*cnt)++;	(*totalcnt)++;	return 0;}struct ebt_cl_stack{	struct ebt_chainstack cs;	int from;	unsigned int hookmask;};/* * we need these positions to check that the jumps to a different part of the * entries is a jump to the beginning of a new chain. */static inline intebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,   struct ebt_entries **hook_entries, unsigned int *n, unsigned int valid_hooks,   struct ebt_cl_stack *udc){	int i;	/* we're only interested in chain starts */	if (e->bitmask & EBT_ENTRY_OR_ENTRIES)		return 0;	for (i = 0; i < NF_BR_NUMHOOKS; i++) {		if ((valid_hooks & (1 << i)) == 0)			continue;		if (newinfo->hook_entry[i] == (struct ebt_entries *)e)			break;	}	/* only care about udc */	if (i != NF_BR_NUMHOOKS)		return 0;	udc[*n].cs.chaininfo = (struct ebt_entries *)e;	/* these initialisations are depended on later in check_chainloops() */	udc[*n].cs.n = 0;	udc[*n].hookmask = 0;	(*n)++;	return 0;}static inline intebt_cleanup_match(struct ebt_entry_match *m, unsigned int *i){	if (i && (*i)-- == 0)		return 1;	if (m->u.match->destroy)		m->u.match->destroy(m->data, m->match_size);	module_put(m->u.match->me);	return 0;}static inline intebt_cleanup_watcher(struct ebt_entry_watcher *w, unsigned int *i){	if (i && (*i)-- == 0)		return 1;	if (w->u.watcher->destroy)		w->u.watcher->destroy(w->data, w->watcher_size);	module_put(w->u.watcher->me);	return 0;}static inline intebt_cleanup_entry(struct ebt_entry *e, unsigned int *cnt){	struct ebt_entry_target *t;	if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)		return 0;	/* we're done */	if (cnt && (*cnt)-- == 0)		return 1;	EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, NULL);	EBT_MATCH_ITERATE(e, ebt_cleanup_match, NULL);	t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);	if (t->u.target->destroy)		t->u.target->destroy(t->data, t->target_size);	module_put(t->u.target->me);	return 0;}static inline intebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,   const char *name, unsigned int *cnt, unsigned int valid_hooks,   struct ebt_cl_stack *cl_s, unsigned int udc_cnt){	struct ebt_entry_target *t;	struct ebt_target *target;	unsigned int i, j, hook = 0, hookmask = 0;	int ret;	/* don't mess with the struct ebt_entries */	if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)		return 0;	if (e->bitmask & ~EBT_F_MASK) {		BUGPRINT("Unknown flag for bitmask\n");		return -EINVAL;	}	if (e->invflags & ~EBT_INV_MASK) {		BUGPRINT("Unknown flag for inv bitmask\n");		return -EINVAL;	}	if ( (e->bitmask & EBT_NOPROTO) && (e->bitmask & EBT_802_3) ) {		BUGPRINT("NOPROTO & 802_3 not allowed\n");		return -EINVAL;	}	/* what hook do we belong to? */	for (i = 0; i < NF_BR_NUMHOOKS; i++) {		if ((valid_hooks & (1 << i)) == 0)			continue;		if ((char *)newinfo->hook_entry[i] < (char *)e)			hook = i;		else			break;	}	/* (1 << NF_BR_NUMHOOKS) tells the check functions the rule is on	   a base chain */	if (i < NF_BR_NUMHOOKS)		hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);	else {		for (i = 0; i < udc_cnt; i++)			if ((char *)(cl_s[i].cs.chaininfo) > (char *)e)				break;		if (i == 0)			hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);		else			hookmask = cl_s[i - 1].hookmask;	}	i = 0;	ret = EBT_MATCH_ITERATE(e, ebt_check_match, e, name, hookmask, &i);	if (ret != 0)		goto cleanup_matches;	j = 0;	ret = EBT_WATCHER_ITERATE(e, ebt_check_watcher, e, name, hookmask, &j);	if (ret != 0)		goto cleanup_watchers;	t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);	target = find_target_lock(t->u.name, &ret, &ebt_mutex);	if (!target)		goto cleanup_watchers;	if (!try_module_get(target->me)) {		up(&ebt_mutex);		ret = -ENOENT;		goto cleanup_watchers;	}	up(&ebt_mutex);	t->u.target = target;	if (t->u.target == &ebt_standard_target) {		if (e->target_offset + sizeof(struct ebt_standard_target) >		   e->next_offset) {			BUGPRINT("Standard target size too big\n");			ret = -EFAULT;			goto cleanup_watchers;		}		if (((struct ebt_standard_target *)t)->verdict <		   -NUM_STANDARD_TARGETS) {			BUGPRINT("Invalid standard target\n");			ret = -EFAULT;			goto cleanup_watchers;		}	} else if ((e->target_offset + t->target_size +	   sizeof(struct ebt_entry_target) > e->next_offset) ||	   (t->u.target->check &&	   t->u.target->check(name, hookmask, e, t->data, t->target_size) != 0)){		module_put(t->u.target->me);		ret = -EFAULT;		goto cleanup_watchers;	}	(*cnt)++;	return 0;cleanup_watchers:	EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, &j);cleanup_matches:	EBT_MATCH_ITERATE(e, ebt_cleanup_match, &i);	return ret;}/* * checks for loops and sets the hook mask for udc * the hook mask for udc tells us from which base chains the udc can be * accessed. This mask is a parameter to the check() functions of the extensions */static int check_chainloops(struct ebt_entries *chain, struct ebt_cl_stack *cl_s,   unsigned int udc_cnt, unsigned int hooknr, char *base){	int i, chain_nr = -1, pos = 0, nentries = chain->nentries, verdict;	struct ebt_entry *e = (struct ebt_entry *)chain->data;	struct ebt_entry_target *t;	while (pos < nentries || chain_nr != -1) {		/* end of udc, go back one 'recursion' step */		if (pos == nentries) {			/* put back values of the time when this chain was called */			e = cl_s[chain_nr].cs.e;			if (cl_s[chain_nr].from != -1)				nentries =				cl_s[cl_s[chain_nr].from].cs.chaininfo->nentries;			else				nentries = chain->nentries;			pos = cl_s[chain_nr].cs.n;			/* make sure we won't see a loop that isn't one */			cl_s[chain_nr].cs.n = 0;			chain_nr = cl_s[chain_nr].from;			if (pos == nentries)				continue;		}		t = (struct ebt_entry_target *)		   (((char *)e) + e->target_offset);		if (strcmp(t->u.name, EBT_STANDARD_TARGET))			goto letscontinue;		if (e->target_offset + sizeof(struct ebt_standard_target) >		   e->next_offset) {			BUGPRINT("Standard target size too big\n");			return -1;		}		verdict = ((struct ebt_standard_target *)t)->verdict;		if (verdict >= 0) { /* jump to another chain */			struct ebt_entries *hlp2 =			   (struct ebt_entries *)(base + verdict);			for (i = 0; i < udc_cnt; i++)				if (hlp2 == cl_s[i].cs.chaininfo)					break;			/* bad destination or loop */			if (i == udc_cnt) {				BUGPRINT("bad destination\n");				return -1;			}			if (cl_s[i].cs.n) {				BUGPRINT("loop\n");				return -1;			}			/* this can't be 0, so the above test is correct */			cl_s[i].cs.n = pos + 1;			pos = 0;			cl_s[i].cs.e = ((void *)e + e->next_offset);			e = (struct ebt_entry *)(hlp2->data);			nentries = hlp2->nentries;			cl_s[i].from = chain_nr;			chain_nr = i;			/* this udc is accessible from the base chain for hooknr */			cl_s[i].hookmask |= (1 << hooknr);			continue;		}letscontinue:		e = (void *)e + e->next_offset;		pos++;	}	return 0;}/* do the parsing of the table/chains/entries/matches/watchers/targets, heh */static int translate_table(struct ebt_replace *repl,   struct ebt_table_info *newinfo){	unsigned int i, j, k, udc_cnt;	int ret;	struct ebt_cl_stack *cl_s = NULL; /* used in the checking for chain loops */	i = 0;	while (i < NF_BR_NUMHOOKS && !(repl->valid_hooks & (1 << i)))		i++;	if (i == NF_BR_NUMHOOKS) {		BUGPRINT("No valid hooks specified\n");		return -EINVAL;	}	if (repl->hook_entry[i] != (struct ebt_entries *)repl->entries) {		BUGPRINT("Chains don't start at beginning\n");		return -EINVAL;	}	/* make sure chains are ordered after each other in same order	   as their corresponding hooks */	for (j = i + 1; j < NF_BR_NUMHOOKS; j++) {		if (!(repl->valid_hooks & (1 << j)))			continue;		if ( repl->hook_entry[j] <= repl->hook_entry[i] ) {			BUGPRINT("Hook order must be followed\n");			return -EINVAL;		}		i = j;	}	for (i = 0; i < NF_BR_NUMHOOKS; i++)		newinfo->hook_entry[i] = NULL;	newinfo->entries_size = repl->entries_size;	newinfo->nentries = repl->nentries;	/* do some early checkings and initialize some things */	i = 0; /* holds the expected nr. of entries for the chain */	j = 0; /* holds the up to now counted entries for the chain */	k = 0; /* holds the total nr. of entries, should equal	          newinfo->nentries afterwards */	udc_cnt = 0; /* will hold the nr. of user defined chains (udc) */	ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,	   ebt_check_entry_size_and_hooks, newinfo, repl->entries,	   repl->entries + repl->entries_size, repl->hook_entry, &i, &j, &k,	   &udc_cnt, repl->valid_hooks);	if (ret != 0)		return ret;	if (i != j) {		BUGPRINT("nentries does not equal the nr of entries in the "		         "(last) chain\n");		return -EINVAL;	}	if (k != newinfo->nentries) {		BUGPRINT("Total nentries is wrong\n");		return -EINVAL;	}	/* check if all valid hooks have a chain */	for (i = 0; i < NF_BR_NUMHOOKS; i++) {		if (newinfo->hook_entry[i] == NULL &&		   (repl->valid_hooks & (1 << i))) {			BUGPRINT("Valid hook without chain\n");			return -EINVAL;		}	}	/* get the location of the udc, put them in an array	   while we're at it, allocate the chainstack */	if (udc_cnt) {		/* this will get free'd in do_replace()/ebt_register_table()		   if an error occurs */		newinfo->chainstack = (struct ebt_chainstack **)		   vmalloc(NR_CPUS * sizeof(struct ebt_chainstack));		if (!newinfo->chainstack)			return -ENOMEM;		for (i = 0; i < NR_CPUS; i++) {			newinfo->chainstack[i] =			   vmalloc(udc_cnt * sizeof(struct ebt_chainstack));			if (!newinfo->chainstack[i]) {				while (i)					vfree(newinfo->chainstack[--i]);				vfree(newinfo->chainstack);				newinfo->chainstack = NULL;				return -ENOMEM;			}		}		cl_s = (struct ebt_cl_stack *)		   vmalloc(udc_cnt * sizeof(struct ebt_cl_stack));		if (!cl_s)			return -ENOMEM;		i = 0; /* the i'th udc */		EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,		   ebt_get_udc_positions, newinfo, repl->hook_entry, &i,		   repl->valid_hooks, cl_s);		/* sanity check */		if (i != udc_cnt) {			BUGPRINT("i != udc_cnt\n");			vfree(cl_s);			return -EFAULT;		}	}	/* Check for loops */	for (i = 0; i < NF_BR_NUMHOOKS; i++)		if (repl->valid_hooks & (1 << i))			if (check_chainloops(newinfo->hook_entry[i],			   cl_s, udc_cnt, i, newinfo->entries)) {				if (cl_s)					vfree(cl_s);				return -EINVAL;			}	/* we now know the following (along with E=mc

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲天堂2016| 洋洋成人永久网站入口| 另类中文字幕网| 日韩欧美一卡二卡| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品一二三四五| 欧美精品一区男女天堂| 国产 日韩 欧美大片| 自拍偷自拍亚洲精品播放| 色综合久久中文字幕综合网| 亚洲午夜精品久久久久久久久| 欧美中文字幕一区| 污片在线观看一区二区| 精品99999| 不卡欧美aaaaa| 亚洲电影激情视频网站| 日韩欧美一区在线| 丰满少妇久久久久久久| 一区二区三区产品免费精品久久75| 欧美日韩国产首页| 国产真实乱子伦精品视频| 国产精品亲子乱子伦xxxx裸| 在线亚洲人成电影网站色www| 偷拍一区二区三区| 亚洲国产高清在线观看视频| 欧美在线高清视频| 国产一区中文字幕| 亚洲精品国产视频| 精品理论电影在线观看| 不卡影院免费观看| 日本亚洲三级在线| 亚洲私人黄色宅男| 精品日产卡一卡二卡麻豆| eeuss国产一区二区三区| 婷婷久久综合九色综合绿巨人| 久久久久高清精品| 欧美乱妇20p| jlzzjlzz国产精品久久| 麻豆国产精品一区二区三区| 亚洲乱码中文字幕| 精品国产髙清在线看国产毛片| 99国产欧美另类久久久精品| 久久不见久久见免费视频7| 亚洲免费资源在线播放| 久久久精品2019中文字幕之3| 欧美亚洲一区二区在线| 国产成人av电影在线| 青娱乐精品在线视频| 亚洲精品日产精品乱码不卡| 久久先锋资源网| 欧美日韩在线三级| 色系网站成人免费| 国产成人综合视频| 久久成人麻豆午夜电影| 午夜欧美在线一二页| 亚洲天堂网中文字| 中文字幕国产精品一区二区| 精品国产乱码久久久久久图片| 欧美日韩一卡二卡| 精品少妇一区二区三区在线视频| 91黄色免费网站| 不卡欧美aaaaa| 成人少妇影院yyyy| 国产精品亚洲成人| 久久成人麻豆午夜电影| 日韩成人av影视| 亚洲五月六月丁香激情| 亚洲美女屁股眼交| 亚洲美女视频在线观看| 中文字幕一区三区| 中文字幕在线观看一区| 中文字幕不卡在线播放| 国产三级精品在线| 国产亚洲精品中文字幕| 久久美女艺术照精彩视频福利播放 | 666欧美在线视频| 欧美三级乱人伦电影| 欧美午夜在线一二页| 欧美亚洲综合网| 欧美在线色视频| 欧美日韩一二三区| 欧美日韩在线精品一区二区三区激情| 色婷婷亚洲婷婷| 欧美在线一区二区三区| 欧美日韩国产一二三| 在线综合+亚洲+欧美中文字幕| 91精品综合久久久久久| 欧美v亚洲v综合ⅴ国产v| 精品国产三级a在线观看| 久久色在线视频| 国产精品久久久久久一区二区三区 | 国产美女一区二区三区| 国产在线精品免费| 东方aⅴ免费观看久久av| 成人免费看视频| 色狠狠色噜噜噜综合网| 欧美日韩一区成人| 精品国产乱码91久久久久久网站| 久久久久国产精品厨房| 一色屋精品亚洲香蕉网站| 亚洲乱码国产乱码精品精98午夜| 亚洲一区二区视频在线观看| 亚洲h动漫在线| 久久超碰97中文字幕| 99精品黄色片免费大全| 欧美老人xxxx18| www欧美成人18+| 亚洲精品第1页| 蜜臀精品一区二区三区在线观看| 高清不卡一区二区在线| 色婷婷av一区二区| 日韩一二三区视频| 中文字幕乱码日本亚洲一区二区| 亚洲一区在线视频| 国产一本一道久久香蕉| 在线免费观看成人短视频| 精品久久久影院| 亚洲视频 欧洲视频| 老司机一区二区| 91网站在线观看视频| 日韩欧美高清在线| 日韩美女视频一区| 久久精品噜噜噜成人av农村| 成人av中文字幕| 亚洲欧洲av一区二区三区久久| 丝袜亚洲另类欧美| 成人激情av网| 日韩你懂的在线观看| 亚洲精品老司机| 国产精品一区免费视频| 欧美老肥妇做.爰bbww| 国产精品国产三级国产aⅴ中文| 日产国产欧美视频一区精品| 成人h动漫精品一区二区| 欧美一区二区三区视频| 亚洲激情校园春色| 国产剧情一区二区三区| 69av一区二区三区| 亚洲一二三专区| 成人免费不卡视频| 精品国产伦理网| 免费看欧美女人艹b| 在线欧美一区二区| 日韩一区在线免费观看| 国产suv精品一区二区三区| 日韩欧美国产综合| 日韩 欧美一区二区三区| 欧美性生活大片视频| 亚洲婷婷国产精品电影人久久| 国产激情91久久精品导航 | 国产精品国产a| 精品在线播放免费| 3d成人动漫网站| 香蕉久久夜色精品国产使用方法 | 777色狠狠一区二区三区| 亚洲免费视频成人| 91黄视频在线| 一区二区三区国产| 欧美日韩专区在线| 成人免费福利片| 欧美经典一区二区三区| 福利电影一区二区| 久久精品视频免费观看| 成人一区二区三区| 国产精品理伦片| 91色porny在线视频| 国产精品精品国产色婷婷| 国产69精品久久777的优势| 日本一区二区三区国色天香| 国产精品18久久久| 亚洲国产岛国毛片在线| 91啪亚洲精品| 综合激情网...| 欧美体内she精高潮| 亚洲va天堂va国产va久| 欧美一区午夜精品| 国产精品综合在线视频| 国产精品色噜噜| 91精品福利视频| 日本美女一区二区三区| 精品久久久三级丝袜| 国产成人高清在线| 日韩一区在线播放| 欧美精品自拍偷拍| 久久se精品一区二区| 欧美韩国日本综合| 欧美无人高清视频在线观看| 日韩不卡在线观看日韩不卡视频| xf在线a精品一区二区视频网站| 懂色av噜噜一区二区三区av| 亚洲色图欧洲色图婷婷| 欧美日韩国产高清一区| 狠狠色综合日日| 9久草视频在线视频精品| 亚洲高清免费在线| 日韩欧美国产三级| 91亚洲国产成人精品一区二区三| 午夜精品123| 国产三级精品三级| 欧美日韩免费一区二区三区|