strip: don't crash with -D_FORTIFY_SOURCE enabled (ubuntu gcc)

This commit is contained in:
Thomas Pöchtrager 2015-03-19 21:14:13 +01:00
parent 268c3de73b
commit 5098fc9f6d

View File

@ -889,14 +889,34 @@ enum bool all_archs)
archs[i].toc_long_name = TRUE;
}
if(archs[i].members[j].object != NULL){
char tmp[32]; /* cctools-port */
int len; /* cctools-port */
size +=
rnd(archs[i].members[j].object->object_size -
archs[i].members[j].object->input_sym_info_size +
archs[i].members[j].object->output_sym_info_size,
8);
#if 0
/*
* cctools-port: This causes a crash with
* -D_FORTIFY_SOURCE enabled ('\0' "overflows" the
* buffer).
*/
sprintf(archs[i].members[j].ar_hdr->ar_size, "%-*ld",
(int)sizeof(archs[i].members[j].ar_hdr->ar_size),
(long)(size));
#endif
/* cctools-port start */
len = sprintf(tmp, "%-*ld",
(int)sizeof(archs[i].members[j].ar_hdr->ar_size),
(long)(size));
if(len !=
(int)sizeof(archs[i].members[j].ar_hdr->ar_size)){
fprintf(stderr, "corrupted object file\n");
abort();
}
memcpy(&archs[i].members[j].ar_hdr->ar_size, tmp, len);
/* cctools-port end */
/*
* This has to be done by hand because sprintf puts a
* null at the end of the buffer.