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 31106 invoked from network); 12 Oct 2021 02:37:05 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 12 Oct 2021 02:37:05 -0000 Received: (qmail 30524 invoked by uid 550); 12 Oct 2021 02:37:03 -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 30494 invoked from network); 12 Oct 2021 02:37:02 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=L7EOsJtOFENJTW2coDLWJF6qxd0rssjBLZOg54FLHKg=; b=W+mYqWOBjCoXTF86WXcrlATsF7X4pQEYVTsIQ11JSkMhq9KzMwuU17aQCnVqovkA15 +n8fLrGPcEaODo69cXuA5j6fHZcxHOdnyCO76LU7WdNPXvewg/d/mUWjsadX+qg57CbD cUGOR1u7+wgfsgqR3gyk5q32LDQt7/xk7KUMwe2/40hOig81oVkG1v8N1KmEfNvbniDq Qg0ulMtRXxOUPPGZWUNnKIfCjwPvX5HR5abeX+jOqOeAy7ABCx3tNIR+lBIIJ04pSx+C AP56zQ+fsJObclWWGFI+XyfZcWUqxpj2/t1eiqgtAeF4h9vLNhManvJkBEekotmpZbXJ GqPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=L7EOsJtOFENJTW2coDLWJF6qxd0rssjBLZOg54FLHKg=; b=rgxBVdaCnJJYr0ZosDCeM1LGQOp6PN1lYPaw8iztwp55Qfv7b7FfqZd/9MK3r4Bydt reOdsoH7AybmUXI2mydeRqLT6quDp65X+BLjpuCtQu37Z8xoYpF0d3AzeW+6qZGza8Gm Jz01mUYY9KZGnJrl4DSp+wHqMK3GeS6Kkdap7mLrjeuPxzOy0e9Ml2vXVtF5Rb1gNhj+ YmlOJGLXJEiBn99hemVoeat4P226CvchC6Ao0838xj/y/zZ8VSEu+lOf0ZvQBu4olYQ8 290fQcp5zpb0MHq4srBHPpnedmqLzYn8Bnf4wEkq4XsZbowSg3hj+syCT5xN9dZzTLvE yxxA== X-Gm-Message-State: AOAM531E5KGhihlodfM/anYxvrhWJ7FomjZEdCdJAkQHqJHffBlK5Ffj KFzl6IknCqOrVcu8ZN+RMsVLQQBU9VmXdQ== X-Google-Smtp-Source: ABdhPJxj9LJ1YNMXMBHcucg4IwADeO98Z6U7ohVZBC9yRkydOvlvVzbliJ1yc7VVcBx+xy9ZSQ2ymA== X-Received: by 2002:a17:90a:181:: with SMTP id 1mr3097178pjc.214.1634006209606; Mon, 11 Oct 2021 19:36:49 -0700 (PDT) From: Kaihang Zhang To: musl@lists.openwall.com, 2010267516@qq.com Cc: Kaihang Zhang Date: Mon, 11 Oct 2021 22:36:43 -0400 Message-Id: <20211012023643.44509-1-kaihang.zhang@smartx.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [PATCH] fix: Assign default value to mntent when linebuf is too small Function getmntent_r in source misc/mntent.c will do what glibc users expect. The rest of the line will be discarded when can not be read into linebuf, and the fields of struct mntent will be assigned to empty string or zero when can not be found in linebuf, instead of setting errno to ERANGE and exiting. --- src/misc/mntent.c | 54 +++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/misc/mntent.c b/src/misc/mntent.c index eabb8200..007c0b8d 100644 --- a/src/misc/mntent.c +++ b/src/misc/mntent.c @@ -21,12 +21,12 @@ 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); - - mnt->mnt_freq = 0; - mnt->mnt_passno = 0; + int use_internal = (linebuf == SENTINEL); + char *sub; do { + char *end_ptr; + if (use_internal) { getline(&internal_buf, &internal_bufsize, f); linebuf = internal_buf; @@ -34,25 +34,37 @@ struct mntent *getmntent_r(FILE *f, struct mntent *mnt, char *linebuf, int bufle fgets(linebuf, buflen, f); } if (feof(f) || ferror(f)) return 0; - if (!strchr(linebuf, '\n')) { + + end_ptr = strchr(linebuf, '\n'); + if (end_ptr != NULL) { + while ((end_ptr[-1] == ' ' || end_ptr[-1] == '\t') && end_ptr != linebuf) end_ptr--; + *end_ptr = '\0'; + } else { fscanf(f, "%*[^\n]%*[\n]"); - 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]] == '#'); - - linebuf[n[1]] = 0; - linebuf[n[3]] = 0; - linebuf[n[5]] = 0; - linebuf[n[7]] = 0; - - mnt->mnt_fsname = linebuf+n[0]; - mnt->mnt_dir = linebuf+n[2]; - mnt->mnt_type = linebuf+n[4]; - mnt->mnt_opts = linebuf+n[6]; + + linebuf += strspn(linebuf, " \t"); + } while (linebuf[0] == '\0' || linebuf[0] == '#'); + + mnt->mnt_fsname = strsep(&linebuf, " \t"); + + if (linebuf) linebuf += strspn(linebuf, " \t"); + sub = strsep(&linebuf, " \t"); + mnt->mnt_dir = sub ? sub : (char *) ""; + + if (linebuf) linebuf += strspn(linebuf, " \t"); + sub = strsep (&linebuf, " \t"); + mnt->mnt_type = sub ? sub : (char *) ""; + + if (linebuf) linebuf += strspn(linebuf, " \t"); + sub = strsep(&linebuf, " \t"); + mnt->mnt_opts = sub ? sub : (char *) ""; + + switch (linebuf ? sscanf(linebuf, " %d %d", &mnt->mnt_freq, &mnt->mnt_passno) : 0) { + case 0: mnt->mnt_freq = 0; + case 1: mnt->mnt_passno = 0; + case 2: break; + } return mnt; } -- 2.25.4