uniq-fopen.patch (2141B)
- SPDX-FileCopyrightText: 2005 Paul Eggert <eggert@cs.ucla.edu>
- SPDX-FileCopyrightText: 2023 Emily Trau <emily@downunderctf.com>
- SPDX-License-Identifier: GPL-2.0-or-later
- uniq: don't assume fopen cannot return stdin or stdout.
- Backport of https://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=786ebb2ceca72f69aa2de701671fb41f53cb1489
- --- coreutils-5.0/src/uniq.c
- +++ coreutils-5.0/src/uniq.c
- @@ -30,6 +30,7 @@
- #include "error.h"
- #include "hard-locale.h"
- #include "posixver.h"
- +#include "stdio-safer.h"
- #include "xmemcoll.h"
- #include "xstrtol.h"
- #include "memcasecmp.h"
- @@ -267,20 +268,26 @@ check_file (const char *infile, const char *outfile)
- FILE *ostream;
- struct linebuffer lb1, lb2;
- struct linebuffer *thisline, *prevline;
- + bool is_stdin = STREQ (infile, "-");
- + bool is_stdout = STREQ (outfile, "-");
- - if (STREQ (infile, "-"))
- + if (is_stdin)
- istream = stdin;
- else
- - istream = fopen (infile, "r");
- - if (istream == NULL)
- - error (EXIT_FAILURE, errno, "%s", infile);
- + {
- + istream = fopen_safer (infile, "r");
- + if (! istream)
- + error (EXIT_FAILURE, errno, "%s", infile);
- + }
- - if (STREQ (outfile, "-"))
- + if (is_stdout)
- ostream = stdout;
- else
- - ostream = fopen (outfile, "w");
- - if (ostream == NULL)
- - error (EXIT_FAILURE, errno, "%s", outfile);
- + {
- + ostream = fopen_safer (outfile, "w");
- + if (! ostream)
- + error (EXIT_FAILURE, errno, "%s", outfile);
- + }
- thisline = &lb1;
- prevline = &lb2;
- @@ -377,12 +384,12 @@ check_file (const char *infile, const char *outfile)
- }
- closefiles:
- - if (ferror (istream) || fclose (istream) == EOF)
- + if (!is_stdin && (ferror (istream) || fclose (istream) != 0))
- error (EXIT_FAILURE, errno, _("error reading %s"), infile);
- /* Close ostream only if it's not stdout -- the latter is closed
- via the atexit-invoked close_stdout. */
- - if (ostream != stdout && (ferror (ostream) || fclose (ostream) == EOF))
- + if (!is_stdout && (ferror (ostream) || fclose (ostream) != 0))
- error (EXIT_FAILURE, errno, _("error writing %s"), outfile);
- free (lb1.buffer);