This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

Do not open .gcda/.gcno files in write mode unnecessarily.


GCC currently always opens .gcda/.gcno files in write mode.  This
leads to permission denied errors when opening these files if the
files are read-only.  Having read-only .gcda files is useful to ensure
that one does not unintentionally modify profile data (by default, an
instrumented binary will append to .gcda files).  This patch modifies
the behavior of gcov_open to only open the file in write mode if the
MODE argument is >= 0.

Bootstrapped/regtested on x86_64-linux and i686-linux.  Verified that
FDO still works.  Ok for trunk?

2009-09-17  Neil Vachharajani  <nvachhar@gmail.com>

	* gcov-io.c (gcov_open): Open files read-only when MODE < 0


--- gcc/gcov-io.c.orig
+++ gcc/gcov-io.c
@@ -46,11 +46,13 @@

 /* Open a gcov file. NAME is the name of the file to open and MODE
    indicates whether a new file should be created, or an existing file
-   opened for modification. If MODE is >= 0 an existing file will be
-   opened, if possible, and if MODE is <= 0, a new file will be
-   created. Use MODE=0 to attempt to reopen an existing file and then
-   fall back on creating a new one.  Return zero on failure, >0 on
-   opening an existing file and <0 on creating a new one.  */
+   opened. If MODE is >= 0 an existing file will be opened, if
+   possible, and if MODE is <= 0, a new file will be created. Use
+   MODE=0 to attempt to reopen an existing file and then fall back on
+   creating a new one.  If MODE < 0, the file will be opened in
+   read-only mode.  Otherwise it will be opened for modification.
+   Return zero on failure, >0 on opening an existing file and <0 on
+   creating a new one.  */

 GCOV_LINKAGE int
 #if IN_LIBGCOV
@@ -66,7 +68,6 @@
   struct flock s_flock;
   int fd;

-  s_flock.l_type = F_WRLCK;
   s_flock.l_whence = SEEK_SET;
   s_flock.l_start = 0;
   s_flock.l_len = 0; /* Until EOF.  */
@@ -83,16 +84,25 @@
 #endif
 #if GCOV_LOCKED
   if (mode > 0)
-    fd = open (name, O_RDWR);
+    {
+      /* Read-only mode - acquire a read-lock.  */
+      s_flock.l_type = F_RDLCK;
+      fd = open (name, O_RDONLY);
+    }
   else
-    fd = open (name, O_RDWR | O_CREAT, 0666);
+    {
+      /* Write mode - acquire a write-lock.  */
+      s_flock.l_type = F_WRLCK;
+      fd = open (name, O_RDWR | O_CREAT, 0666);
+    }
   if (fd < 0)
     return 0;

   while (fcntl (fd, F_SETLKW, &s_flock) && errno == EINTR)
     continue;

-  gcov_var.file = fdopen (fd, "r+b");
+  gcov_var.file = fdopen (fd, (mode > 0) ? "rb" : "r+b");
+
   if (!gcov_var.file)
     {
       close (fd);
@@ -120,7 +130,8 @@
     gcov_var.mode = mode * 2 + 1;
 #else
   if (mode >= 0)
-    gcov_var.file = fopen (name, "r+b");
+    gcov_var.file = fopen (name, (mode > 0) ? "rb" : "r+b");
+
   if (gcov_var.file)
     gcov_var.mode = 1;
   else if (mode <= 0)


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