git-iconv-Do-not-use-mmap-in-iconv-the-program-bug-17703
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Sat, 23 Nov 2024 13:57:03 +0000 (14:57 +0100)
committerAurelien Jarno <aurel32@debian.org>
Sat, 23 Nov 2024 13:57:03 +0000 (14:57 +0100)
commit 49449cbb3580bbdfb2e17fb5140db54496928219
Author: Florian Weimer <fweimer@redhat.com>
Date:   Fri Sep 20 13:10:54 2024 +0200

    iconv: Do not use mmap in iconv (the program) (bug 17703)

    On current systems, very large files are needed before
    mmap becomes beneficial.  Simplify the implementation.

    This exposed that inptr was not initialized correctly in
    process_fd.  Handling multiple input files resulted in
    EFAULT in read because a null pointer was passed.  This
    could be observed previously if an input file was not
    mappable and was reported as bug 17703.

Reviewed-by: DJ Delorie <dj@redhat.com>
Gbp-Pq: Topic any
Gbp-Pq: Name git-iconv-Do-not-use-mmap-in-iconv-the-program-bug-17703.patch

iconv/iconv_prog.c

index a765b1af21d2bde0e87ad94391f561c31428065a..88a928557e7afb0a6b0c9369eb57c3bc10bff6ce 100644 (file)
@@ -31,9 +31,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <libintl.h>
-#ifdef _POSIX_MAPPED_FILES
-# include <sys/mman.h>
-#endif
 #include <charmap.h>
 #include <gconv_int.h>
 #include "iconv_prog.h"
@@ -253,10 +250,6 @@ conversions from `%s' and to `%s' are not supported"),
       else
        do
          {
-#ifdef _POSIX_MAPPED_FILES
-           struct stat64 st;
-           char *addr;
-#endif
            int fd, ret;
 
            if (verbose)
@@ -276,39 +269,6 @@ conversions from `%s' and to `%s' are not supported"),
                  }
              }
 
-#ifdef _POSIX_MAPPED_FILES
-           /* We have possibilities for reading the input file.  First try
-              to mmap() it since this will provide the fastest solution.  */
-           if (fstat64 (fd, &st) == 0
-               && ((addr = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE,
-                                 fd, 0)) != MAP_FAILED))
-             {
-               /* Yes, we can use mmap().  The descriptor is not needed
-                  anymore.  */
-               if (close (fd) != 0)
-                 error (EXIT_FAILURE, errno,
-                        _("error while closing input `%s'"),
-                        argv[remaining]);
-
-               ret = process_block (cd, addr, st.st_size, &output,
-                                    output_file);
-
-               /* We don't need the input data anymore.  */
-               munmap ((void *) addr, st.st_size);
-
-               if (ret != 0)
-                 {
-                   status = EXIT_FAILURE;
-
-                   if (ret < 0)
-                     /* We cannot go on with producing output since it might
-                        lead to problem because the last output might leave
-                        the output stream in an undefined state.  */
-                     break;
-                 }
-             }
-           else
-#endif /* _POSIX_MAPPED_FILES */
              {
                /* Read the file in pieces.  */
                ret = process_fd (cd, fd, &output, output_file);
@@ -544,7 +504,7 @@ process_fd (iconv_t cd, int fd, FILE **output, const char *output_file)
      process it in one step.  */
   static char *inbuf = NULL;
   static size_t maxlen = 0;
-  char *inptr = NULL;
+  char *inptr = inbuf;
   size_t actlen = 0;
 
   while (actlen < maxlen)