From patchwork Mon Dec 13 19:18:07 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Shilovsky X-Patchwork-Id: 407432 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBDJYJ61017658 for ; Mon, 13 Dec 2010 19:34:19 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753741Ab0LMTeS (ORCPT ); Mon, 13 Dec 2010 14:34:18 -0500 Received: from mail-ey0-f171.google.com ([209.85.215.171]:45517 "EHLO mail-ey0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753183Ab0LMTeR (ORCPT ); Mon, 13 Dec 2010 14:34:17 -0500 Received: by eyg5 with SMTP id 5so4448924eyg.2 for ; Mon, 13 Dec 2010 11:34:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:subject:date :message-id:x-mailer; bh=fNQvZkEvpNpxTQ2UOyWEhHAPaG71QA0mjXQlEyEdcmQ=; b=J9jJenQZjz9loRtbSs6VqpBceBpj0jyk9AUK/MV7z/V9z15eaTNEPymVDPkagy0vkV 3FVKExCDXupKbijjrI6S7btQ+aWpp0Ye3upay83rySOp48HuSpqJyY5MRbFF17Imzl2u 20NkAYFYyRJnTgZBCn5JbM/IQsVhhNHIVQ9ws= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:message-id:x-mailer; b=KEN1ppckfSEbPLKAGFX4uAgiXjq118fyw80SVqe9z5l0epccfX5bD1loiM8zZXvPYf Th4+cdAepYEF3zb1Nk4o6HXvHAdfTNLgAG6oh/pp7MypgfDM3ikBXbF88MzXYny8C8Ri N9QVasih6RbVdwdL4uWsog7Yy11wTVXM9PqSU= Received: by 10.213.29.131 with SMTP id q3mr156788ebc.89.1292267895142; Mon, 13 Dec 2010 11:18:15 -0800 (PST) Received: from localhost.localdomain (PPPoE-78-29-112-8.san.ru [78.29.112.8]) by mx.google.com with ESMTPS id t5sm319851eeh.8.2010.12.13.11.18.13 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 13 Dec 2010 11:18:14 -0800 (PST) From: Pavel Shilovsky To: linux-cifs@vger.kernel.org Subject: [PATCH 2/2] CIFS: Add match_port check during looking for an existing connection (try #4) Date: Mon, 13 Dec 2010 22:18:07 +0300 Message-Id: <1292267887-18075-1-git-send-email-piastryyy@gmail.com> X-Mailer: git-send-email 1.7.3.2 Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 13 Dec 2010 19:34:19 +0000 (UTC) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index b90c741..41f002f 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1453,6 +1453,40 @@ srcip_matches(struct sockaddr *srcaddr, struct sockaddr *rhs) } } +/* + * If no port is specified in addr structure, we try to match with 445 port + * and if it fails - with 139 ports. It should be called only if address + * families of server and addr are equal. + */ +static bool +match_port(struct TCP_Server_Info *server, struct sockaddr *addr) +{ + unsigned short int port, *sport; + + switch (addr->sa_family) { + case AF_INET: + sport = &((struct sockaddr_in *) &server->dstaddr)->sin_port; + port = ((struct sockaddr_in *) addr)->sin_port; + break; + case AF_INET6: + sport = &((struct sockaddr_in6 *) &server->dstaddr)->sin6_port; + port = ((struct sockaddr_in6 *) addr)->sin6_port; + break; + default: + WARN_ON(1); + return false; + } + + if (!port) { + port = htons(CIFS_PORT); + if (port == *sport) + return true; + + port = htons(RFC1001_PORT); + } + + return port == *sport; +} static bool match_address(struct TCP_Server_Info *server, struct sockaddr *addr, @@ -1466,8 +1500,6 @@ match_address(struct TCP_Server_Info *server, struct sockaddr *addr, if (addr4->sin_addr.s_addr != srv_addr4->sin_addr.s_addr) return false; - if (addr4->sin_port && addr4->sin_port != srv_addr4->sin_port) - return false; break; } case AF_INET6: { @@ -1480,9 +1512,6 @@ match_address(struct TCP_Server_Info *server, struct sockaddr *addr, return false; if (addr6->sin6_scope_id != srv_addr6->sin6_scope_id) return false; - if (addr6->sin6_port && - addr6->sin6_port != srv_addr6->sin6_port) - return false; break; } default: @@ -1555,6 +1584,9 @@ cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol) (struct sockaddr *)&vol->srcaddr)) continue; + if (!match_port(server, addr)) + continue; + if (!match_security(server, vol)) continue;