re PR libfortran/67527 (io.h sanitizer complains on 1 << 31)
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Sat, 12 Sep 2015 12:05:44 +0000 (12:05 +0000)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Sat, 12 Sep 2015 12:05:44 +0000 (12:05 +0000)
PR libfortran/67527
PR libfortran/67535
PR libfortran/67536
* io/io.h: Use unsigned values for 31-bit left shifts.
* io/unix.c (buf_read): Do not call memcpy() with NULL pointer arg.
* io/write.c (nml_write_obj): Likewise.

From-SVN: r227705

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/unix.c
libgfortran/io/write.c

index 8b4c27cbc95cb10dd5fd8c8ef6e94ba5ef2b2058..77030e9fd4bdb617bed4c6658fb6b608d25358d2 100644 (file)
@@ -1,3 +1,12 @@
+2015-09-12  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR libfortran/67527
+       PR libfortran/67535
+       PR libfortran/67536
+       * io/io.h: Use unsigned values for 31-bit left shifts.
+       * io/unix.c (buf_read): Do not call memcpy() with NULL pointer arg.
+       * io/write.c (nml_write_obj): Likewise.
+
 2015-09-05  Janne Blomqvist  <jb@gcc.gnu.org>
 
        PR fortran/53379
index f34d0c34cf6b66803b3d8a710484da6dab2290a4..1ff362778bdb1586a0e3456c676c5e3a819e442a 100644 (file)
@@ -311,7 +311,7 @@ st_parameter_filepos;
 #define IOPARM_INQUIRE_HAS_WRITE       (1 << 28)
 #define IOPARM_INQUIRE_HAS_READWRITE   (1 << 29)
 #define IOPARM_INQUIRE_HAS_CONVERT     (1 << 30)
-#define IOPARM_INQUIRE_HAS_FLAGS2      (1 << 31)
+#define IOPARM_INQUIRE_HAS_FLAGS2      (1u << 31)
 
 #define IOPARM_INQUIRE_HAS_ASYNCHRONOUS        (1 << 0)
 #define IOPARM_INQUIRE_HAS_DECIMAL     (1 << 1)
@@ -380,7 +380,7 @@ st_parameter_inquire;
 #define IOPARM_DT_HAS_SIGN                     (1 << 24)
 #define IOPARM_DT_HAS_F2003                     (1 << 25)
 /* Internal use bit.  */
-#define IOPARM_DT_IONML_SET                    (1 << 31)
+#define IOPARM_DT_IONML_SET                    (1u << 31)
 
 
 typedef struct st_parameter_dt
index 5385d8b770006000a99866f720321eb37ea36a3f..b86bd67c32326200624d257fbc4852ed147b8a2a 100644 (file)
@@ -489,7 +489,13 @@ buf_read (unix_stream * s, void * buf, ssize_t nbyte)
   /* Is the data we want in the buffer?  */
   if (s->logical_offset + nbyte <= s->buffer_offset + s->active
       && s->buffer_offset <= s->logical_offset)
-    memcpy (buf, s->buffer + (s->logical_offset - s->buffer_offset), nbyte);
+    {
+      /* When nbyte == 0, buf can be NULL which would lead to undefined
+        behavior if we called memcpy().  */
+      if (nbyte != 0)
+       memcpy (buf, s->buffer + (s->logical_offset - s->buffer_offset),
+               nbyte);
+    }
   else
     {
       /* First copy the active bytes if applicable, then read the rest
index e226236a4b5821f2e72b96f6f41fe5eb082e5516..6656c9768158daefdbf475f84d6b125c98c46913 100644 (file)
@@ -1833,7 +1833,8 @@ nml_write_obj (st_parameter_dt *dtp, namelist_info * obj, index_type offset,
                + strlen (obj->var_name) + obj->var_rank * NML_DIGITS + 1;
              ext_name = xmalloc (ext_name_len);
 
-             memcpy (ext_name, base_name, base_name_len);
+             if (base_name)
+               memcpy (ext_name, base_name, base_name_len);
              clen = strlen (obj->var_name + base_var_name_len);
              memcpy (ext_name + base_name_len, 
                      obj->var_name + base_var_name_len, clen);