From patchwork Fri Apr 23 06:17:12 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Lovenberg X-Patchwork-Id: 50789 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.samba.org (fn.samba.org [216.83.154.106]) by ozlabs.org (Postfix) with ESMTP id 186C8B7D16 for ; Fri, 23 Apr 2010 16:17:26 +1000 (EST) Received: from fn.samba.org (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id 806D1AD226; Fri, 23 Apr 2010 00:17:26 -0600 (MDT) X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on fn.samba.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=3.8 tests=AWL,BAYES_00, HEADER_COUNT_CTYPE, MISSING_MIME_HB_SEP, NO_MORE_FUNN, SPF_PASS autolearn=no version=3.2.5 X-Original-To: linux-cifs-client@lists.samba.org Delivered-To: linux-cifs-client@lists.samba.org Received: from mail-vw0-f41.google.com (mail-vw0-f41.google.com [209.85.212.41]) by lists.samba.org (Postfix) with ESMTP id 9DE7EAD000 for ; Fri, 23 Apr 2010 00:17:21 -0600 (MDT) Received: by vws4 with SMTP id 4so2203917vws.14 for ; Thu, 22 Apr 2010 23:17:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer:content-type:content-transfer-encoding :mime-version:content-type; bh=jI8QeGTSLiVItoxcqk884PlpBgURvMn9IS+LcHREy6o=; b=SgQyhPRtSVf198YmWi9YZiYzPRBirLT/juHkIO+f8wZcNaz3H+peXPDf/GMeODF9AB TgGMg/FonAiF1M9reWwvZvqboZqq1A+hBFAYW0P1uXaEAi/5vbpbgCGJvTY2djAxuJo1 dxWojOpMotjCkh1ztJlIq4m1j8Fj6A9TVyrNA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:content-type :content-transfer-encoding:mime-version; b=xuNsZ+ofKb2dLeMuOuMV49NLtifjiHBrIRXGRxJhF743a5rq6IV8wpk4iu/RCtVwb6 Ki/ki+sAvEz4JlRdqfIT/0etkzAsRIFfjctTnWVa15bD2YwqOF0w4q/Wfsx1MLG+S68r ZiWm5mfsAzh31/3SDOiEsqhUU70UXcRY+VQ0E= Received: by 10.220.108.228 with SMTP id g36mr7595395vcp.26.1272003438203; Thu, 22 Apr 2010 23:17:18 -0700 (PDT) Received: from localhost.localdomain (24.115.161.116.res-cmts.flt.ptd.net [24.115.161.116]) by mx.google.com with ESMTPS id a1sm3482639vcp.21.2010.04.22.23.17.14 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 22 Apr 2010 23:17:15 -0700 (PDT) From: Scott Lovenberg To: linux-cifs-client@lists.samba.org Date: Fri, 23 Apr 2010 02:17:12 -0400 Message-Id: <1272003433-9426-1-git-send-email-scott.lovenberg@gmail.com> X-Mailer: git-send-email 1.6.2.5 MIME-Version: 1.0 Cc: jlayton@samba.org Subject: [linux-cifs-client] [PATCH 1/2] Clean up credential file parsing in mount.cifs.c. X-BeenThere: linux-cifs-client@lists.samba.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: The Linux CIFS VFS client List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-cifs-client-bounces@lists.samba.org Errors-To: linux-cifs-client-bounces@lists.samba.org Remove magic numbers, redundant code and extra variables from open_cred_file(). Remove check for domain length since strlcpy is safe from buffer overflows. Signed-off-by: Scott Lovenberg --- mount.cifs.c | 78 +++++++++++++++++++++++---------------------------------- 1 files changed, 32 insertions(+), 46 deletions(-) --------------1.6.2.5-- diff --git a/mount.cifs.c b/mount.cifs.c index ba9e206..97dae82 100644 --- a/mount.cifs.c +++ b/mount.cifs.c @@ -98,7 +98,7 @@ #endif #define MOUNT_PASSWD_SIZE 128 -#define DOMAIN_SIZE 64 +#define MAX_DOMAIN_SIZE 64 /* * value of the ver= option that gets passed to the kernel. Used to indicate @@ -128,7 +128,7 @@ struct parsed_mount_info { char share[MAX_SHARE_LEN + 1]; char prefix[PATH_MAX + 1]; char options[MAX_OPTIONS_LEN]; - char domain[DOMAIN_SIZE + 1]; + char domain[MAX_DOMAIN_SIZE + 1]; char username[MAX_USERNAME_SIZE + 1]; char password[MOUNT_PASSWD_SIZE + 1]; char addrlist[MAX_ADDR_LIST_LEN]; @@ -511,13 +511,27 @@ toggle_dac_capability(int writable, int enable) #endif /* HAVE_LIBCAP */ #endif /* HAVE_LIBCAP_NG */ +/* + * Null terminate string at first '\n' + */ +static void null_terminate_endl(char* source) +{ + char* newline = strchr(source, '\n'); + if (newline) + *newline = '\0'; +} + + + static int open_cred_file(char *file_name, struct parsed_mount_info *parsed_info) { char *line_buf; - char *temp_val, *newline; + char *temp_val; FILE *fs = NULL; - int i, length; + int i; + const int line_buf_size = 4096; + const int min_non_white = 10; i = toggle_dac_capability(0, 1); if (i) @@ -541,50 +555,35 @@ static int open_cred_file(char *file_name, return i; } - line_buf = (char *)malloc(4096); + line_buf = (char *)malloc(line_buf_size); if (line_buf == NULL) { fclose(fs); return EX_SYSERR; } - while (fgets(line_buf, 4096, fs)) { - /* parse line from credential file */ - + /* parse line from credentials file */ + while (fgets(line_buf, line_buf_size, fs)) { /* eat leading white space */ - for (i = 0; i < 4086; i++) { + for (i = 0; i < line_buf_size - min_non_white + 1; i++) { if ((line_buf[i] != ' ') && (line_buf[i] != '\t')) break; - /* if whitespace - skip past it */ } + null_terminate_endl(line_buf); - /* NULL terminate at newline */ - newline = strchr(line_buf + i, '\n'); - if (newline) - *newline = '\0'; - + /* parse user */ if (strncasecmp("user", line_buf + i, 4) == 0) { temp_val = strchr(line_buf + i, '='); if (temp_val) { /* go past equals sign */ temp_val++; - for (length = 0; length < 4087; length++) { - if ((temp_val[length] == '\n') - || (temp_val[length] == '\0')) { - temp_val[length] = '\0'; - break; - } - } - if (length > 4086) { - fprintf(stderr, - "mount.cifs failed due to malformed username in credentials file\n"); - memset(line_buf, 0, 4096); - return EX_USAGE; - } parsed_info->got_user = 1; strlcpy(parsed_info->username, temp_val, sizeof(parsed_info->username)); } - } else if (strncasecmp("pass", line_buf + i, 4) == 0) { + } + + /* parse password */ + else if (strncasecmp("pass", line_buf + i, 4) == 0) { temp_val = strchr(line_buf + i, '='); if (!temp_val) continue; @@ -592,7 +591,10 @@ static int open_cred_file(char *file_name, i = set_password(parsed_info, temp_val); if (i) return i; - } else if (strncasecmp("dom", line_buf + i, 3) == 0) { + } + + /* parse domain */ + else if (strncasecmp("dom", line_buf + i, 3) == 0) { temp_val = strchr(line_buf + i, '='); if (temp_val) { /* go past equals sign */ @@ -600,22 +602,6 @@ static int open_cred_file(char *file_name, if (parsed_info->verboseflag) fprintf(stderr, "\nDomain %s\n", temp_val); - - for (length = 0; length < DOMAIN_SIZE + 1; - length++) { - if ((temp_val[length] == '\n') - || (temp_val[length] == '\0')) { - temp_val[length] = '\0'; - break; - } - } - - if (length > DOMAIN_SIZE) { - fprintf(stderr, - "mount.cifs failed: domain in credentials file too long\n"); - return EX_USAGE; - } - strlcpy(parsed_info->domain, temp_val, sizeof(parsed_info->domain)); }