オープンソース・ソフトウェアの開発とダウンロード

Subversion リポジトリの参照

Diff of /branches/ccs-patch/security/ccsecurity/network.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 722 by kumaneko, Thu Nov 22 04:09:54 2007 UTC revision 731 by kumaneko, Tue Nov 27 04:48:59 2007 UTC
# Line 5  Line 5 
5   *   *
6   * Copyright (C) 2005-2007  NTT DATA CORPORATION   * Copyright (C) 2005-2007  NTT DATA CORPORATION
7   *   *
8   * Version: 1.5.2-pre   2007/11/19   * Version: 1.5.2-pre   2007/11/27
9   *   *
10   * This file is applicable to both 2.4.30 and 2.6.11 and later.   * This file is applicable to both 2.4.30 and 2.6.11 and later.
11   * See README.ccs for ChangeLog.   * See README.ccs for ChangeLog.
# Line 49  static const struct in6_addr *SaveIPv6Ad Line 49  static const struct in6_addr *SaveIPv6Ad
49          static const int block_size = 16;          static const int block_size = 16;
50          struct addr_list {          struct addr_list {
51                  struct in6_addr addr[block_size];                  struct in6_addr addr[block_size];
52                  struct addr_list *next;                  struct list1_head list;
53                  u32 in_use_count;                  u32 in_use_count;
54          };          };
55          static struct addr_list *list = NULL;          static LIST1_HEAD(address_list);
56          struct addr_list *ptr;          struct addr_list *ptr;
57          static DEFINE_MUTEX(lock);          static DEFINE_MUTEX(lock);
58          int i = block_size;          int i = block_size;
59          if (!addr) return NULL;          if (!addr) return NULL;
60          mutex_lock(&lock);          mutex_lock(&lock);
61          for (ptr = list; ptr; ptr = ptr->next) {          list1_for_each_entry(ptr, &address_list, list) {
62                  for (i = 0; i < ptr->in_use_count; i++) {                  for (i = 0; i < ptr->in_use_count; i++) {
63                          if (memcmp(&ptr->addr[i], addr, sizeof(*addr)) == 0) goto ok;                          if (memcmp(&ptr->addr[i], addr, sizeof(*addr)) == 0) goto ok;
64                  }                  }
65                  if (i < block_size) break;                  if (i < block_size) break;
66          }          }
67          if (i == block_size && (ptr = alloc_element(sizeof(*ptr))) != NULL) {          if (i == block_size) {
68                  struct addr_list *p = list;                  ptr = alloc_element(sizeof(*ptr));
69                  if (p) {                  if (!ptr) goto ok;
70                          while (p->next) p = p->next;                  list1_add_tail_mb(&ptr->list, &address_list);
                         p->next = ptr;  
                 } else {  
                         list = ptr;  
                 }  
71                  i = 0;                  i = 0;
72          }          }
73          if (ptr) ptr->addr[ptr->in_use_count++] = *addr;          ptr->addr[ptr->in_use_count++] = *addr;
74  ok:  ok:
75          mutex_unlock(&lock);          mutex_unlock(&lock);
76          return ptr ? &ptr->addr[i] : NULL;          return ptr ? &ptr->addr[i] : NULL;

Legend:
Removed from v.722  
changed lines
  Added in v.731

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26