]> git.pld-linux.org Git - packages/binutils.git/blame - binutils-robustify6.patch
This commit was manufactured by cvs2git to create branch 'AC-branch'.
[packages/binutils.git] / binutils-robustify6.patch
CommitLineData
52cb69e7
AM
12005-06-21 Jakub Jelinek <jakub@redhat.com>
2
3 * libbfd-in.h (struct artdata): Add extended_names_size field.
4 * libbfd.h: Rebuilt.
5 * coff-rs600.c (_bfd_xcoff_archive_p): Don't clear fields in freshly
6 allocated object by bfd_zalloc.
7 * coff64-rs6000.c (xcoff64_archive_p): Likewise.
8 * ecoff.c (_bfd_ecoff_archive_p): Likewise.
9 * archive.c (_bfd_generic_mkarchive, bfd_generic_archive_p): Likewise.
10 (get_extended_arelt_filename): Fail if index is bigger or equal to
11 extended_names_size.
12 (_bfd_generic_read_ar_hdr_mag): Don't set bfd_error_malformed_archive,
13 get_extended_arelt_filename already did that.
14 (_bfd_slurp_extended_name_table): Initialize extended_names_size field.
15 Allocate one extra byte and clear it, in case extended names table
16 is not terminated.
17
18--- bfd/libbfd-in.h.jj 2005-06-20 12:16:18.000000000 +0200
19+++ bfd/libbfd-in.h 2005-06-21 18:45:56.000000000 +0200
20@@ -64,6 +64,7 @@ struct artdata {
21 carsym *symdefs; /* the symdef entries */
22 symindex symdef_count; /* how many there are */
23 char *extended_names; /* clever intel extension */
24+ bfd_size_type extended_names_size; /* Size of extended names */
25 /* when more compilers are standard C, this can be a time_t */
26 long armap_timestamp; /* Timestamp value written into armap.
27 This is used for BSD archives to check
28--- bfd/libbfd.h.jj 2005-06-20 12:16:18.000000000 +0200
29+++ bfd/libbfd.h 2005-06-21 18:46:32.000000000 +0200
30@@ -69,6 +69,7 @@ struct artdata {
31 carsym *symdefs; /* the symdef entries */
32 symindex symdef_count; /* how many there are */
33 char *extended_names; /* clever intel extension */
34+ bfd_size_type extended_names_size; /* Size of extended names */
35 /* when more compilers are standard C, this can be a time_t */
36 long armap_timestamp; /* Timestamp value written into armap.
37 This is used for BSD archives to check
38--- bfd/coff64-rs6000.c.jj 2005-06-09 10:58:49.000000000 +0200
39+++ bfd/coff64-rs6000.c 2005-06-21 18:59:07.000000000 +0200
40@@ -1983,10 +1983,12 @@ xcoff64_archive_p (abfd)
41 if (bfd_ardata (abfd) == (struct artdata *) NULL)
42 goto error_ret_restore;
43
44- bfd_ardata (abfd)->cache = NULL;
45- bfd_ardata (abfd)->archive_head = NULL;
46- bfd_ardata (abfd)->symdefs = NULL;
47- bfd_ardata (abfd)->extended_names = NULL;
48+ /* Already cleared by bfd_zalloc above.
49+ bfd_ardata (abfd)->cache = NULL;
50+ bfd_ardata (abfd)->archive_head = NULL;
51+ bfd_ardata (abfd)->symdefs = NULL;
52+ bfd_ardata (abfd)->extended_names = NULL;
53+ bfd_ardata (abfd)->extended_names_size = 0; */
54 bfd_ardata (abfd)->first_file_filepos = bfd_scan_vma (hdr.firstmemoff,
55 (const char **) NULL,
56 10);
57--- bfd/coff-rs6000.c.jj 2005-06-09 10:58:49.000000000 +0200
58+++ bfd/coff-rs6000.c 2005-06-21 18:56:11.000000000 +0200
59@@ -1294,10 +1294,12 @@ _bfd_xcoff_archive_p (abfd)
60 if (bfd_ardata (abfd) == (struct artdata *) NULL)
61 goto error_ret_restore;
62
63- bfd_ardata (abfd)->cache = NULL;
64- bfd_ardata (abfd)->archive_head = NULL;
65- bfd_ardata (abfd)->symdefs = NULL;
66- bfd_ardata (abfd)->extended_names = NULL;
67+ /* Cleared by bfd_zalloc above.
68+ bfd_ardata (abfd)->cache = NULL;
69+ bfd_ardata (abfd)->archive_head = NULL;
70+ bfd_ardata (abfd)->symdefs = NULL;
71+ bfd_ardata (abfd)->extended_names = NULL;
72+ bfd_ardata (abfd)->extended_names_size = 0; */
73
74 /* Now handle the two formats. */
75 if (magic[1] != 'b')
76--- bfd/ecoff.c.jj 2005-05-13 23:44:07.000000000 +0200
77+++ bfd/ecoff.c 2005-06-21 18:59:49.000000000 +0200
78@@ -3182,11 +3182,13 @@ _bfd_ecoff_archive_p (bfd *abfd)
79 }
80
81 bfd_ardata (abfd)->first_file_filepos = SARMAG;
82- bfd_ardata (abfd)->cache = NULL;
83- bfd_ardata (abfd)->archive_head = NULL;
84- bfd_ardata (abfd)->symdefs = NULL;
85- bfd_ardata (abfd)->extended_names = NULL;
86- bfd_ardata (abfd)->tdata = NULL;
87+ /* Already cleared by bfd_zalloc above.
88+ bfd_ardata (abfd)->cache = NULL;
89+ bfd_ardata (abfd)->archive_head = NULL;
90+ bfd_ardata (abfd)->symdefs = NULL;
91+ bfd_ardata (abfd)->extended_names = NULL;
92+ bfd_ardata (abfd)->extended_names_size = 0;
93+ bfd_ardata (abfd)->tdata = NULL; */
94
95 if (! _bfd_ecoff_slurp_armap (abfd)
96 || ! _bfd_ecoff_slurp_extended_name_table (abfd))
97--- bfd/archive.c.jj 2005-06-17 15:22:56.000000000 +0200
98+++ bfd/archive.c 2005-06-21 19:03:51.000000000 +0200
99@@ -182,11 +182,13 @@ _bfd_generic_mkarchive (bfd *abfd)
100 if (bfd_ardata (abfd) == NULL)
101 return FALSE;
102
103- bfd_ardata (abfd)->cache = NULL;
104- bfd_ardata (abfd)->archive_head = NULL;
105- bfd_ardata (abfd)->symdefs = NULL;
106- bfd_ardata (abfd)->extended_names = NULL;
107- bfd_ardata (abfd)->tdata = NULL;
108+ /* Already cleared by bfd_zalloc above.
109+ bfd_ardata (abfd)->cache = NULL;
110+ bfd_ardata (abfd)->archive_head = NULL;
111+ bfd_ardata (abfd)->symdefs = NULL;
112+ bfd_ardata (abfd)->extended_names = NULL;
113+ bfd_ardata (abfd)->extended_names_size = 0;
114+ bfd_ardata (abfd)->tdata = NULL; */
115
116 return TRUE;
117 }
118@@ -335,7 +337,7 @@ get_extended_arelt_filename (bfd *arch,
119 errno = 0;
120 /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */
121 index = strtol (name + 1, NULL, 10);
122- if (errno != 0)
123+ if (errno != 0 || index >= bfd_ardata (arch)->extended_names_size)
124 {
125 bfd_set_error (bfd_error_malformed_archive);
126 return NULL;
127@@ -405,10 +407,7 @@ _bfd_generic_read_ar_hdr_mag (bfd *abfd,
128 {
129 filename = get_extended_arelt_filename (abfd, hdr.ar_name);
130 if (filename == NULL)
131- {
132- bfd_set_error (bfd_error_malformed_archive);
133- return NULL;
134- }
135+ return NULL;
136 }
137 /* BSD4.4-style long filename.
138 Only implemented for reading, so far! */
139@@ -629,11 +628,13 @@ bfd_generic_archive_p (bfd *abfd)
140 }
141
142 bfd_ardata (abfd)->first_file_filepos = SARMAG;
143- bfd_ardata (abfd)->cache = NULL;
144- bfd_ardata (abfd)->archive_head = NULL;
145- bfd_ardata (abfd)->symdefs = NULL;
146- bfd_ardata (abfd)->extended_names = NULL;
147- bfd_ardata (abfd)->tdata = NULL;
148+ /* Cleared by bfd_zalloc above.
149+ bfd_ardata (abfd)->cache = NULL;
150+ bfd_ardata (abfd)->archive_head = NULL;
151+ bfd_ardata (abfd)->symdefs = NULL;
152+ bfd_ardata (abfd)->extended_names = NULL;
153+ bfd_ardata (abfd)->extended_names_size = 0;
154+ bfd_ardata (abfd)->tdata = NULL; */
155
156 if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))
157 || !BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd)))
158@@ -1067,6 +1068,7 @@ _bfd_slurp_extended_name_table (bfd *abf
159 strncmp (nextname, "// ", 16) != 0)
160 {
161 bfd_ardata (abfd)->extended_names = NULL;
162+ bfd_ardata (abfd)->extended_names_size = 0;
163 return TRUE;
164 }
165
166@@ -1075,7 +1077,11 @@ _bfd_slurp_extended_name_table (bfd *abf
167 return FALSE;
168
169 amt = namedata->parsed_size;
170- bfd_ardata (abfd)->extended_names = bfd_zalloc (abfd, amt);
171+ if (amt + 1 == 0)
172+ goto byebye;
173+
174+ bfd_ardata (abfd)->extended_names_size = amt;
175+ bfd_ardata (abfd)->extended_names = bfd_zalloc (abfd, amt + 1);
176 if (bfd_ardata (abfd)->extended_names == NULL)
177 {
178 byebye:
179@@ -1098,15 +1104,17 @@ _bfd_slurp_extended_name_table (bfd *abf
180 trailing '/'. DOS/NT created archive often have \ in them
181 We'll fix all problems here.. */
182 {
183- char *temp = bfd_ardata (abfd)->extended_names;
184+ char *ext_names = bfd_ardata (abfd)->extended_names;
185+ char *temp = ext_names;
186 char *limit = temp + namedata->parsed_size;
187 for (; temp < limit; ++temp)
188 {
189 if (*temp == '\012')
190- temp[temp[-1] == '/' ? -1 : 0] = '\0';
191+ temp[temp > ext_names && temp[-1] == '/' ? -1 : 0] = '\0';
192 if (*temp == '\\')
193 *temp = '/';
194 }
195+ *limit = '\0';
196 }
197
198 /* Pad to an even boundary if you have to. */
This page took 0.131235 seconds and 4 git commands to generate.