1. 06 7月, 2005 1 次提交
    • P
      [NET]: Fix signedness issues in net/core/filter.c · 55820ee2
      Patrick McHardy 提交于
      This is the code to load packet data into a register:
      
                              k = fentry->k;
                              if (k < 0) {
      ...
                              } else {
                                      u32 _tmp, *p;
                                      p = skb_header_pointer(skb, k, 4, &_tmp);
                                      if (p != NULL) {
                                              A = ntohl(*p);
                                              continue;
                                      }
                              }
      
      skb_header_pointer checks if the requested data is within the
      linear area:
      
              int hlen = skb_headlen(skb);
      
              if (offset + len <= hlen)
                      return skb->data + offset;
      
      When offset is within [INT_MAX-len+1..INT_MAX] the addition will
      result in a negative number which is <= hlen.
      
      I couldn't trigger a crash on my AMD64 with 2GB of memory, but a
      coworker tried on his x86 machine and it crashed immediately.
      
      This patch fixes the check in skb_header_pointer to handle large
      positive offsets similar to skb_copy_bits. Invalid data can still
      be accessed using negative offsets (also similar to skb_copy_bits),
      anyone using negative offsets needs to verify them himself.
      
      Thanks to Thomas Vögtle <thomas.voegtle@coreworks.de> for verifying the
      problem by crashing his machine and providing me with an Oops.
      Signed-off-by: NPatrick McHardy <kaber@trash.net>
      Acked-by: NHerbert Xu <herbert@gondor.apana.org.au>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      55820ee2
  2. 04 7月, 2005 9 次提交
  3. 03 7月, 2005 18 次提交
  4. 01 7月, 2005 12 次提交