From patchwork Mon Jun 3 12:55:07 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Figovsky X-Patchwork-Id: 248257 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 24D4E2C008C for ; Mon, 3 Jun 2013 22:55:19 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755856Ab3FCMzR (ORCPT ); Mon, 3 Jun 2013 08:55:17 -0400 Received: from na3sys010aog105.obsmtp.com ([74.125.245.78]:53684 "HELO na3sys010aog105.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1755272Ab3FCMzQ (ORCPT ); Mon, 3 Jun 2013 08:55:16 -0400 Received: from mail-ea0-f175.google.com ([209.85.215.175]) (using TLSv1) by na3sys010aob105.postini.com ([74.125.244.12]) with SMTP ID DSNKUaySMxyxE28kDg1XpCUBMCQONXD4vtXK@postini.com; Mon, 03 Jun 2013 05:55:16 PDT Received: by mail-ea0-f175.google.com with SMTP id f10so1205059eak.34 for ; Mon, 03 Jun 2013 05:55:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=34DE2rB12M91GqFeXofUuq2y92sbGEfktPHfvUPnmew=; b=WWygjp0ktv06u0b2waJSyFRp8RvPqGK/ccKBnHyhrP+MVWlGsU5JuYK1+P/7ODewzk dAa/jSaRmg+8bR0XbyR33ftz7G9O8TadCLsz+ks5FdoZzS0GewSf/S1bFFZ1u13/2kgz JyNm102so6M0ATp8c4tt7PiZDr/agnc6RLZ45a6RPXh2k10UIoawkHcvPLSn9zno4os/ msOOegPz5uroNmZ9XM8gGkmfnYGrKzAl2Q/aJwp+rFhQl8C1LeQitH+4s36AfL/MlbHS siToWWalTMUzax7osbpBDfr8ZtW44J0i6LF2JdFX0ddWhub6IyWYPAaoxIDC/EyLHlC/ imCQ== X-Received: by 10.15.68.194 with SMTP id w42mr9401433eex.59.1370264114421; Mon, 03 Jun 2013 05:55:14 -0700 (PDT) X-Received: by 10.15.68.194 with SMTP id w42mr9401430eex.59.1370264114345; Mon, 03 Jun 2013 05:55:14 -0700 (PDT) Received: from borf.ravello.local ([213.57.127.2]) by mx.google.com with ESMTPSA id f1sm56477660eem.17.2013.06.03.05.55.12 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 03 Jun 2013 05:55:13 -0700 (PDT) From: Boris Figovsky To: Jan Engelhardt Cc: netfilter-devel@vger.kernel.org Subject: [PATCH] xtables-addons: xt_DHCPMAC: correct mac setting and comparing Date: Mon, 3 Jun 2013 15:55:07 +0300 Message-Id: <1370264107-17848-1-git-send-email-boris.figovsky@ravellosystems.com> X-Mailer: git-send-email 1.7.9.5 X-Gm-Message-State: ALoCoQl83BfbsGdXykzY0IEGBM0XHY81nZJUUc2e8sMHtxhroxZYUR89AiU0xHvkv/OL/d5MGqQNB9y5TVMHvNbH2ZzMrbFssfQ3KlPY4GGAU+LLljyLhtCjsV3zrJOOUPPFOsMljaJGIRINtK4Af1Mh9FXHQw03ltbgIj2NlA0zvK32pIr2mseNlcxnyOZuR/WmAQEMLEqy Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org Signed-off-by: Boris Figovsky --- extensions/xt_DHCPMAC.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/extensions/xt_DHCPMAC.c b/extensions/xt_DHCPMAC.c index 45f1972..bedf75d 100644 --- a/extensions/xt_DHCPMAC.c +++ b/extensions/xt_DHCPMAC.c @@ -34,9 +34,9 @@ static void ether_set(unsigned char *addr, const unsigned char *op, unsigned int i; for (i = 0; i < ETH_ALEN && mask > 0; ++i) { - lo_mask = mask % 8; + lo_mask = (mask >= 8) ? 8 : mask; /* FF << 4 >> 4 = 0F */ - lo_mask = ~(uint8_t)0U << lo_mask >> lo_mask; + lo_mask = (uint8_t)(~0U << lo_mask) >> lo_mask; addr[i] &= lo_mask; addr[i] |= op[i] & ~lo_mask; if (mask >= 8) @@ -55,9 +55,9 @@ static bool ether_cmp(const unsigned char *lh, const unsigned char *rh, #define ZMACHEX(s) s[0], s[1], s[2], s[3], s[4], s[5] for (i = 0; i < ETH_ALEN && mask > 0; ++i) { - lo_mask = mask % 8; + lo_mask = (mask >= 8) ? 8 : mask; /* ~(0xFF << 4 >> 4) = ~0x0F = 0xF0 */ - lo_mask = ~(~(uint8_t)0U << lo_mask >> lo_mask); + lo_mask = ~((uint8_t)(~0U << lo_mask) >> lo_mask); if ((lh[i] ^ rh[i]) & lo_mask) return false; if (mask >= 8) @@ -111,13 +111,12 @@ dhcpmac_tg(struct sk_buff **pskb, const struct xt_action_param *par) return NF_DROP; for (i = 0; i < sizeof(dh->chaddr); i += 2) - csum_replace2(&udph->check, *(const __be16 *)dh->chaddr, 0); + csum_replace2(&udph->check, *(const __be16 *)(dh->chaddr+i), 0); - memset(dh->chaddr, 0, sizeof(dh->chaddr)); ether_set(dh->chaddr, info->addr, info->mask); for (i = 0; i < sizeof(dh->chaddr); i += 2) - csum_replace2(&udph->check, 0, *(const __be16 *)dh->chaddr); + csum_replace2(&udph->check, 0, *(const __be16 *)(dh->chaddr+i)); return XT_CONTINUE; }