about summary refs log tree commit diff
path: root/intl/loadmsgcat.c
diff options
context:
space:
mode:
Diffstat (limited to 'intl/loadmsgcat.c')
-rw-r--r--intl/loadmsgcat.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
index 43158c4cfa..a67223ff7e 100644
--- a/intl/loadmsgcat.c
+++ b/intl/loadmsgcat.c
@@ -69,6 +69,7 @@ _nl_load_domain (domain_file)
      struct loaded_l10nfile *domain_file;
 {
   int fd;
+  size_t size;
   struct stat st;
   struct mo_file_header *data = (struct mo_file_header *) -1;
 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
@@ -94,7 +95,8 @@ _nl_load_domain (domain_file)
 
   /* We must know about the size of the file.  */
   if (fstat (fd, &st) != 0
-      && st.st_size < (off_t) sizeof (struct mo_file_header))
+      || (size = (size_t) st.st_size) != st.st_size
+      || size < sizeof (struct mo_file_header))
     {
       /* Something went wrong.  */
       close (fd);
@@ -105,7 +107,7 @@ _nl_load_domain (domain_file)
     || defined _LIBC
   /* Now we are ready to load the file.  If mmap() is available we try
      this first.  If not available or it failed we try to load it.  */
-  data = (struct mo_file_header *) mmap (NULL, st.st_size, PROT_READ,
+  data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
 					 MAP_PRIVATE, fd, 0);
 
   if (data != (struct mo_file_header *) -1)
@@ -120,14 +122,14 @@ _nl_load_domain (domain_file)
      it manually.  */
   if (data == (struct mo_file_header *) -1)
     {
-      off_t to_read;
+      size_t to_read;
       char *read_ptr;
 
-      data = (struct mo_file_header *) malloc (st.st_size);
+      data = (struct mo_file_header *) malloc (size);
       if (data == NULL)
 	return;
 
-      to_read = st.st_size;
+      to_read = size;
       read_ptr = (char *) data;
       do
 	{
@@ -154,7 +156,7 @@ _nl_load_domain (domain_file)
 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
     || defined _LIBC
       if (use_mmap)
-	munmap ((caddr_t) data, st.st_size);
+	munmap ((caddr_t) data, size);
       else
 #endif
 	free (data);
@@ -169,7 +171,7 @@ _nl_load_domain (domain_file)
   domain = (struct loaded_domain *) domain_file->data;
   domain->data = (char *) data;
   domain->use_mmap = use_mmap;
-  domain->mmap_size = st.st_size;
+  domain->mmap_size = size;
   domain->must_swap = data->magic != _MAGIC;
 
   /* Fill in the information about the available tables.  */
@@ -190,7 +192,7 @@ _nl_load_domain (domain_file)
 #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
     || defined _LIBC
       if (use_mmap)
-	munmap ((caddr_t) data, st.st_size);
+	munmap ((caddr_t) data, size);
       else
 #endif
 	free (data);