This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Use *stat64 instead of *stat in installed programs


This ensures reliable operation on file systems with inode numbers
which do not fit into 32 bits.

--
Florian Weimer / Red Hat Product Security Team
2013-04-03  Florian Weimer  <fweimer@redhat.com>

	* elf/sprof.c (load_profdata): Use fstat64 instead of fstat.
	* iconv/iconv_charmap.c (charmap_conversion): Likewise.
	* iconv/iconv_prog.c (main): Likewise.
	* locale/programs/charmap-dir.c (charmap_readdir)
	(fopen_uncompressed): Likewise.
	* locale/programs/locfile.c (siblings_uncached)
	(write_locale_data): Use lstat64 instead of lstat.
	* sunrpc/rpc_main.c (find_cpp, checkfiles): Use stat64 instead of
	stat.

diff --git a/elf/sprof.c b/elf/sprof.c
index 54dfebd..5c70ec0 100644
--- a/elf/sprof.c
+++ b/elf/sprof.c
@@ -744,7 +744,7 @@ load_profdata (const char *name, struct shobj *shobj)
 {
   struct profdata *result;
   int fd;
-  struct stat st;
+  struct stat64 st;
   void *addr;
   uint32_t *narcsp;
   size_t fromlimit;
@@ -783,7 +783,7 @@ load_profdata (const char *name, struct shobj *shobj)
 
   /* We have found the file, now make sure it is the right one for the
      data file.  */
-  if (fstat (fd, &st) < 0)
+  if (fstat64 (fd, &st) < 0)
     {
       error (0, errno, _("while stat'ing profiling data file"));
       close (fd);
diff --git a/iconv/iconv_charmap.c b/iconv/iconv_charmap.c
index b1a0610..745adcc 100644
--- a/iconv/iconv_charmap.c
+++ b/iconv/iconv_charmap.c
@@ -171,11 +171,11 @@ charmap_conversion (const char *from_code, struct charmap_t *from_charmap,
 	  }
 
 #ifdef _POSIX_MAPPED_FILES
-	struct stat st;
+	struct stat64 st;
 	char *addr;
 	/* We have possibilities for reading the input file.  First try
 	   to mmap() it since this will provide the fastest solution.  */
-	if (fstat (fd, &st) == 0
+	if (fstat64 (fd, &st) == 0
 	    && ((addr = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE,
 			      fd, 0)) != MAP_FAILED))
 	  {
diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
index a42cc5b..1a1d0d0 100644
--- a/iconv/iconv_prog.c
+++ b/iconv/iconv_prog.c
@@ -275,7 +275,7 @@ conversions from `%s' and to `%s' are not supported"),
 	do
 	  {
 #ifdef _POSIX_MAPPED_FILES
-	    struct stat st;
+	    struct stat64 st;
 	    char *addr;
 #endif
 	    int fd, ret;
@@ -300,7 +300,7 @@ 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 (fstat (fd, &st) == 0
+	    if (fstat64 (fd, &st) == 0
 		&& ((addr = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE,
 				  fd, 0)) != MAP_FAILED))
 	      {
diff --git a/locale/programs/charmap-dir.c b/locale/programs/charmap-dir.c
index 03d0cb1..3edf720 100644
--- a/locale/programs/charmap-dir.c
+++ b/locale/programs/charmap-dir.c
@@ -121,9 +121,9 @@ charmap_readdir (CHARMAP_DIR *cdir)
       else
 #endif
         {
-          struct stat statbuf;
+          struct stat64 statbuf;
 
-          if (stat (cdir->pathname, &statbuf) < 0)
+          if (stat64 (cdir->pathname, &statbuf) < 0)
             continue;
 
           mode = statbuf.st_mode;
@@ -167,10 +167,10 @@ fopen_uncompressed (const char *pathname, const char *compressor)
   pfd = open (pathname, O_RDONLY);
   if (pfd >= 0)
     {
-      struct stat statbuf;
+      struct stat64 statbuf;
       int fd[2];
 
-      if (fstat (pfd, &statbuf) >= 0
+      if (fstat64 (pfd, &statbuf) >= 0
           && S_ISREG (statbuf.st_mode)
           && pipe (fd) >= 0)
         {
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index 10c3dc9..3cbd6f1 100644
--- a/locale/programs/locfile.c
+++ b/locale/programs/locfile.c
@@ -355,7 +355,7 @@ siblings_uncached (const char *output_path)
 {
   size_t len;
   char *base, *p;
-  struct stat output_stat;
+  struct stat64 output_stat;
   DIR *dirp;
   int nelems;
   const char **elems;
@@ -378,7 +378,7 @@ siblings_uncached (const char *output_path)
   len = p - base;
 
   /* Get the properties of output_path.  */
-  if (lstat (output_path, &output_stat) < 0 || !S_ISDIR (output_stat.st_mode))
+  if (lstat64 (output_path, &output_stat) < 0 || !S_ISDIR (output_stat.st_mode))
     return NULL;
 
   /* Iterate through the directories in base directory.  */
@@ -392,7 +392,7 @@ siblings_uncached (const char *output_path)
       struct dirent64 *other_dentry;
       const char *other_name;
       char *other_path;
-      struct stat other_stat;
+      struct stat64 other_stat;
 
       other_dentry = readdir64 (dirp);
       if (other_dentry == NULL)
@@ -407,7 +407,7 @@ siblings_uncached (const char *output_path)
       other_path[len] = '/';
       strcpy (other_path + len + 1, other_name);
 
-      if (lstat (other_path, &other_stat) >= 0
+      if (lstat64 (other_path, &other_stat) >= 0
 	  && S_ISDIR (other_stat.st_mode)
 	  && other_stat.st_uid == output_stat.st_uid
 	  && other_stat.st_gid == output_stat.st_gid
@@ -580,9 +580,9 @@ write_locale_data (const char *output_path, int catidx, const char *category,
   fd = -2;
   if (strcmp (category, "LC_MESSAGES") == 0)
     {
-      struct stat st;
+      struct stat64 st;
 
-      if (stat (fname, &st) < 0)
+      if (stat64 (fname, &st) < 0)
 	{
 	  if (mkdir (fname, 0777) >= 0)
 	    {
@@ -659,9 +659,9 @@ failure while writing data for category `%s'"), category));
   other_paths = siblings (output_path);
   if (other_paths != NULL)
     {
-      struct stat fname_stat;
+      struct stat64 fname_stat;
 
-      if (lstat (fname, &fname_stat) >= 0
+      if (lstat64 (fname, &fname_stat) >= 0
 	  && S_ISREG (fname_stat.st_mode))
 	{
 	  const char *fname_tail = fname + strlen (output_path);
@@ -680,14 +680,14 @@ failure while writing data for category `%s'"), category));
 	      const char *other_path = *other_p;
 	      size_t other_path_len = strlen (other_path);
 	      char *other_fname;
-	      struct stat other_fname_stat;
+	      struct stat64 other_fname_stat;
 
 	      other_fname =
 		(char *) xmalloc (other_path_len + strlen (fname_tail) + 1);
 	      memcpy (other_fname, other_path, other_path_len);
 	      strcpy (other_fname + other_path_len, fname_tail);
 
-	      if (lstat (other_fname, &other_fname_stat) >= 0
+	      if (lstat64 (other_fname, &other_fname_stat) >= 0
 		  && S_ISREG (other_fname_stat.st_mode)
 		  /* Consider only files on the same device.
 		     Otherwise hard linking won't work anyway.  */
diff --git a/sunrpc/rpc_main.c b/sunrpc/rpc_main.c
index 1477b43..8d896d9 100644
--- a/sunrpc/rpc_main.c
+++ b/sunrpc/rpc_main.c
@@ -322,9 +322,9 @@ clear_args (void)
 static void
 find_cpp (void)
 {
-  struct stat buf;
+  struct stat64 buf;
 
-  if (stat (CPP, &buf) == 0)
+  if (stat64 (CPP, &buf) == 0)
     return;
 
   if (cppDefined) /* user specified cpp but it does not exist */
@@ -1110,17 +1110,17 @@ putarg (int whereto, const char *cp)
 static void
 checkfiles (const char *infile, const char *outfile)
 {
-  struct stat buf;
+  struct stat64 buf;
 
   if (infile)			/* infile ! = NULL */
-    if (stat (infile, &buf) < 0)
+    if (stat64 (infile, &buf) < 0)
       {
 	perror (infile);
 	crash ();
       }
   if (outfile)
     {
-      if (stat (outfile, &buf) < 0)
+      if (stat64 (outfile, &buf) < 0)
 	return;			/* file does not exist */
       else
 	{
-- 
1.8.1.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]