windres_get_* functions

windres_get_32 and similar have a length parameter that in most cases
is just the required length, so it is redundant.  The few cases where
a variable length is passed are all in resrc.c.  So, get rid of the
length parameter and introduce wrappers in resrc.c to check the
length.
This commit is contained in:
Alan Modra
2025-05-02 12:42:32 +09:30
parent c9524271db
commit a7cae7faf1
6 changed files with 254 additions and 252 deletions

View File

@@ -136,7 +136,7 @@ get_unicode (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length,
toosmall (_("null terminated unicode string"));
return NULL;
}
if (windres_get_16 (wrbfd, data + c * 2, 2) == 0)
if (windres_get_16 (wrbfd, data + c * 2) == 0)
break;
++c;
}
@@ -144,7 +144,7 @@ get_unicode (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length,
ret = res_alloc ((c + 1) * sizeof (unichar));
for (i = 0; i < c; i++)
ret[i] = windres_get_16 (wrbfd, data + i * 2, 2);
ret[i] = windres_get_16 (wrbfd, data + i * 2);
ret[i] = 0;
if (retlen != NULL)
@@ -167,7 +167,7 @@ get_resid (windres_bfd *wrbfd, rc_res_id *id, const bfd_byte *data,
return -1;
}
first = windres_get_16 (wrbfd, data, 2);
first = windres_get_16 (wrbfd, data);
if (first == 0xffff)
{
if (length < 4)
@@ -176,7 +176,7 @@ get_resid (windres_bfd *wrbfd, rc_res_id *id, const bfd_byte *data,
return -1;
}
id->named = 0;
id->u.id = windres_get_16 (wrbfd, data + 2, 2);
id->u.id = windres_get_16 (wrbfd, data + 2);
return 4;
}
else
@@ -221,8 +221,8 @@ bin_to_res_cursor (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
}
c = res_alloc (sizeof (rc_cursor));
c->xhotspot = windres_get_16 (wrbfd, data, 2);
c->yhotspot = windres_get_16 (wrbfd, data + 2, 2);
c->xhotspot = windres_get_16 (wrbfd, data);
c->yhotspot = windres_get_16 (wrbfd, data + 2);
c->length = length - 4;
c->data = data + 4;
@@ -254,7 +254,7 @@ bin_to_res_menu (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length)
return NULL;
}
version = windres_get_16 (wrbfd, data, 2);
version = windres_get_16 (wrbfd, data);
if (version == 0)
{
@@ -277,8 +277,8 @@ bin_to_res_menu (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length)
toosmall (_("menuex header"));
return NULL;
}
m->help = windres_get_32 (wrbfd, data + 4, 4);
offset = windres_get_16 (wrbfd, data + 2, 2);
m->help = windres_get_32 (wrbfd, data + 4);
offset = windres_get_16 (wrbfd, data + 2);
if (offset + 4 >= length)
{
toosmall (_("menuex offset"));
@@ -327,7 +327,7 @@ bin_to_res_menuitems (windres_bfd *wrbfd, const bfd_byte *data,
mi->state = 0;
mi->help = 0;
flags = windres_get_16 (wrbfd, data, 2);
flags = windres_get_16 (wrbfd, data);
mi->type = flags &~ (MENUITEM_POPUP | MENUITEM_ENDMENU);
if ((flags & MENUITEM_POPUP) == 0)
@@ -341,7 +341,7 @@ bin_to_res_menuitems (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
if (windres_get_16 (wrbfd, data + stroff, 2) == 0)
if (windres_get_16 (wrbfd, data + stroff) == 0)
{
slen = 0;
mi->text = NULL;
@@ -358,7 +358,7 @@ bin_to_res_menuitems (windres_bfd *wrbfd, const bfd_byte *data,
if ((flags & MENUITEM_POPUP) == 0)
{
mi->popup = NULL;
mi->id = windres_get_16 (wrbfd, data + 2, 2);
mi->id = windres_get_16 (wrbfd, data + 2);
}
else
{
@@ -413,13 +413,13 @@ bin_to_res_menuexitems (windres_bfd *wrbfd, const bfd_byte *data,
}
mi = res_alloc (sizeof (rc_menuitem));
mi->type = windres_get_32 (wrbfd, data, 4);
mi->state = windres_get_32 (wrbfd, data + 4, 4);
mi->id = windres_get_32 (wrbfd, data + 8, 4);
mi->type = windres_get_32 (wrbfd, data);
mi->state = windres_get_32 (wrbfd, data + 4);
mi->id = windres_get_32 (wrbfd, data + 8);
flags = windres_get_16 (wrbfd, data + 12, 2);
flags = windres_get_16 (wrbfd, data + 12);
if (windres_get_16 (wrbfd, data + 14, 2) == 0)
if (windres_get_16 (wrbfd, data + 14) == 0)
{
slen = 0;
mi->text = NULL;
@@ -448,7 +448,7 @@ bin_to_res_menuexitems (windres_bfd *wrbfd, const bfd_byte *data,
toosmall (_("menuitem"));
return NULL;
}
mi->help = windres_get_32 (wrbfd, data + itemlen, 4);
mi->help = windres_get_32 (wrbfd, data + itemlen);
itemlen += 4;
mi->popup = bin_to_res_menuexitems (wrbfd, data + itemlen,
@@ -494,19 +494,19 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
d = res_alloc (sizeof (rc_dialog));
signature = windres_get_16 (wrbfd, data + 2, 2);
signature = windres_get_16 (wrbfd, data + 2);
if (signature != 0xffff)
{
d->ex = NULL;
d->style = windres_get_32 (wrbfd, data, 4);
d->exstyle = windres_get_32 (wrbfd, data + 4, 4);
d->style = windres_get_32 (wrbfd, data);
d->exstyle = windres_get_32 (wrbfd, data + 4);
off = 8;
}
else
{
int version;
version = windres_get_16 (wrbfd, data, 2);
version = windres_get_16 (wrbfd, data);
if (version != 1)
{
non_fatal (_("unexpected DIALOGEX version %d"), version);
@@ -514,9 +514,9 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
}
d->ex = res_alloc (sizeof (rc_dialog_ex));
d->ex->help = windres_get_32 (wrbfd, data + 4, 4);
d->exstyle = windres_get_32 (wrbfd, data + 8, 4);
d->style = windres_get_32 (wrbfd, data + 12, 4);
d->ex->help = windres_get_32 (wrbfd, data + 4);
d->exstyle = windres_get_32 (wrbfd, data + 8);
d->style = windres_get_32 (wrbfd, data + 12);
off = 16;
}
@@ -526,11 +526,11 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL;
}
c = windres_get_16 (wrbfd, data + off, 2);
d->x = windres_get_16 (wrbfd, data + off + 2, 2);
d->y = windres_get_16 (wrbfd, data + off + 4, 2);
d->width = windres_get_16 (wrbfd, data + off + 6, 2);
d->height = windres_get_16 (wrbfd, data + off + 8, 2);
c = windres_get_16 (wrbfd, data + off);
d->x = windres_get_16 (wrbfd, data + off + 2);
d->y = windres_get_16 (wrbfd, data + off + 4);
d->width = windres_get_16 (wrbfd, data + off + 6);
d->height = windres_get_16 (wrbfd, data + off + 8);
off += 10;
@@ -570,7 +570,7 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL;
}
d->pointsize = windres_get_16 (wrbfd, data + off, 2);
d->pointsize = windres_get_16 (wrbfd, data + off);
off += 2;
if (d->ex != NULL)
@@ -580,9 +580,9 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
toosmall (_("dialogex font information"));
return NULL;
}
d->ex->weight = windres_get_16 (wrbfd, data + off, 2);
d->ex->italic = windres_get_8 (wrbfd, data + off + 2, 1);
d->ex->charset = windres_get_8 (wrbfd, data + off + 3, 1);
d->ex->weight = windres_get_16 (wrbfd, data + off);
d->ex->italic = windres_get_8 (wrbfd, data + off + 2);
d->ex->charset = windres_get_8 (wrbfd, data + off + 3);
off += 4;
}
@@ -612,8 +612,8 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL;
}
dc->style = windres_get_32 (wrbfd, data + off, 4);
dc->exstyle = windres_get_32 (wrbfd, data + off + 4, 4);
dc->style = windres_get_32 (wrbfd, data + off);
dc->exstyle = windres_get_32 (wrbfd, data + off + 4);
dc->help = 0;
off += 8;
}
@@ -624,9 +624,9 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
toosmall (_("dialogex control"));
return NULL;
}
dc->help = windres_get_32 (wrbfd, data + off, 4);
dc->exstyle = windres_get_32 (wrbfd, data + off + 4, 4);
dc->style = windres_get_32 (wrbfd, data + off + 8, 4);
dc->help = windres_get_32 (wrbfd, data + off);
dc->exstyle = windres_get_32 (wrbfd, data + off + 4);
dc->style = windres_get_32 (wrbfd, data + off + 8);
off += 12;
}
@@ -636,15 +636,15 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL;
}
dc->x = windres_get_16 (wrbfd, data + off, 2);
dc->y = windres_get_16 (wrbfd, data + off + 2, 2);
dc->width = windres_get_16 (wrbfd, data + off + 4, 2);
dc->height = windres_get_16 (wrbfd, data + off + 6, 2);
dc->x = windres_get_16 (wrbfd, data + off);
dc->y = windres_get_16 (wrbfd, data + off + 2);
dc->width = windres_get_16 (wrbfd, data + off + 4);
dc->height = windres_get_16 (wrbfd, data + off + 6);
if (d->ex != NULL)
dc->id = windres_get_32 (wrbfd, data + off + 8, 4);
dc->id = windres_get_32 (wrbfd, data + off + 8);
else
dc->id = windres_get_16 (wrbfd, data + off + 8, 2);
dc->id = windres_get_16 (wrbfd, data + off + 8);
off += 10 + (d->ex != NULL ? 2 : 0);
@@ -664,7 +664,7 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL;
}
datalen = windres_get_16 (wrbfd, data + off, 2);
datalen = windres_get_16 (wrbfd, data + off);
off += 2;
if (datalen == 0)
@@ -718,7 +718,7 @@ bin_to_res_string (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
toosmall (_("stringtable string length"));
return NULL;
}
slen = windres_get_16 (wrbfd, data, 2);
slen = windres_get_16 (wrbfd, data);
st->strings[i].length = slen;
if (slen > 0)
@@ -736,7 +736,7 @@ bin_to_res_string (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
st->strings[i].string = s;
for (j = 0; j < slen; j++)
s[j] = windres_get_16 (wrbfd, data + 2 + j * 2, 2);
s[j] = windres_get_16 (wrbfd, data + 2 + j * 2);
}
data += 2 + 2 * slen;
@@ -766,7 +766,7 @@ bin_to_res_fontdir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
c = windres_get_16 (wrbfd, data, 2);
c = windres_get_16 (wrbfd, data);
first = NULL;
pp = &first;
@@ -785,7 +785,7 @@ bin_to_res_fontdir (windres_bfd *wrbfd, const bfd_byte *data,
bfi = (const struct bin_fontdir_item *) data;
fd = res_alloc (sizeof *fd);
fd->index = windres_get_16 (wrbfd, bfi->index, 2);
fd->index = windres_get_16 (wrbfd, bfi->index);
/* To work out the length of the fontdir data, we must get the
length of the device name and face name strings, even though
@@ -858,9 +858,9 @@ bin_to_res_accelerators (windres_bfd *wrbfd, const bfd_byte *data,
a = res_alloc (sizeof (rc_accelerator));
a->flags = windres_get_16 (wrbfd, data, 2);
a->key = windres_get_16 (wrbfd, data + 2, 2);
a->id = windres_get_16 (wrbfd, data + 4, 2);
a->flags = windres_get_16 (wrbfd, data);
a->key = windres_get_16 (wrbfd, data + 2);
a->id = windres_get_16 (wrbfd, data + 4);
a->next = NULL;
*pp = a;
@@ -919,14 +919,14 @@ bin_to_res_group_cursor (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
type = windres_get_16 (wrbfd, data + 2, 2);
type = windres_get_16 (wrbfd, data + 2);
if (type != 2)
{
non_fatal (_("unexpected group cursor type %d"), type);
return NULL;
}
c = windres_get_16 (wrbfd, data + 4, 2);
c = windres_get_16 (wrbfd, data + 4);
data += 6;
length -= 6;
@@ -946,12 +946,12 @@ bin_to_res_group_cursor (windres_bfd *wrbfd, const bfd_byte *data,
gc = res_alloc (sizeof *gc);
gc->width = windres_get_16 (wrbfd, data, 2);
gc->height = windres_get_16 (wrbfd, data + 2, 2);
gc->planes = windres_get_16 (wrbfd, data + 4, 2);
gc->bits = windres_get_16 (wrbfd, data + 6, 2);
gc->bytes = windres_get_32 (wrbfd, data + 8, 4);
gc->index = windres_get_16 (wrbfd, data + 12, 2);
gc->width = windres_get_16 (wrbfd, data);
gc->height = windres_get_16 (wrbfd, data + 2);
gc->planes = windres_get_16 (wrbfd, data + 4);
gc->bits = windres_get_16 (wrbfd, data + 6);
gc->bytes = windres_get_32 (wrbfd, data + 8);
gc->index = windres_get_16 (wrbfd, data + 12);
gc->next = NULL;
*pp = gc;
@@ -984,14 +984,14 @@ bin_to_res_group_icon (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
type = windres_get_16 (wrbfd, data + 2, 2);
type = windres_get_16 (wrbfd, data + 2);
if (type != 1)
{
non_fatal (_("unexpected group icon type %d"), type);
return NULL;
}
c = windres_get_16 (wrbfd, data + 4, 2);
c = windres_get_16 (wrbfd, data + 4);
data += 6;
length -= 6;
@@ -1011,13 +1011,13 @@ bin_to_res_group_icon (windres_bfd *wrbfd, const bfd_byte *data,
gi = res_alloc (sizeof (rc_group_icon));
gi->width = windres_get_8 (wrbfd, data, 1);
gi->height = windres_get_8 (wrbfd, data + 1, 1);
gi->colors = windres_get_8 (wrbfd, data + 2, 1);
gi->planes = windres_get_16 (wrbfd, data + 4, 2);
gi->bits = windres_get_16 (wrbfd, data + 6, 2);
gi->bytes = windres_get_32 (wrbfd, data + 8, 4);
gi->index = windres_get_16 (wrbfd, data + 12, 2);
gi->width = windres_get_8 (wrbfd, data);
gi->height = windres_get_8 (wrbfd, data + 1);
gi->colors = windres_get_8 (wrbfd, data + 2);
gi->planes = windres_get_16 (wrbfd, data + 4);
gi->bits = windres_get_16 (wrbfd, data + 6);
gi->bytes = windres_get_32 (wrbfd, data + 8);
gi->index = windres_get_16 (wrbfd, data + 12);
gi->next = NULL;
*pp = gi;
@@ -1051,9 +1051,9 @@ get_version_header (windres_bfd *wrbfd, const bfd_byte *data,
return false;
}
*len = (windres_get_16 (wrbfd, data, 2) + 3) & ~3;
*vallen = windres_get_16 (wrbfd, data + 2, 2);
*type = windres_get_16 (wrbfd, data + 4, 2);
*len = (windres_get_16 (wrbfd, data) + 3) & ~3;
*vallen = windres_get_16 (wrbfd, data + 2);
*type = windres_get_16 (wrbfd, data + 4);
*off = 6;
@@ -1078,7 +1078,7 @@ get_version_header (windres_bfd *wrbfd, const bfd_byte *data,
toosmall (key);
return false;
}
if (windres_get_16 (wrbfd, data, 2) != (bfd_byte) *key)
if (windres_get_16 (wrbfd, data) != (bfd_byte) *key)
{
non_fatal (_("unexpected version string"));
return false;
@@ -1155,14 +1155,14 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
signature = windres_get_32 (wrbfd, data, 4);
signature = windres_get_32 (wrbfd, data);
if (signature != 0xfeef04bd)
{
non_fatal (_("unexpected fixed version signature %lu"), signature);
return NULL;
}
fiv = windres_get_32 (wrbfd, data + 4, 4);
fiv = windres_get_32 (wrbfd, data + 4);
if (fiv != 0 && fiv != 0x10000)
{
non_fatal (_("unexpected fixed version info version %lu"), fiv);
@@ -1171,17 +1171,17 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data,
fi = res_alloc (sizeof (rc_fixed_versioninfo));
fi->file_version_ms = windres_get_32 (wrbfd, data + 8, 4);
fi->file_version_ls = windres_get_32 (wrbfd, data + 12, 4);
fi->product_version_ms = windres_get_32 (wrbfd, data + 16, 4);
fi->product_version_ls = windres_get_32 (wrbfd, data + 20, 4);
fi->file_flags_mask = windres_get_32 (wrbfd, data + 24, 4);
fi->file_flags = windres_get_32 (wrbfd, data + 28, 4);
fi->file_os = windres_get_32 (wrbfd, data + 32, 4);
fi->file_type = windres_get_32 (wrbfd, data + 36, 4);
fi->file_subtype = windres_get_32 (wrbfd, data + 40, 4);
fi->file_date_ms = windres_get_32 (wrbfd, data + 44, 4);
fi->file_date_ls = windres_get_32 (wrbfd, data + 48, 4);
fi->file_version_ms = windres_get_32 (wrbfd, data + 8);
fi->file_version_ls = windres_get_32 (wrbfd, data + 12);
fi->product_version_ms = windres_get_32 (wrbfd, data + 16);
fi->product_version_ls = windres_get_32 (wrbfd, data + 20);
fi->file_flags_mask = windres_get_32 (wrbfd, data + 24);
fi->file_flags = windres_get_32 (wrbfd, data + 28);
fi->file_os = windres_get_32 (wrbfd, data + 32);
fi->file_type = windres_get_32 (wrbfd, data + 36);
fi->file_subtype = windres_get_32 (wrbfd, data + 40);
fi->file_date_ms = windres_get_32 (wrbfd, data + 44);
fi->file_date_ls = windres_get_32 (wrbfd, data + 48);
data += 52;
length -= 52;
@@ -1203,7 +1203,7 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data,
vi = res_alloc (sizeof (rc_ver_info));
ch = windres_get_16 (wrbfd, data + 6, 2);
ch = windres_get_16 (wrbfd, data + 6);
if (ch == 'S')
{
@@ -1366,8 +1366,8 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data,
vv = res_alloc (sizeof (rc_ver_varinfo));
vv->language = windres_get_16 (wrbfd, data, 2);
vv->charset = windres_get_16 (wrbfd, data + 2, 2);
vv->language = windres_get_16 (wrbfd, data);
vv->charset = windres_get_16 (wrbfd, data + 2);
vv->next = NULL;
*ppvv = vv;
@@ -1453,9 +1453,9 @@ bin_to_res_toolbar (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
ri = res_alloc (sizeof (rc_toolbar));
ri->button_width = windres_get_32 (wrbfd, data, 4);
ri->button_height = windres_get_32 (wrbfd, data + 4, 4);
ri->nitems = windres_get_32 (wrbfd, data + 8, 4);
ri->button_width = windres_get_32 (wrbfd, data);
ri->button_height = windres_get_32 (wrbfd, data + 4);
ri->nitems = windres_get_32 (wrbfd, data + 8);
ri->items = NULL;
data += 12;
@@ -1470,7 +1470,7 @@ bin_to_res_toolbar (windres_bfd *wrbfd, const bfd_byte *data,
toosmall (_("toolbar item"));
return NULL;
}
it->id.u.id = (int) windres_get_32 (wrbfd, data, 4);
it->id.u.id = (int) windres_get_32 (wrbfd, data);
it->prev = it->next = NULL;
data += 4;
length -= 4;

View File

@@ -232,14 +232,14 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
erd = (const struct extern_res_directory *) data;
rd = (rc_res_directory *) res_alloc (sizeof (rc_res_directory));
rd->characteristics = windres_get_32 (wrbfd, erd->characteristics, 4);
rd->time = windres_get_32 (wrbfd, erd->time, 4);
rd->major = windres_get_16 (wrbfd, erd->major, 2);
rd->minor = windres_get_16 (wrbfd, erd->minor, 2);
rd->characteristics = windres_get_32 (wrbfd, erd->characteristics);
rd->time = windres_get_32 (wrbfd, erd->time);
rd->major = windres_get_16 (wrbfd, erd->major);
rd->minor = windres_get_16 (wrbfd, erd->minor);
rd->entries = NULL;
name_count = windres_get_16 (wrbfd, erd->name_count, 2);
id_count = windres_get_16 (wrbfd, erd->id_count, 2);
name_count = windres_get_16 (wrbfd, erd->name_count);
id_count = windres_get_16 (wrbfd, erd->id_count);
pp = &rd->entries;
@@ -261,8 +261,8 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
name = windres_get_32 (wrbfd, ere->name, 4);
rva = windres_get_32 (wrbfd, ere->rva, 4);
name = windres_get_32 (wrbfd, ere->name);
rva = windres_get_32 (wrbfd, ere->rva);
/* For some reason the high bit in NAME is set. */
name &=~ 0x80000000;
@@ -279,7 +279,7 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
overrun (flaginfo, _("resource name"));
return NULL;
}
length = windres_get_16 (wrbfd, ers, 2);
length = windres_get_16 (wrbfd, ers);
/* PR 17512: file: 05dc4a16. */
if (length * 2 + 4 > flaginfo->data_end - ers)
{
@@ -292,7 +292,7 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
re->id.u.n.length = length;
re->id.u.n.name = (unichar *) res_alloc (length * sizeof (unichar));
for (j = 0; j < length; j++)
re->id.u.n.name[j] = windres_get_16 (wrbfd, ers + j * 2 + 2, 2);
re->id.u.n.name[j] = windres_get_16 (wrbfd, ers + j * 2 + 2);
if (level == 0)
type = &re->id;
@@ -337,8 +337,8 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL;
}
name = windres_get_32 (wrbfd, ere->name, 4);
rva = windres_get_32 (wrbfd, ere->rva, 4);
name = windres_get_32 (wrbfd, ere->name);
rva = windres_get_32 (wrbfd, ere->rva);
re = (rc_res_entry *) res_alloc (sizeof *re);
re->next = NULL;
@@ -405,8 +405,8 @@ read_coff_data_entry (windres_bfd *wrbfd, const bfd_byte *data,
erd = (const struct extern_res_data *) data;
size = windres_get_32 (wrbfd, erd->size, 4);
rva = windres_get_32 (wrbfd, erd->rva, 4);
size = windres_get_32 (wrbfd, erd->size);
rva = windres_get_32 (wrbfd, erd->rva);
if (rva < flaginfo->secaddr
|| rva - flaginfo->secaddr >= (rc_uint_type) (flaginfo->data_end - flaginfo->data))
{
@@ -426,8 +426,8 @@ read_coff_data_entry (windres_bfd *wrbfd, const bfd_byte *data,
if (r != NULL)
{
memset (&r->res_info, 0, sizeof (rc_res_res_info));
r->coff_info.codepage = windres_get_32 (wrbfd, erd->codepage, 4);
r->coff_info.reserved = windres_get_32 (wrbfd, erd->reserved, 4);
r->coff_info.codepage = windres_get_32 (wrbfd, erd->codepage);
r->coff_info.reserved = windres_get_32 (wrbfd, erd->reserved);
}
return r;

View File

@@ -679,6 +679,22 @@ get_data (FILE *e, bfd_byte *p, rc_uint_type c, const char *msg)
fatal (_("%s: read of %lu returned %lu"),
msg, (unsigned long) c, (unsigned long) got);
}
static rc_uint_type
target_get_16 (const void *p, size_t len)
{
if (len < 2)
fatal (_("not enough data"));
return windres_get_16 (&wrtarget, p);
}
static rc_uint_type
target_get_32 (const void *p, size_t len)
{
if (len < 4)
fatal (_("not enough data"));
return windres_get_32 (&wrtarget, p);
}
/* Define an accelerator resource. */
@@ -1094,7 +1110,7 @@ define_fontdir_rcdata (rc_res_id id,const rc_res_res_info *resinfo,
if (pb_data)
{
rc_uint_type off = 2;
c = windres_get_16 (&wrtarget, pb_data, len_data);
c = target_get_16 (pb_data, len_data);
for (; c > 0; c--)
{
size_t len;
@@ -1103,7 +1119,7 @@ define_fontdir_rcdata (rc_res_id id,const rc_res_res_info *resinfo,
bfi = (const struct bin_fontdir_item *) pb_data + off;
fd = (rc_fontdir *) res_alloc (sizeof (rc_fontdir));
fd->index = windres_get_16 (&wrtarget, bfi->index, len_data - off);
fd->index = target_get_16 (bfi->index, len_data - off);
fd->data = pb_data + off;
off += 56;
len = strlen ((char *) bfi->device_name) + 1;
@@ -1288,10 +1304,10 @@ define_group_icon_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
{
int c, i;
unsigned short type;
type = windres_get_16 (&wrtarget, pb_data + 2, len_data - 2);
type = target_get_16 (pb_data + 2, len_data - 2);
if (type != 1)
fatal (_("unexpected group icon type %d"), type);
c = windres_get_16 (&wrtarget, pb_data + 4, len_data - 4);
c = target_get_16 (pb_data + 4, len_data - 4);
len_data -= 6;
pb_data += 6;
@@ -1304,10 +1320,10 @@ define_group_icon_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
cg->width = pb_data[0];
cg->height = pb_data[1];
cg->colors = pb_data[2];
cg->planes = windres_get_16 (&wrtarget, pb_data + 4, len_data - 4);
cg->bits = windres_get_16 (&wrtarget, pb_data + 6, len_data - 6);
cg->bytes = windres_get_32 (&wrtarget, pb_data + 8, len_data - 8);
cg->index = windres_get_16 (&wrtarget, pb_data + 12, len_data - 12);
cg->planes = target_get_16 (pb_data + 4, len_data - 4);
cg->bits = target_get_16 (pb_data + 6, len_data - 6);
cg->bytes = target_get_32 (pb_data + 8, len_data - 8);
cg->index = target_get_16 (pb_data + 12, len_data - 12);
if (! first)
first = cg;
else
@@ -1341,10 +1357,10 @@ define_group_cursor_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
{
int c, i;
unsigned short type;
type = windres_get_16 (&wrtarget, pb_data + 2, len_data - 2);
type = target_get_16 (pb_data + 2, len_data - 2);
if (type != 2)
fatal (_("unexpected group cursor type %d"), type);
c = windres_get_16 (&wrtarget, pb_data + 4, len_data - 4);
c = target_get_16 (pb_data + 4, len_data - 4);
len_data -= 6;
pb_data += 6;
@@ -1354,12 +1370,12 @@ define_group_cursor_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
fatal ("too small group icon rcdata");
cg = (rc_group_cursor *) res_alloc (sizeof (rc_group_cursor));
cg->next = NULL;
cg->width = windres_get_16 (&wrtarget, pb_data, len_data);
cg->height = windres_get_16 (&wrtarget, pb_data + 2, len_data - 2);
cg->planes = windres_get_16 (&wrtarget, pb_data + 4, len_data - 4);
cg->bits = windres_get_16 (&wrtarget, pb_data + 6, len_data - 6);
cg->bytes = windres_get_32 (&wrtarget, pb_data + 8, len_data - 8);
cg->index = windres_get_16 (&wrtarget, pb_data + 12, len_data - 12);
cg->width = target_get_16 (pb_data, len_data);
cg->height = target_get_16 (pb_data + 2, len_data - 2);
cg->planes = target_get_16 (pb_data + 4, len_data - 4);
cg->bits = target_get_16 (pb_data + 6, len_data - 6);
cg->bytes = target_get_32 (pb_data + 8, len_data - 8);
cg->index = target_get_16 (pb_data + 12, len_data - 12);
if (! first)
first = cg;
else
@@ -1389,8 +1405,8 @@ define_cursor_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
pb_data = rcdata_render_as_buffer (data, &len_data);
c = (rc_cursor *) res_alloc (sizeof (rc_cursor));
c->xhotspot = windres_get_16 (&wrtarget, pb_data, len_data);
c->yhotspot = windres_get_16 (&wrtarget, pb_data + 2, len_data - 2);
c->xhotspot = target_get_16 (pb_data, len_data);
c->yhotspot = target_get_16 (pb_data + 2, len_data - 2);
c->length = len_data - BIN_CURSOR_SIZE;
c->data = (const bfd_byte *) (data + BIN_CURSOR_SIZE);
@@ -2944,7 +2960,7 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
rc_uint_type m, i;
mt = (const struct bin_messagetable *) data;
m = windres_get_32 (&wrtarget, mt->cblocks, length);
m = target_get_32 (mt->cblocks, length);
if (length < (BIN_MESSAGETABLE_SIZE + m * BIN_MESSAGETABLE_BLOCK_SIZE))
{
@@ -2956,9 +2972,9 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
rc_uint_type low, high, offset;
const struct bin_messagetable_item *mti;
low = windres_get_32 (&wrtarget, mt->items[i].lowid, 4);
high = windres_get_32 (&wrtarget, mt->items[i].highid, 4);
offset = windres_get_32 (&wrtarget, mt->items[i].offset, 4);
low = windres_get_32 (&wrtarget, mt->items[i].lowid);
high = windres_get_32 (&wrtarget, mt->items[i].highid);
offset = windres_get_32 (&wrtarget, mt->items[i].offset);
while (low <= high)
{
@@ -2969,8 +2985,8 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
break;
}
mti = (const struct bin_messagetable_item *) &data[offset];
elen = windres_get_16 (&wrtarget, mti->length, 2);
flags = windres_get_16 (&wrtarget, mti->flags, 2);
elen = windres_get_16 (&wrtarget, mti->length);
flags = windres_get_16 (&wrtarget, mti->flags);
if ((offset + elen) > length)
{
has_error = 1;
@@ -3008,8 +3024,8 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
}
static void
write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_next,
int hasblock, int show_comment)
write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data,
int has_next, int hasblock, int show_comment)
{
int plen;
@@ -3106,10 +3122,12 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
{
if (k == 0)
plen = fprintf (e, "0x%lxL",
(unsigned long) windres_get_32 (&wrtarget, data + i, length - i));
(unsigned long) target_get_32 (data + i,
length - i));
else
plen = fprintf (e, " 0x%lxL",
(unsigned long) windres_get_32 (&wrtarget, data + i, length - i)) - 1;
(unsigned long) target_get_32 (data + i,
length - i)) - 1;
if (has_next || (i + 4) < length)
{
if (plen>0 && plen < 11)
@@ -3120,7 +3138,8 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
if (show_comment)
{
fprintf (e, "\t/* ");
ascii_print (e, (const char *) &data[comment_start], i - comment_start);
ascii_print (e, (const char *) &data[comment_start],
i - comment_start);
fprintf (e, ". */");
}
fprintf (e, "\n");
@@ -3132,7 +3151,7 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
if (! first)
indent (e, 2);
plen = fprintf (e, "0x%x",
(int) windres_get_16 (&wrtarget, data + i, length - i));
(int) target_get_16 (data + i, length - i));
if (has_next || i + 2 < length)
{
if (plen > 0 && plen < 11)

View File

@@ -201,11 +201,11 @@ read_resource_entry (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax)
/* Read additional resource header */
read_res_data (wrbfd, off, omax, &l, BIN_RES_INFO_SIZE);
resinfo.version = windres_get_32 (wrbfd, l.version, 4);
resinfo.memflags = windres_get_16 (wrbfd, l.memflags, 2);
resinfo.language = windres_get_16 (wrbfd, l.language, 2);
/* resinfo.version2 = windres_get_32 (wrbfd, l.version2, 4); */
resinfo.characteristics = windres_get_32 (wrbfd, l.characteristics, 4);
resinfo.version = windres_get_32 (wrbfd, l.version);
resinfo.memflags = windres_get_16 (wrbfd, l.memflags);
resinfo.language = windres_get_16 (wrbfd, l.language);
/* resinfo.version2 = windres_get_32 (wrbfd, l.version2); */
resinfo.characteristics = windres_get_32 (wrbfd, l.characteristics);
off[0] = (off[0] + 3) & ~3;
@@ -464,8 +464,8 @@ read_res_data_hdr (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
fatal ("%s: unexpected end of file %ld/%ld", filename,(long) off[0], (long) omax);
get_windres_bfd_content (wrbfd, &brh, off[0], BIN_RES_HDR_SIZE);
reshdr->data_size = windres_get_32 (wrbfd, brh.data_size, 4);
reshdr->header_size = windres_get_32 (wrbfd, brh.header_size, 4);
reshdr->data_size = windres_get_32 (wrbfd, brh.data_size);
reshdr->header_size = windres_get_32 (wrbfd, brh.header_size);
off[0] += BIN_RES_HDR_SIZE;
}
@@ -542,12 +542,12 @@ read_res_id (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax, rc_res_id
rc_uint_type len;
read_res_data (wrbfd, off, omax, &bid, BIN_RES_ID - 2);
ord = (unsigned short) windres_get_16 (wrbfd, bid.sig, 2);
ord = (unsigned short) windres_get_16 (wrbfd, bid.sig);
if (ord == 0xFFFF) /* an ordinal id */
{
read_res_data (wrbfd, off, omax, bid.id, BIN_RES_ID - 2);
id->named = 0;
id->u.id = windres_get_16 (wrbfd, bid.id, 2);
id->u.id = windres_get_16 (wrbfd, bid.id);
}
else
/* named id */
@@ -575,7 +575,7 @@ read_unistring (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
do
{
read_res_data (wrbfd, &soff, omax, d, sizeof (unichar));
c = windres_get_16 (wrbfd, d, 2);
c = windres_get_16 (wrbfd, d);
}
while (c != 0);
l = ((soff - off[0]) / sizeof (unichar));
@@ -585,7 +585,7 @@ read_unistring (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
do
{
read_res_data (wrbfd, off, omax, d, sizeof (unichar));
c = windres_get_16 (wrbfd, d, 2);
c = windres_get_16 (wrbfd, d);
*p++ = c;
}
while (c != 0);

View File

@@ -1087,9 +1087,9 @@ extern void get_windres_bfd_content (windres_bfd *, void *, rc_uint_type, rc_uin
extern void windres_put_8 (windres_bfd *, void *, rc_uint_type);
extern void windres_put_16 (windres_bfd *, void *, rc_uint_type);
extern void windres_put_32 (windres_bfd *, void *, rc_uint_type);
extern rc_uint_type windres_get_8 (windres_bfd *, const void *, rc_uint_type);
extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type);
extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type);
extern rc_uint_type windres_get_8 (windres_bfd *, const void *);
extern rc_uint_type windres_get_16 (windres_bfd *, const void *);
extern rc_uint_type windres_get_32 (windres_bfd *, const void *);
extern void set_windres_bfd (windres_bfd *, bfd *, asection *, rc_uint_type);
extern void set_windres_bfd_endianness (windres_bfd *, int);

View File

@@ -1210,23 +1210,15 @@ target_put_32 (void *p, rc_uint_type value)
}
static rc_uint_type
target_get_8 (const void *p, rc_uint_type length)
target_get_8 (const void *p)
{
rc_uint_type ret;
if (length < 1)
fatal ("Resource too small for getting 8-bit value.");
ret = (rc_uint_type) *((const bfd_byte *) p);
rc_uint_type ret = *((const bfd_byte *) p);
return ret & 0xff;
}
static rc_uint_type
target_get_16 (const void *p, rc_uint_type length)
target_get_16 (const void *p)
{
if (length < 2)
fatal ("Resource too small for getting 16-bit value.");
if (target_is_bigendian)
return bfd_getb16 (p);
else
@@ -1234,11 +1226,8 @@ target_get_16 (const void *p, rc_uint_type length)
}
static rc_uint_type
target_get_32 (const void *p, rc_uint_type length)
target_get_32 (const void *p)
{
if (length < 4)
fatal ("Resource too small for getting 32-bit value.");
if (target_is_bigendian)
return bfd_getb32 (p);
else
@@ -1304,14 +1293,12 @@ windres_put_32 (windres_bfd *wrbfd, void *data, rc_uint_type value)
}
rc_uint_type
windres_get_8 (windres_bfd *wrbfd, const void *data, rc_uint_type length)
windres_get_8 (windres_bfd *wrbfd, const void *data)
{
if (length < 1)
fatal ("windres_get_8: unexpected eob.");
switch (WR_KIND(wrbfd))
{
case WR_KIND_TARGET:
return target_get_8 (data, length);
return target_get_8 (data);
case WR_KIND_BFD:
case WR_KIND_BFD_BIN_B:
case WR_KIND_BFD_BIN_L:
@@ -1323,14 +1310,12 @@ windres_get_8 (windres_bfd *wrbfd, const void *data, rc_uint_type length)
}
rc_uint_type
windres_get_16 (windres_bfd *wrbfd, const void *data, rc_uint_type length)
windres_get_16 (windres_bfd *wrbfd, const void *data)
{
if (length < 2)
fatal ("windres_get_16: unexpected eob.");
switch (WR_KIND(wrbfd))
{
case WR_KIND_TARGET:
return target_get_16 (data, length);
return target_get_16 (data);
case WR_KIND_BFD:
case WR_KIND_BFD_BIN_B:
return bfd_get_16 (WR_BFD(wrbfd), data);
@@ -1343,14 +1328,12 @@ windres_get_16 (windres_bfd *wrbfd, const void *data, rc_uint_type length)
}
rc_uint_type
windres_get_32 (windres_bfd *wrbfd, const void *data, rc_uint_type length)
windres_get_32 (windres_bfd *wrbfd, const void *data)
{
if (length < 4)
fatal ("windres_get_32: unexpected eob.");
switch (WR_KIND(wrbfd))
{
case WR_KIND_TARGET:
return target_get_32 (data, length);
return target_get_32 (data);
case WR_KIND_BFD:
case WR_KIND_BFD_BIN_B:
return bfd_get_32 (WR_BFD(wrbfd), data);