From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 91271 invoked by alias); 17 Jan 2020 14:04:43 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 91232 invoked by uid 89); 17 Jan 2020 14:04:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.3 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-18.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 spammy= X-Spam-Status: No, score=-18.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on sourceware.org X-Spam-Level: X-HELO: us-smtp-1.mimecast.com Received: from us-smtp-delivery-1.mimecast.com (HELO us-smtp-1.mimecast.com) (205.139.110.120) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 17 Jan 2020 14:04:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1579269872; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=TNR69hkN/BSeTUkifODP2c14lwNJxLoePs9nyk4HvWE=; b=Uk8YuB2tDz7KgVvryhCbwnKTPcWJGlA4OaqUwUKIAk/4ZSt1epyWO6Jm5a6rPC1i5nzZYu GlE/NUXyFLIZgBcn4WK7IKd/WTyQGJhJaZu2yARosva89u1TLytIxSkRdRD6JEYkL13m0/ uz4mtXEKOiVoMfrVyCa8AfPRJDicAXI= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-184-Iju0b3xOODWooQE9s4oDsw-1; Fri, 17 Jan 2020 09:04:31 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B5FF8800A02 for ; Fri, 17 Jan 2020 14:04:30 +0000 (UTC) Received: from oldenburg2.str.redhat.com (ovpn-117-165.ams2.redhat.com [10.36.117.165]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 444301001901 for ; Fri, 17 Jan 2020 14:04:30 +0000 (UTC) Received: by oldenburg2.str.redhat.com (Postfix, from userid 1000) id A8A288299EE2; Fri, 17 Jan 2020 15:04:28 +0100 (CET) Date: Wed, 01 Jan 2020 00:00:00 -0000 To: libc-stable@sourceware.org Subject: [2.30 COMMITTED] login: Fix updwtmp, updwtmx unlocking User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Message-Id: <20200117140428.A8A288299EE2@oldenburg2.str.redhat.com> From: Florian Weimer X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: Iju0b3xOODWooQE9s4oDsw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2020-01/txt/msg00004.txt.bz2 Commit 5a3afa9738f3dbbaf8c0a35665318c1af782111b (login: Replace macro-based control flow with function calls in utmp) introduced a regression because after it, __libc_updwtmp attempts to unlock the wrong file descriptor. (cherry picked from commit 341da5b4b6253de9a7581a066f33f89cacb44dec) 2019-08-15 Florian Weimer * login/utmp_file.c (__libc_updwtmp): Unlock the right file descriptor. * login/Makefile (tests): Add tst-updwtmpx. * login/tst-updwtmpx.c: New file. diff --git a/login/Makefile b/login/Makefile index 92535f0aec..f9c4264087 100644 --- a/login/Makefile +++ b/login/Makefile @@ -43,7 +43,7 @@ endif subdir-dirs = programs vpath %.c programs -tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin +tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx # Build the -lutil library with these extra functions. extra-libs := libutil diff --git a/login/tst-updwtmpx.c b/login/tst-updwtmpx.c new file mode 100644 index 0000000000..0a4a27daeb --- /dev/null +++ b/login/tst-updwtmpx.c @@ -0,0 +1,112 @@ +/* Basic test coverage for updwtmpx. + Copyright (C) 2019 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; see the file COPYING.LIB. If + not, see . */ + +/* This program runs a series of tests. Each one calls updwtmpx + twice, to write two records, optionally with misalignment in the + file, and reads back the results. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int +do_test (void) +{ + /* Two entries filled with an arbitrary bit pattern. */ + struct utmpx entries[2]; + unsigned char pad; + { + unsigned char *p = (unsigned char *) &entries[0]; + for (size_t i = 0; i < sizeof (entries); ++i) + { + p[i] = i; + } + /* Make sure that the first and second entry and the padding are + different. */ + p[sizeof (struct utmpx)] = p[0] + 1; + pad = p[0] + 2; + } + + char *path; + int fd = create_temp_file ("tst-updwtmpx-", &path); + + /* Used to check that updwtmpx does not leave an open file + descriptor around. */ + struct support_descriptors *descriptors = support_descriptors_list (); + + /* updwtmpx is expected to remove misalignment. Optionally insert + one byte of misalignment at the start and in the middle (after + the first entry). */ + for (int misaligned_start = 0; misaligned_start < 2; ++misaligned_start) + for (int misaligned_middle = 0; misaligned_middle < 2; ++misaligned_middle) + { + if (test_verbose > 0) + printf ("info: misaligned_start=%d misaligned_middle=%d\n", + misaligned_start, misaligned_middle); + + xftruncate (fd, 0); + TEST_COMPARE (pwrite64 (fd, &pad, misaligned_start, 0), + misaligned_start); + + /* Write first entry and check it. */ + errno = 0; + updwtmpx (path, &entries[0]); + TEST_COMPARE (errno, 0); + support_descriptors_check (descriptors); + TEST_COMPARE (xlseek (fd, 0, SEEK_END), sizeof (struct utmpx)); + struct utmpx buffer; + TEST_COMPARE (pread64 (fd, &buffer, sizeof (buffer), 0), + sizeof (buffer)); + TEST_COMPARE_BLOB (&entries[0], sizeof (entries[0]), + &buffer, sizeof (buffer)); + + /* Middle mis-alignmet. */ + TEST_COMPARE (pwrite64 (fd, &pad, misaligned_middle, + sizeof (struct utmpx)), misaligned_middle); + + /* Write second entry and check both entries. */ + errno = 0; + updwtmpx (path, &entries[1]); + TEST_COMPARE (errno, 0); + support_descriptors_check (descriptors); + TEST_COMPARE (xlseek (fd, 0, SEEK_END), 2 * sizeof (struct utmpx)); + TEST_COMPARE (pread64 (fd, &buffer, sizeof (buffer), 0), + sizeof (buffer)); + TEST_COMPARE_BLOB (&entries[0], sizeof (entries[0]), + &buffer, sizeof (buffer)); + TEST_COMPARE (pread64 (fd, &buffer, sizeof (buffer), sizeof (buffer)), + sizeof (buffer)); + TEST_COMPARE_BLOB (&entries[1], sizeof (entries[1]), + &buffer, sizeof (buffer)); + } + + support_descriptors_free (descriptors); + free (path); + xclose (fd); + + return 0; +} + +#include diff --git a/login/utmp_file.c b/login/utmp_file.c index 7bd6034af4..5e4e66d1d0 100644 --- a/login/utmp_file.c +++ b/login/utmp_file.c @@ -503,7 +503,7 @@ __libc_updwtmp (const char *file, const struct utmp *utmp) result = 0; unlock_return: - file_unlock (file_fd); + file_unlock (fd); file_lock_restore (&fl); /* Close WTMP file. */