]> code.ossystems Code Review - openembedded-core.git/blob
265e52633b85267f06207d4a9a203475aff0ca04
[openembedded-core.git] /
1 From 2a50366ded329bfb39d387253450c9d5302c3503 Mon Sep 17 00:00:00 2001
2 From: Robert Yang <liezhi.yang@windriver.com>
3 Date: Tue, 14 Aug 2018 12:22:35 +0100
4 Subject: [PATCH] as.c: Improve check for input file matching output file.
5
6 When the assembler reports that the input and output are the same, report the
7 file names involved, in order to help debugging.  Also do not equate two files
8 are the same if the have the same inode value but reside on different file
9 systems.
10
11 Upstream-Status: Backport
12
13 Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
14 ---
15  gas/as.c      | 27 ++++++++++++++++++++-------
16  2 files changed, 20 insertions(+), 7 deletions(-)
17
18 diff --git a/gas/as.c b/gas/as.c
19 index b2a908a..3105d06 100644
20 --- a/gas/as.c
21 +++ b/gas/as.c
22 @@ -1259,14 +1259,27 @@ main (int argc, char ** argv)
23         {
24           struct stat sib;
25  
26 -         if (stat (argv[i], &sib) == 0)
27 +         /* Check that the input file and output file are different.  */
28 +         if (stat (argv[i], &sib) == 0
29 +             && sib.st_ino == sob.st_ino
30 +             /* POSIX emulating systems may support stat() but if the
31 +                underlying file system does not support a file serial number
32 +                of some kind then they will return 0 for the inode.  So
33 +                two files with an inode of 0 may not actually be the same.
34 +                On real POSIX systems no ordinary file will ever have an
35 +                inode of 0.  */
36 +             && sib.st_ino != 0
37 +             /* Different files may have the same inode number if they
38 +                reside on different devices, so check the st_dev field as
39 +                well.  */
40 +             && sib.st_dev == sob.st_dev)
41             {
42 -             if (sib.st_ino == sob.st_ino && sib.st_ino != 0)
43 -               {
44 -                 /* Don't let as_fatal remove the output file!  */
45 -                 out_file_name = NULL;
46 -                 as_fatal (_("The input and output files must be distinct"));
47 -               }
48 +             const char *saved_out_file_name = out_file_name;
49 +
50 +             /* Don't let as_fatal remove the output file!  */
51 +             out_file_name = NULL;
52 +             as_fatal (_("The input '%s' and output '%s' files are the same"),
53 +                       argv[i], saved_out_file_name);
54             }
55         }
56      }
57 -- 
58 2.7.4
59