我国的国花是什么花| 仁德是什么意思| 荷尔蒙是什么意思| 球蛋白偏低是什么原因| 奶茶妹是什么意思| 憔悴是什么意思| 卡不当什么意思| 什么是机械手表| 擦伤涂什么药膏| hpv感染是什么病| 炎细胞浸润是什么意思| 煮玉米放盐起什么作用| 什么茶可以减肥消脂| 2018属什么生肖| 怀孕哭对宝宝有什么影响| 花卉是什么意思| 情绪波动大是什么原因| 绝非偶然是什么意思| 养生馆起什么名字好| 康宽杀虫剂能杀什么虫| 面条鱼是什么鱼| 弄璋之喜是什么意思| 猪笼入水是什么意思| 纳豆是什么豆| 什么是宫外孕| 土茯苓与茯苓有什么区别| 11月26是什么星座| 翘楚是什么意思| 奋不顾身的顾是什么意思| 症候群什么意思| 西酞普兰为什么早晨吃| 郑州有什么好玩的| 六合什么意思| 备孕喝豆浆有什么好处| 顺手牵羊是什么生肖| 什么酒不能喝打一生肖| 大基数是什么意思| 为什么男人吃石榴壮阳| pta是什么意思| 逍遥丸的功效和作用是什么| 新生儿吐奶是什么原因| 蓝风铃香水什么味道| 梦到老鼠是什么意思| 牙疼可以吃什么| 眼袋是什么原因造成的| 什么时候割包皮最好| 红色的对比色是什么颜色| 什么病会通过唾液传播| 梦见纸钱是什么预兆| 藕不能和什么一起吃| 游泳前一定要做好什么运动| 心动过缓吃什么药最好| 嘴唇干裂是什么原因引起的| 睾丸炎有什么症状| 戒指中指代表什么意思| pet是什么检查| 流年是什么| 碱性磷酸酶高是什么病| 黄精吃了有什么好处| 老鼠属于什么类动物| 蚂蚱吃什么食物| 月相是什么意思| 为什么吃不胖| butter是什么意思| eca是什么意思| 直接胆红素偏低是什么原因| 来月经有异味什么原因| 病人打白蛋白意味着什么| 艾附暖宫丸什么时候吃| 血小板低是什么引起的| rebecca什么意思| 呼吸重是什么原因| 腰间盘突出用什么药| 阳萎是什么| 门诊是什么意思| 足三里在什么位置| 爆单什么意思| 梦见自己大肚子怀孕是什么意思| 孕妇喝什么牛奶对胎儿好| 睾丸疝气有什么症状| 2030年属什么生肖| 秦二世为什么姓胡| 寒冷性荨麻疹是什么原因引起的| 儿童红眼病用什么眼药水| 肾主骨是什么意思| 艾滋通过什么途径传播| 肺炎衣原体和支原体有什么区别| 哕是什么意思| 网恋是什么意思| ect是什么检查| 独角仙吃什么| 多囊卵巢有什么症状表现| 清水是什么意思| 热疙瘩用什么药膏| 三个力念什么| g6pd筛查是检查什么| 经过的意思是什么| 螳螂捕蝉是什么意思| 98年是什么年| 眼屎多用什么眼药水好| 男占258女占369什么意思| 半夜醒来口干舌燥是什么原因| 肾结石是什么引起的| 2029是什么年| 觊觎什么意思| 男性生殖系统感染吃什么药| 什么是心率| 月经来了喝红糖水有什么好处| 小腿酸胀是什么原因| 气性大是什么意思| 航五行属什么| 纳豆是什么| 布帛是什么意思| 间质性改变是什么意思| 子宫直肠凹积液是什么意思| 什么病不能吃秋葵| 升结肠ca是什么意思| 兔子肉不能和什么一起吃| 富士康是做什么的| gopro是什么意思| 追什么| 六角龙吃什么食物| 第一颗原子弹叫什么| 直肠增生性的息肉是什么意思| 下嘴唇有痣代表什么| 做梦梦到理发是什么征兆| 吃什么能让阴茎更硬| 胰腺炎可以吃什么| 18属什么生肖| 氨水是什么| 急性扁桃体炎吃什么药| 商鞅姓什么| 炙子是什么意思| 宫颈糜烂用什么药好| 甲状腺结节是什么症状| 血压高吃什么水果好| 冻结账户需要什么条件| 朱砂五行属什么| 静夜思是什么季节| 肚脐的左边疼是什么原因| 节操是什么意思| 沉默不是代表我的错是什么歌| 气血是什么| 虫草吃了有什么好处| iphone的i是什么意思| 两横一竖是什么字| 月经来了不能吃什么东西| 艾滋病一年有什么症状| 尿液特别黄是什么原因引起的| 肿瘤切开了里面是什么| 东成西就是什么生肖| 绝命是什么意思| 帕金森吃什么药最好| 乳酪是什么东西| hpv男性有什么症状| 蓝瘦香菇是什么意思| 可甜可盐什么意思| 气短吃什么药| 酒后手麻什么原因| 梦见吵架是什么预兆| 胎梦梦见蛇是什么意思| 十一月七号是什么星座| 马步鱼为什么是甜的| 8月11号是什么星座| 水肺潜水是什么意思| 甲亢吃什么盐好| 墙内开花墙外香是什么意思| 什么是值机| 化疗和放疗什么区别| 子宫内膜不均匀是什么意思| 赫兹是什么| 什么的白塔| 外阴瘙痒擦什么药| 干咳无痰是什么原因引起的| sid是什么| 脊灰疫苗是预防什么的| 红薯开花预示着什么| 女性更年期潮热出汗吃什么药| 胃不好吃什么养胃| 优甲乐什么时候吃最好| 灶性肠化是什么意思| 生命的尽头是什么| 国士无双什么意思| 橙色预警是什么级别| 女人吃槐花有什么好处| 数字专辑什么意思| hc什么意思| 11.22是什么星座| 生理期吃什么水果比较好| 河南什么烟出名| 小三阳是什么意思| 健康四大基石是什么| 喝胶原蛋白肽有什么好处| 螺旋杆菌有什么症状| 糙米是什么米| 诏安是什么意思| 梦见自己丢钱了什么征兆| 双性人什么意思| 26年属什么生肖| 吃东西就吐是什么原因| 梦到和别人打架是什么意思| 喉咙疼吃什么消炎药| 月经期间吃什么水果| 脑供血不足用什么药| 喝蜂蜜水有什么好处和坏处| 樱桃有什么营养| 什么酒不能喝| 无后为大是什么意思| 试金石是什么意思| 气短挂什么科| 桑叶有什么功效和作用| 项羽是什么生肖| 宫腔内异常回声是什么意思| 臭氧是什么东西| 淋巴癌是什么| 吃什么最健康| 什么原因会导致尿路感染| 第一次表白送什么花| 雨淋棺材有什么说法| 吃什么药可以流产| 吸烟有害健康为什么国家还生产烟| 梦见蝎子是什么意思| 什么路最窄打一生肖| 脾不好有什么症状| cpc是什么| 综合用地是什么性质| 西瓜配什么榨汁好喝| s925是什么金| 迪奥是什么意思| 老烂腿抹什么药膏最好| 低热是什么症状| 日文上下结构念什么| 白痰是什么原因| 鸡枞是什么东西| 小孩自闭症是什么原因引起的| 侮辱什么意思| 为什么硬一会就软了| 脂肪瘤去医院挂什么科| 固表是什么意思| 女人左下眼皮跳是什么预兆| 梦见烧纸钱是什么意思| 仙女下凡是什么生肖| 三月出生的是什么星座| 输尿管结石挂什么科| 高锰酸钾是什么| 小孩小腿疼是什么原因引起的| 想改名字需要什么手续| 师五行属什么| 祛斑产品什么好| 阑尾炎在什么位置疼| 什么样的情况下需要做肠镜| 白手起家是什么意思| 老年人心跳过快是什么原因| 血红蛋白低吃什么可以补起来| 梦见摘果子是什么意思| 每个月月经都推迟是什么原因| 半夜容易醒是什么原因| 口嗨是什么意思| 胸口不舒服是什么原因| 7月11日是什么日子| 锅烧是什么| 属鸡的什么命| 右脚后跟疼是什么原因| 蒙古族的那达慕大会是在什么时候| 百度
Fix OOB write in BuildHuffmanTable.

First, BuildHuffmanTable is called to check if the data is valid.
If it is and the table is not big enough, more memory is allocated.

This will make sure that valid (but unoptimized because of unbalanced
codes) streams are still decodable.

Bug: chromium:1479274
Change-Id: I31c36dbf3aa78d35ecf38706b50464fd3d375741
diff --git a/src/dec/vp8l_dec.c b/src/dec/vp8l_dec.c
index 4501216..5ab34f5 100644
--- a/src/dec/vp8l_dec.c
+++ b/src/dec/vp8l_dec.c
@@ -262,11 +262,11 @@
   int symbol;
   int max_symbol;
   int prev_code_len = DEFAULT_CODE_LENGTH;
-  HuffmanCode table[1 << LENGTHS_TABLE_BITS];
+  HuffmanTables tables;
 
-  if (!VP8LBuildHuffmanTable(table, LENGTHS_TABLE_BITS,
-                             code_length_code_lengths,
-                             NUM_CODE_LENGTH_CODES)) {
+  if (!VP8LHuffmanTablesAllocate(1 << LENGTHS_TABLE_BITS, &tables) ||
+      !VP8LBuildHuffmanTable(&tables, LENGTHS_TABLE_BITS,
+                             code_length_code_lengths, NUM_CODE_LENGTH_CODES)) {
     goto End;
   }
 
@@ -286,7 +286,7 @@
     int code_len;
     if (max_symbol-- == 0) break;
     VP8LFillBitWindow(br);
-    p = &table[VP8LPrefetchBits(br) & LENGTHS_TABLE_MASK];
+    p = &tables.curr_segment->start[VP8LPrefetchBits(br) & LENGTHS_TABLE_MASK];
     VP8LSetBitPos(br, br->bit_pos_ + p->bits);
     code_len = p->value;
     if (code_len < kCodeLengthLiterals) {
@@ -309,6 +309,7 @@
   ok = 1;
 
  End:
+  VP8LHuffmanTablesDeallocate(&tables);
   if (!ok) return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
   return ok;
 }
@@ -316,7 +317,8 @@
 // 'code_lengths' is pre-allocated temporary buffer, used for creating Huffman
 // tree.
 static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
-                           int* const code_lengths, HuffmanCode* const table) {
+                           int* const code_lengths,
+                           HuffmanTables* const table) {
   int ok = 0;
   int size = 0;
   VP8LBitReader* const br = &dec->br_;
@@ -367,8 +369,7 @@
   VP8LMetadata* const hdr = &dec->hdr_;
   uint32_t* huffman_image = NULL;
   HTreeGroup* htree_groups = NULL;
-  HuffmanCode* huffman_tables = NULL;
-  HuffmanCode* huffman_table = NULL;
+  HuffmanTables* huffman_tables = &hdr->huffman_tables_;
   int num_htree_groups = 1;
   int num_htree_groups_max = 1;
   const int max_alphabet_size =
@@ -378,6 +379,10 @@
   int* mapping = NULL;
   int ok = 0;
 
+  // Check the table has been 0 initialized (through InitMetadata).
+  assert(huffman_tables->root.start == NULL);
+  assert(huffman_tables->curr_segment == NULL);
+
   if (allow_recursion && VP8LReadBits(br, 1)) {
     // use meta Huffman codes.
     const int huffman_precision = VP8LReadBits(br, 3) + 2;
@@ -429,16 +434,15 @@
 
   code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
                                       sizeof(*code_lengths));
-  huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
-                                                sizeof(*huffman_tables));
   htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
 
-  if (htree_groups == NULL || code_lengths == NULL || huffman_tables == NULL) {
+  if (htree_groups == NULL || code_lengths == NULL ||
+      !VP8LHuffmanTablesAllocate(num_htree_groups * table_size,
+                                 huffman_tables)) {
     VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
     goto Error;
   }
 
-  huffman_table = huffman_tables;
   for (i = 0; i < num_htree_groups_max; ++i) {
     // If the index "i" is unused in the Huffman image, just make sure the
     // coefficients are valid but do not store them.
@@ -463,19 +467,20 @@
       int max_bits = 0;
       for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
         int alphabet_size = kAlphabetSize[j];
-        htrees[j] = huffman_table;
         if (j == 0 && color_cache_bits > 0) {
           alphabet_size += (1 << color_cache_bits);
         }
-        size = ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_table);
+        size =
+            ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_tables);
+        htrees[j] = huffman_tables->curr_segment->curr_table;
         if (size == 0) {
           goto Error;
         }
         if (is_trivial_literal && kLiteralMap[j] == 1) {
-          is_trivial_literal = (huffman_table->bits == 0);
+          is_trivial_literal = (htrees[j]->bits == 0);
         }
-        total_size += huffman_table->bits;
-        huffman_table += size;
+        total_size += htrees[j]->bits;
+        huffman_tables->curr_segment->curr_table += size;
         if (j <= ALPHA) {
           int local_max_bits = code_lengths[0];
           int k;
@@ -510,14 +515,13 @@
   hdr->huffman_image_ = huffman_image;
   hdr->num_htree_groups_ = num_htree_groups;
   hdr->htree_groups_ = htree_groups;
-  hdr->huffman_tables_ = huffman_tables;
 
  Error:
   WebPSafeFree(code_lengths);
   WebPSafeFree(mapping);
   if (!ok) {
     WebPSafeFree(huffman_image);
-    WebPSafeFree(huffman_tables);
+    VP8LHuffmanTablesDeallocate(huffman_tables);
     VP8LHtreeGroupsFree(htree_groups);
   }
   return ok;
@@ -1352,7 +1356,7 @@
   assert(hdr != NULL);
 
   WebPSafeFree(hdr->huffman_image_);
-  WebPSafeFree(hdr->huffman_tables_);
+  VP8LHuffmanTablesDeallocate(&hdr->huffman_tables_);
   VP8LHtreeGroupsFree(hdr->htree_groups_);
   VP8LColorCacheClear(&hdr->color_cache_);
   VP8LColorCacheClear(&hdr->saved_color_cache_);
@@ -1666,7 +1670,7 @@
 
   if (dec == NULL) return 0;
 
-  assert(dec->hdr_.huffman_tables_ != NULL);
+  assert(dec->hdr_.huffman_tables_.root.start != NULL);
   assert(dec->hdr_.htree_groups_ != NULL);
   assert(dec->hdr_.num_htree_groups_ > 0);
 
diff --git a/src/dec/vp8li_dec.h b/src/dec/vp8li_dec.h
index 72b2e86..32540a4 100644
--- a/src/dec/vp8li_dec.h
+++ b/src/dec/vp8li_dec.h
@@ -51,7 +51,7 @@
   uint32_t*       huffman_image_;
   int             num_htree_groups_;
   HTreeGroup*     htree_groups_;
-  HuffmanCode*    huffman_tables_;
+  HuffmanTables   huffman_tables_;
 } VP8LMetadata;
 
 typedef struct VP8LDecoder VP8LDecoder;
diff --git a/src/utils/huffman_utils.c b/src/utils/huffman_utils.c
index 90c2fbf..cf73abd 100644
--- a/src/utils/huffman_utils.c
+++ b/src/utils/huffman_utils.c
@@ -177,21 +177,24 @@
       if (num_open < 0) {
         return 0;
       }
-      if (root_table == NULL) continue;
       for (; count[len] > 0; --count[len]) {
         HuffmanCode code;
         if ((key & mask) != low) {
-          table += table_size;
+          if (root_table != NULL) table += table_size;
           table_bits = NextTableBitSize(count, len, root_bits);
           table_size = 1 << table_bits;
           total_size += table_size;
           low = key & mask;
-          root_table[low].bits = (uint8_t)(table_bits + root_bits);
-          root_table[low].value = (uint16_t)((table - root_table) - low);
+          if (root_table != NULL) {
+            root_table[low].bits = (uint8_t)(table_bits + root_bits);
+            root_table[low].value = (uint16_t)((table - root_table) - low);
+          }
         }
-        code.bits = (uint8_t)(len - root_bits);
-        code.value = (uint16_t)sorted[symbol++];
-        ReplicateValue(&table[key >> root_bits], step, table_size, code);
+        if (root_table != NULL) {
+          code.bits = (uint8_t)(len - root_bits);
+          code.value = (uint16_t)sorted[symbol++];
+          ReplicateValue(&table[key >> root_bits], step, table_size, code);
+        }
         key = GetNextKey(key, len);
       }
     }
@@ -211,25 +214,83 @@
   ((1 << MAX_CACHE_BITS) + NUM_LITERAL_CODES + NUM_LENGTH_CODES)
 // Cut-off value for switching between heap and stack allocation.
 #define SORTED_SIZE_CUTOFF 512
-int VP8LBuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
+int VP8LBuildHuffmanTable(HuffmanTables* const root_table, int root_bits,
                           const int code_lengths[], int code_lengths_size) {
-  int total_size;
+  const int total_size =
+      BuildHuffmanTable(NULL, root_bits, code_lengths, code_lengths_size, NULL);
   assert(code_lengths_size <= MAX_CODE_LENGTHS_SIZE);
-  if (root_table == NULL) {
-    total_size = BuildHuffmanTable(NULL, root_bits,
-                                   code_lengths, code_lengths_size, NULL);
-  } else if (code_lengths_size <= SORTED_SIZE_CUTOFF) {
+  if (total_size == 0 || root_table == NULL) return total_size;
+
+  if (root_table->curr_segment->curr_table + total_size >=
+      root_table->curr_segment->start + root_table->curr_segment->size) {
+    // If 'root_table' does not have enough memory, allocate a new segment.
+    // The available part of root_table->curr_segment is left unused because we
+    // need a contiguous buffer.
+    const int segment_size = root_table->curr_segment->size;
+    struct HuffmanTablesSegment* next =
+        (HuffmanTablesSegment*)WebPSafeMalloc(1, sizeof(*next));
+    if (next == NULL) return 0;
+    // Fill the new segment.
+    // We need at least 'total_size' but if that value is small, it is better to
+    // allocate a big chunk to prevent more allocations later. 'segment_size' is
+    // therefore chosen (any other arbitrary value could be chosen).
+    next->size = total_size > segment_size ? total_size : segment_size;
+    next->start =
+        (HuffmanCode*)WebPSafeMalloc(next->size, sizeof(*next->start));
+    if (next->start == NULL) {
+      WebPSafeFree(next);
+      return 0;
+    }
+    next->curr_table = next->start;
+    next->next = NULL;
+    // Point to the new segment.
+    root_table->curr_segment->next = next;
+    root_table->curr_segment = next;
+  }
+  if (code_lengths_size <= SORTED_SIZE_CUTOFF) {
     // use local stack-allocated array.
     uint16_t sorted[SORTED_SIZE_CUTOFF];
-    total_size = BuildHuffmanTable(root_table, root_bits,
-                                   code_lengths, code_lengths_size, sorted);
-  } else {   // rare case. Use heap allocation.
+    BuildHuffmanTable(root_table->curr_segment->curr_table, root_bits,
+                      code_lengths, code_lengths_size, sorted);
+  } else {  // rare case. Use heap allocation.
     uint16_t* const sorted =
         (uint16_t*)WebPSafeMalloc(code_lengths_size, sizeof(*sorted));
     if (sorted == NULL) return 0;
-    total_size = BuildHuffmanTable(root_table, root_bits,
-                                   code_lengths, code_lengths_size, sorted);
+    BuildHuffmanTable(root_table->curr_segment->curr_table, root_bits,
+                      code_lengths, code_lengths_size, sorted);
     WebPSafeFree(sorted);
   }
   return total_size;
 }
+
+int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables) {
+  // Have 'segment' point to the first segment for now, 'root'.
+  HuffmanTablesSegment* const root = &huffman_tables->root;
+  huffman_tables->curr_segment = root;
+  // Allocate root.
+  root->start = (HuffmanCode*)WebPSafeMalloc(size, sizeof(*root->start));
+  if (root->start == NULL) return 0;
+  root->curr_table = root->start;
+  root->next = NULL;
+  root->size = size;
+  return 1;
+}
+
+void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables) {
+  HuffmanTablesSegment *current, *next;
+  if (huffman_tables == NULL) return;
+  // Free the root node.
+  current = &huffman_tables->root;
+  next = current->next;
+  WebPSafeFree(current->start);
+  current->start = NULL;
+  current->next = NULL;
+  current = next;
+  // Free the following nodes.
+  while (current != NULL) {
+    next = current->next;
+    WebPSafeFree(current->start);
+    WebPSafeFree(current);
+    current = next;
+  }
+}
diff --git a/src/utils/huffman_utils.h b/src/utils/huffman_utils.h
index 13b7ad1..98415c5 100644
--- a/src/utils/huffman_utils.h
+++ b/src/utils/huffman_utils.h
@@ -43,6 +43,29 @@
                     // or non-literal symbol otherwise
 } HuffmanCode32;
 
+// Contiguous memory segment of HuffmanCodes.
+typedef struct HuffmanTablesSegment {
+  HuffmanCode* start;
+  // Pointer to where we are writing into the segment. Starts at 'start' and
+  // cannot go beyond 'start' + 'size'.
+  HuffmanCode* curr_table;
+  // Pointer to the next segment in the chain.
+  struct HuffmanTablesSegment* next;
+  int size;
+} HuffmanTablesSegment;
+
+// Chained memory segments of HuffmanCodes.
+typedef struct HuffmanTables {
+  HuffmanTablesSegment root;
+  // Currently processed segment. At first, this is 'root'.
+  HuffmanTablesSegment* curr_segment;
+} HuffmanTables;
+
+// Allocates a HuffmanTables with 'size' contiguous HuffmanCodes. Returns 0 on
+// memory allocation error, 1 otherwise.
+int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables);
+void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables);
+
 #define HUFFMAN_PACKED_BITS 6
 #define HUFFMAN_PACKED_TABLE_SIZE (1u << HUFFMAN_PACKED_BITS)
 
@@ -78,9 +101,7 @@
 // the huffman table.
 // Returns built table size or 0 in case of error (invalid tree or
 // memory error).
-// If root_table is NULL, it returns 0 if a lookup cannot be built, something
-// > 0 otherwise (but not the table size).
-int VP8LBuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
+int VP8LBuildHuffmanTable(HuffmanTables* const root_table, int root_bits,
                           const int code_lengths[], int code_lengths_size);
 
 #ifdef __cplusplus
小孩子发烧是什么原因引起的 口且念什么 带环了月经推迟不来什么原因 什么的山顶 猫薄荷是什么
esd手术是什么意思 小孩缺锌有什么症状 叶脉是什么 肠易激综合征吃什么药 诸侯国是什么意思
未见胎芽是什么意思 儿童弱视是什么原因引起的 百日咳是什么意思 bso是什么意思 poison是什么意思
喝酒吐血是什么原因 头发一半白一半黑是什么原因 东坡肉属于什么菜系 葛优躺是什么意思 尿酸高的人吃什么食物好
一个口一个犬读什么hcv9jop6ns5r.cn 寄生虫感染吃什么药hcv8jop9ns6r.cn 素描是什么意思hcv8jop9ns5r.cn 什么的小狗hcv7jop9ns5r.cn 红粉是什么意思kuyehao.com
中性粒细胞百分比偏低什么意思hcv8jop9ns9r.cn 爱趴着睡觉是什么原因hcv9jop6ns1r.cn 唇裂是什么原因造成的hcv9jop3ns4r.cn 乙肝五项25阳性是什么意思hcv8jop6ns0r.cn 喉咙发炎吃什么药最好hcv7jop9ns4r.cn
大便潜血什么意思hcv8jop7ns3r.cn 青津果的功效是什么tiangongnft.com 青钱柳有什么功效与作用xinjiangjialails.com 吃软不吃硬是什么生肖hcv9jop7ns1r.cn 经常流鼻涕是什么原因hcv7jop9ns4r.cn
晚上尿床是什么原因hcv9jop3ns2r.cn 儿童湿疹用什么药膏hcv8jop6ns4r.cn 什么叫2型糖尿病hcv9jop1ns2r.cn 捞人什么意思jinxinzhichuang.com 烟头属于什么垃圾hcv8jop6ns7r.cn
百度