From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 21388 invoked from network); 21 Aug 2021 18:16:12 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 21 Aug 2021 18:16:12 -0000 Received: (qmail 3189 invoked by uid 550); 21 Aug 2021 18:16:02 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 15596 invoked from network); 21 Aug 2021 08:54:37 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alyssa.is; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm3; bh=Qo94OOIq3/g0n hk+fa0Vd+323FnfJ+UVX0DXzZLHbMM=; b=uJq2CPDsOyb3mrgqgW0vAKd2eJIBE tic5bc5j/VGs9CbV5kEL855JtEIWdy68CSQAV7JcRoyft+FBPibuhrVXxoCnnJjy Dw/+0tyO3ik6f8hEzfKGa0ejynsVN+Qx4i8/fgpmQKdIkZEsLwMDVr1vudZBOgAR yntednyAMabLrvn/QTbqBDas7H/yGpMnJSYuHvXhFyL5Gr24Z2fMbpy814UEvKNN 7UamuPkUl0l24TwQb7f6WvC8bghhfx7QcyYeqUDKF3OpoVqOQRVCuvTPeMsv22qj jEBHplXer4T0KSj3K6rqw8kfJfl52jcjKQhlTGdJik2g7HdnMJz6EUbsw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=Qo94OOIq3/g0nhk+fa0Vd+323FnfJ+UVX0DXzZLHbMM=; b=g7YQGdRn XC0vwj+3S2mAL2AAjS80PQ6XKayFEJ49/LRMbB1BQ+hH48xuaRM8MmIK9DYCytvq 05D11T+977f66TakJ8RZKhA25aNgYyQ0gsbKLS1JG3dBcYZBrp9r4X3lU6YLIVjI RXpJULsXKWQR3fJ+peMAFlfpXSTG+gF4lDwA8NBwehi2dd+93KzW6GnQyM0bMMYC FrZ3PdSQnfvHDlIck6d0yqxw3twwZvW58j7QhW9l6HnRdlmH5CRTgfgjVqMu5S/b vyP2BHwnKQs4TJSH1j1u5Kujgl5fIMKUhehAK58+ik7YnAC4WNrT4hadqlZ0CNL1 PodUUngHyX/ayQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddruddtuddgtdelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvffufffkofgjfhgggfestdekre dtredttdenucfhrhhomheptehlhihsshgrucftohhsshcuoehhihesrghlhihsshgrrdhi sheqnecuggftrfgrthhtvghrnhepgfefudekvdelieelledufeevheeglefggedvudejvd dtffeuueevffehleejkedvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehm rghilhhfrhhomhepqhihlhhishhssegvvhgvrdhqhihlihhsshdrnhgvth X-ME-Proxy: From: Alyssa Ross To: musl@lists.openwall.com Cc: Alyssa Ross Date: Sat, 21 Aug 2021 08:54:20 +0000 Message-Id: <20210821085420.474615-4-hi@alyssa.is> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210821085420.474615-1-hi@alyssa.is> References: <20210821085420.474615-1-hi@alyssa.is> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [PATCH musl 3/3] mntent: fix parsing lines with optional fields According to fstab(5), the last two fields are optional, but this wasn't accepted by Musl. After this change, only the first field is required, which matches Glibc's behaviour. Using sscanf as before, it would have been impossible to differentiate between 0 fields and 4 fields, because sscanf would have returned 0 in both cases due to the use of assignment suppression and %n for the string fields (which is important to avoid copying any strings). So instead, before calling sscanf, initialize every string to the empty string, and then we can check which strings are empty afterwards to know how many fields were matched. --- We could also be stricter about it, and enforce that the first four fields are present, since the man page says only the last two are optional. Doing that would be a simple change of checking for the presence of mnt_opts instead of mnt_fsname at the end of my patch. src/misc/mntent.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/misc/mntent.c b/src/misc/mntent.c index eabb8200..5a68f0b9 100644 --- a/src/misc/mntent.c +++ b/src/misc/mntent.c @@ -21,7 +21,8 @@ int endmntent(FILE *f) struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int buflen) { - int cnt, n[8], use_internal = (linebuf == SENTINEL); + int use_internal = (linebuf == SENTINEL); + size_t len, i, n[8]; mnt->mnt_freq = 0; mnt->mnt_passno = 0; @@ -39,10 +40,14 @@ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int bufle errno = ERANGE; return 0; } - cnt = sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d", - n, n+1, n+2, n+3, n+4, n+5, n+6, n+7, - &mnt->mnt_freq, &mnt->mnt_passno); - } while (cnt < 2 || linebuf[n[0]] == '#'); + + len = strlen(linebuf); + for (i = 0; i < sizeof n / sizeof *n; i++) n[i] = len; + if (sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d", + n, n+1, n+2, n+3, n+4, n+5, n+6, n+7, + &mnt->mnt_freq, &mnt->mnt_passno) == EOF && ferror(f)) + return 0; + } while (linebuf[n[0]] == '#'); linebuf[n[1]] = 0; linebuf[n[3]] = 0; @@ -54,6 +60,9 @@ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int bufle mnt->mnt_type = linebuf+n[4]; mnt->mnt_opts = linebuf+n[6]; + if (!*mnt->mnt_fsname) + return 0; + return mnt; } -- 2.32.0