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")); toosmall (_("null terminated unicode string"));
return NULL; return NULL;
} }
if (windres_get_16 (wrbfd, data + c * 2, 2) == 0) if (windres_get_16 (wrbfd, data + c * 2) == 0)
break; break;
++c; ++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)); ret = res_alloc ((c + 1) * sizeof (unichar));
for (i = 0; i < c; i++) 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; ret[i] = 0;
if (retlen != NULL) if (retlen != NULL)
@@ -167,7 +167,7 @@ get_resid (windres_bfd *wrbfd, rc_res_id *id, const bfd_byte *data,
return -1; return -1;
} }
first = windres_get_16 (wrbfd, data, 2); first = windres_get_16 (wrbfd, data);
if (first == 0xffff) if (first == 0xffff)
{ {
if (length < 4) if (length < 4)
@@ -176,7 +176,7 @@ get_resid (windres_bfd *wrbfd, rc_res_id *id, const bfd_byte *data,
return -1; return -1;
} }
id->named = 0; id->named = 0;
id->u.id = windres_get_16 (wrbfd, data + 2, 2); id->u.id = windres_get_16 (wrbfd, data + 2);
return 4; return 4;
} }
else 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 = res_alloc (sizeof (rc_cursor));
c->xhotspot = windres_get_16 (wrbfd, data, 2); c->xhotspot = windres_get_16 (wrbfd, data);
c->yhotspot = windres_get_16 (wrbfd, data + 2, 2); c->yhotspot = windres_get_16 (wrbfd, data + 2);
c->length = length - 4; c->length = length - 4;
c->data = data + 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; return NULL;
} }
version = windres_get_16 (wrbfd, data, 2); version = windres_get_16 (wrbfd, data);
if (version == 0) 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")); toosmall (_("menuex header"));
return NULL; return NULL;
} }
m->help = windres_get_32 (wrbfd, data + 4, 4); m->help = windres_get_32 (wrbfd, data + 4);
offset = windres_get_16 (wrbfd, data + 2, 2); offset = windres_get_16 (wrbfd, data + 2);
if (offset + 4 >= length) if (offset + 4 >= length)
{ {
toosmall (_("menuex offset")); toosmall (_("menuex offset"));
@@ -327,7 +327,7 @@ bin_to_res_menuitems (windres_bfd *wrbfd, const bfd_byte *data,
mi->state = 0; mi->state = 0;
mi->help = 0; mi->help = 0;
flags = windres_get_16 (wrbfd, data, 2); flags = windres_get_16 (wrbfd, data);
mi->type = flags &~ (MENUITEM_POPUP | MENUITEM_ENDMENU); mi->type = flags &~ (MENUITEM_POPUP | MENUITEM_ENDMENU);
if ((flags & MENUITEM_POPUP) == 0) if ((flags & MENUITEM_POPUP) == 0)
@@ -341,7 +341,7 @@ bin_to_res_menuitems (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
if (windres_get_16 (wrbfd, data + stroff, 2) == 0) if (windres_get_16 (wrbfd, data + stroff) == 0)
{ {
slen = 0; slen = 0;
mi->text = NULL; mi->text = NULL;
@@ -358,7 +358,7 @@ bin_to_res_menuitems (windres_bfd *wrbfd, const bfd_byte *data,
if ((flags & MENUITEM_POPUP) == 0) if ((flags & MENUITEM_POPUP) == 0)
{ {
mi->popup = NULL; mi->popup = NULL;
mi->id = windres_get_16 (wrbfd, data + 2, 2); mi->id = windres_get_16 (wrbfd, data + 2);
} }
else else
{ {
@@ -413,13 +413,13 @@ bin_to_res_menuexitems (windres_bfd *wrbfd, const bfd_byte *data,
} }
mi = res_alloc (sizeof (rc_menuitem)); mi = res_alloc (sizeof (rc_menuitem));
mi->type = windres_get_32 (wrbfd, data, 4); mi->type = windres_get_32 (wrbfd, data);
mi->state = windres_get_32 (wrbfd, data + 4, 4); mi->state = windres_get_32 (wrbfd, data + 4);
mi->id = windres_get_32 (wrbfd, data + 8, 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; slen = 0;
mi->text = NULL; mi->text = NULL;
@@ -448,7 +448,7 @@ bin_to_res_menuexitems (windres_bfd *wrbfd, const bfd_byte *data,
toosmall (_("menuitem")); toosmall (_("menuitem"));
return NULL; return NULL;
} }
mi->help = windres_get_32 (wrbfd, data + itemlen, 4); mi->help = windres_get_32 (wrbfd, data + itemlen);
itemlen += 4; itemlen += 4;
mi->popup = bin_to_res_menuexitems (wrbfd, data + itemlen, 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)); d = res_alloc (sizeof (rc_dialog));
signature = windres_get_16 (wrbfd, data + 2, 2); signature = windres_get_16 (wrbfd, data + 2);
if (signature != 0xffff) if (signature != 0xffff)
{ {
d->ex = NULL; d->ex = NULL;
d->style = windres_get_32 (wrbfd, data, 4); d->style = windres_get_32 (wrbfd, data);
d->exstyle = windres_get_32 (wrbfd, data + 4, 4); d->exstyle = windres_get_32 (wrbfd, data + 4);
off = 8; off = 8;
} }
else else
{ {
int version; int version;
version = windres_get_16 (wrbfd, data, 2); version = windres_get_16 (wrbfd, data);
if (version != 1) if (version != 1)
{ {
non_fatal (_("unexpected DIALOGEX version %d"), version); 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 = res_alloc (sizeof (rc_dialog_ex));
d->ex->help = windres_get_32 (wrbfd, data + 4, 4); d->ex->help = windres_get_32 (wrbfd, data + 4);
d->exstyle = windres_get_32 (wrbfd, data + 8, 4); d->exstyle = windres_get_32 (wrbfd, data + 8);
d->style = windres_get_32 (wrbfd, data + 12, 4); d->style = windres_get_32 (wrbfd, data + 12);
off = 16; off = 16;
} }
@@ -526,11 +526,11 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL; return NULL;
} }
c = windres_get_16 (wrbfd, data + off, 2); c = windres_get_16 (wrbfd, data + off);
d->x = windres_get_16 (wrbfd, data + off + 2, 2); d->x = windres_get_16 (wrbfd, data + off + 2);
d->y = windres_get_16 (wrbfd, data + off + 4, 2); d->y = windres_get_16 (wrbfd, data + off + 4);
d->width = windres_get_16 (wrbfd, data + off + 6, 2); d->width = windres_get_16 (wrbfd, data + off + 6);
d->height = windres_get_16 (wrbfd, data + off + 8, 2); d->height = windres_get_16 (wrbfd, data + off + 8);
off += 10; off += 10;
@@ -570,7 +570,7 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL; return NULL;
} }
d->pointsize = windres_get_16 (wrbfd, data + off, 2); d->pointsize = windres_get_16 (wrbfd, data + off);
off += 2; off += 2;
if (d->ex != NULL) 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")); toosmall (_("dialogex font information"));
return NULL; return NULL;
} }
d->ex->weight = windres_get_16 (wrbfd, data + off, 2); d->ex->weight = windres_get_16 (wrbfd, data + off);
d->ex->italic = windres_get_8 (wrbfd, data + off + 2, 1); d->ex->italic = windres_get_8 (wrbfd, data + off + 2);
d->ex->charset = windres_get_8 (wrbfd, data + off + 3, 1); d->ex->charset = windres_get_8 (wrbfd, data + off + 3);
off += 4; off += 4;
} }
@@ -612,8 +612,8 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL; return NULL;
} }
dc->style = windres_get_32 (wrbfd, data + off, 4); dc->style = windres_get_32 (wrbfd, data + off);
dc->exstyle = windres_get_32 (wrbfd, data + off + 4, 4); dc->exstyle = windres_get_32 (wrbfd, data + off + 4);
dc->help = 0; dc->help = 0;
off += 8; off += 8;
} }
@@ -624,9 +624,9 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
toosmall (_("dialogex control")); toosmall (_("dialogex control"));
return NULL; return NULL;
} }
dc->help = windres_get_32 (wrbfd, data + off, 4); dc->help = windres_get_32 (wrbfd, data + off);
dc->exstyle = windres_get_32 (wrbfd, data + off + 4, 4); dc->exstyle = windres_get_32 (wrbfd, data + off + 4);
dc->style = windres_get_32 (wrbfd, data + off + 8, 4); dc->style = windres_get_32 (wrbfd, data + off + 8);
off += 12; off += 12;
} }
@@ -636,15 +636,15 @@ bin_to_res_dialog (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type length
return NULL; return NULL;
} }
dc->x = windres_get_16 (wrbfd, data + off, 2); dc->x = windres_get_16 (wrbfd, data + off);
dc->y = windres_get_16 (wrbfd, data + off + 2, 2); dc->y = windres_get_16 (wrbfd, data + off + 2);
dc->width = windres_get_16 (wrbfd, data + off + 4, 2); dc->width = windres_get_16 (wrbfd, data + off + 4);
dc->height = windres_get_16 (wrbfd, data + off + 6, 2); dc->height = windres_get_16 (wrbfd, data + off + 6);
if (d->ex != NULL) if (d->ex != NULL)
dc->id = windres_get_32 (wrbfd, data + off + 8, 4); dc->id = windres_get_32 (wrbfd, data + off + 8);
else 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); 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; return NULL;
} }
datalen = windres_get_16 (wrbfd, data + off, 2); datalen = windres_get_16 (wrbfd, data + off);
off += 2; off += 2;
if (datalen == 0) 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")); toosmall (_("stringtable string length"));
return NULL; return NULL;
} }
slen = windres_get_16 (wrbfd, data, 2); slen = windres_get_16 (wrbfd, data);
st->strings[i].length = slen; st->strings[i].length = slen;
if (slen > 0) 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; st->strings[i].string = s;
for (j = 0; j < slen; j++) 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; data += 2 + 2 * slen;
@@ -766,7 +766,7 @@ bin_to_res_fontdir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
c = windres_get_16 (wrbfd, data, 2); c = windres_get_16 (wrbfd, data);
first = NULL; first = NULL;
pp = &first; pp = &first;
@@ -785,7 +785,7 @@ bin_to_res_fontdir (windres_bfd *wrbfd, const bfd_byte *data,
bfi = (const struct bin_fontdir_item *) data; bfi = (const struct bin_fontdir_item *) data;
fd = res_alloc (sizeof *fd); 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 /* To work out the length of the fontdir data, we must get the
length of the device name and face name strings, even though 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 = res_alloc (sizeof (rc_accelerator));
a->flags = windres_get_16 (wrbfd, data, 2); a->flags = windres_get_16 (wrbfd, data);
a->key = windres_get_16 (wrbfd, data + 2, 2); a->key = windres_get_16 (wrbfd, data + 2);
a->id = windres_get_16 (wrbfd, data + 4, 2); a->id = windres_get_16 (wrbfd, data + 4);
a->next = NULL; a->next = NULL;
*pp = a; *pp = a;
@@ -919,14 +919,14 @@ bin_to_res_group_cursor (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
type = windres_get_16 (wrbfd, data + 2, 2); type = windres_get_16 (wrbfd, data + 2);
if (type != 2) if (type != 2)
{ {
non_fatal (_("unexpected group cursor type %d"), type); non_fatal (_("unexpected group cursor type %d"), type);
return NULL; return NULL;
} }
c = windres_get_16 (wrbfd, data + 4, 2); c = windres_get_16 (wrbfd, data + 4);
data += 6; data += 6;
length -= 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 = res_alloc (sizeof *gc);
gc->width = windres_get_16 (wrbfd, data, 2); gc->width = windres_get_16 (wrbfd, data);
gc->height = windres_get_16 (wrbfd, data + 2, 2); gc->height = windres_get_16 (wrbfd, data + 2);
gc->planes = windres_get_16 (wrbfd, data + 4, 2); gc->planes = windres_get_16 (wrbfd, data + 4);
gc->bits = windres_get_16 (wrbfd, data + 6, 2); gc->bits = windres_get_16 (wrbfd, data + 6);
gc->bytes = windres_get_32 (wrbfd, data + 8, 4); gc->bytes = windres_get_32 (wrbfd, data + 8);
gc->index = windres_get_16 (wrbfd, data + 12, 2); gc->index = windres_get_16 (wrbfd, data + 12);
gc->next = NULL; gc->next = NULL;
*pp = gc; *pp = gc;
@@ -984,14 +984,14 @@ bin_to_res_group_icon (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
type = windres_get_16 (wrbfd, data + 2, 2); type = windres_get_16 (wrbfd, data + 2);
if (type != 1) if (type != 1)
{ {
non_fatal (_("unexpected group icon type %d"), type); non_fatal (_("unexpected group icon type %d"), type);
return NULL; return NULL;
} }
c = windres_get_16 (wrbfd, data + 4, 2); c = windres_get_16 (wrbfd, data + 4);
data += 6; data += 6;
length -= 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 = res_alloc (sizeof (rc_group_icon));
gi->width = windres_get_8 (wrbfd, data, 1); gi->width = windres_get_8 (wrbfd, data);
gi->height = windres_get_8 (wrbfd, data + 1, 1); gi->height = windres_get_8 (wrbfd, data + 1);
gi->colors = windres_get_8 (wrbfd, data + 2, 1); gi->colors = windres_get_8 (wrbfd, data + 2);
gi->planes = windres_get_16 (wrbfd, data + 4, 2); gi->planes = windres_get_16 (wrbfd, data + 4);
gi->bits = windres_get_16 (wrbfd, data + 6, 2); gi->bits = windres_get_16 (wrbfd, data + 6);
gi->bytes = windres_get_32 (wrbfd, data + 8, 4); gi->bytes = windres_get_32 (wrbfd, data + 8);
gi->index = windres_get_16 (wrbfd, data + 12, 2); gi->index = windres_get_16 (wrbfd, data + 12);
gi->next = NULL; gi->next = NULL;
*pp = gi; *pp = gi;
@@ -1051,9 +1051,9 @@ get_version_header (windres_bfd *wrbfd, const bfd_byte *data,
return false; return false;
} }
*len = (windres_get_16 (wrbfd, data, 2) + 3) & ~3; *len = (windres_get_16 (wrbfd, data) + 3) & ~3;
*vallen = windres_get_16 (wrbfd, data + 2, 2); *vallen = windres_get_16 (wrbfd, data + 2);
*type = windres_get_16 (wrbfd, data + 4, 2); *type = windres_get_16 (wrbfd, data + 4);
*off = 6; *off = 6;
@@ -1078,7 +1078,7 @@ get_version_header (windres_bfd *wrbfd, const bfd_byte *data,
toosmall (key); toosmall (key);
return false; 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")); non_fatal (_("unexpected version string"));
return false; return false;
@@ -1155,14 +1155,14 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
signature = windres_get_32 (wrbfd, data, 4); signature = windres_get_32 (wrbfd, data);
if (signature != 0xfeef04bd) if (signature != 0xfeef04bd)
{ {
non_fatal (_("unexpected fixed version signature %lu"), signature); non_fatal (_("unexpected fixed version signature %lu"), signature);
return NULL; return NULL;
} }
fiv = windres_get_32 (wrbfd, data + 4, 4); fiv = windres_get_32 (wrbfd, data + 4);
if (fiv != 0 && fiv != 0x10000) if (fiv != 0 && fiv != 0x10000)
{ {
non_fatal (_("unexpected fixed version info version %lu"), fiv); 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 = res_alloc (sizeof (rc_fixed_versioninfo));
fi->file_version_ms = windres_get_32 (wrbfd, data + 8, 4); fi->file_version_ms = windres_get_32 (wrbfd, data + 8);
fi->file_version_ls = windres_get_32 (wrbfd, data + 12, 4); fi->file_version_ls = windres_get_32 (wrbfd, data + 12);
fi->product_version_ms = windres_get_32 (wrbfd, data + 16, 4); fi->product_version_ms = windres_get_32 (wrbfd, data + 16);
fi->product_version_ls = windres_get_32 (wrbfd, data + 20, 4); fi->product_version_ls = windres_get_32 (wrbfd, data + 20);
fi->file_flags_mask = windres_get_32 (wrbfd, data + 24, 4); fi->file_flags_mask = windres_get_32 (wrbfd, data + 24);
fi->file_flags = windres_get_32 (wrbfd, data + 28, 4); fi->file_flags = windres_get_32 (wrbfd, data + 28);
fi->file_os = windres_get_32 (wrbfd, data + 32, 4); fi->file_os = windres_get_32 (wrbfd, data + 32);
fi->file_type = windres_get_32 (wrbfd, data + 36, 4); fi->file_type = windres_get_32 (wrbfd, data + 36);
fi->file_subtype = windres_get_32 (wrbfd, data + 40, 4); fi->file_subtype = windres_get_32 (wrbfd, data + 40);
fi->file_date_ms = windres_get_32 (wrbfd, data + 44, 4); fi->file_date_ms = windres_get_32 (wrbfd, data + 44);
fi->file_date_ls = windres_get_32 (wrbfd, data + 48, 4); fi->file_date_ls = windres_get_32 (wrbfd, data + 48);
data += 52; data += 52;
length -= 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)); 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') 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 = res_alloc (sizeof (rc_ver_varinfo));
vv->language = windres_get_16 (wrbfd, data, 2); vv->language = windres_get_16 (wrbfd, data);
vv->charset = windres_get_16 (wrbfd, data + 2, 2); vv->charset = windres_get_16 (wrbfd, data + 2);
vv->next = NULL; vv->next = NULL;
*ppvv = vv; *ppvv = vv;
@@ -1453,9 +1453,9 @@ bin_to_res_toolbar (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
ri = res_alloc (sizeof (rc_toolbar)); ri = res_alloc (sizeof (rc_toolbar));
ri->button_width = windres_get_32 (wrbfd, data, 4); ri->button_width = windres_get_32 (wrbfd, data);
ri->button_height = windres_get_32 (wrbfd, data + 4, 4); ri->button_height = windres_get_32 (wrbfd, data + 4);
ri->nitems = windres_get_32 (wrbfd, data + 8, 4); ri->nitems = windres_get_32 (wrbfd, data + 8);
ri->items = NULL; ri->items = NULL;
data += 12; data += 12;
@@ -1470,7 +1470,7 @@ bin_to_res_toolbar (windres_bfd *wrbfd, const bfd_byte *data,
toosmall (_("toolbar item")); toosmall (_("toolbar item"));
return NULL; 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; it->prev = it->next = NULL;
data += 4; data += 4;
length -= 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; erd = (const struct extern_res_directory *) data;
rd = (rc_res_directory *) res_alloc (sizeof (rc_res_directory)); rd = (rc_res_directory *) res_alloc (sizeof (rc_res_directory));
rd->characteristics = windres_get_32 (wrbfd, erd->characteristics, 4); rd->characteristics = windres_get_32 (wrbfd, erd->characteristics);
rd->time = windres_get_32 (wrbfd, erd->time, 4); rd->time = windres_get_32 (wrbfd, erd->time);
rd->major = windres_get_16 (wrbfd, erd->major, 2); rd->major = windres_get_16 (wrbfd, erd->major);
rd->minor = windres_get_16 (wrbfd, erd->minor, 2); rd->minor = windres_get_16 (wrbfd, erd->minor);
rd->entries = NULL; rd->entries = NULL;
name_count = windres_get_16 (wrbfd, erd->name_count, 2); name_count = windres_get_16 (wrbfd, erd->name_count);
id_count = windres_get_16 (wrbfd, erd->id_count, 2); id_count = windres_get_16 (wrbfd, erd->id_count);
pp = &rd->entries; pp = &rd->entries;
@@ -261,8 +261,8 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
name = windres_get_32 (wrbfd, ere->name, 4); name = windres_get_32 (wrbfd, ere->name);
rva = windres_get_32 (wrbfd, ere->rva, 4); rva = windres_get_32 (wrbfd, ere->rva);
/* For some reason the high bit in NAME is set. */ /* For some reason the high bit in NAME is set. */
name &=~ 0x80000000; name &=~ 0x80000000;
@@ -279,7 +279,7 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
overrun (flaginfo, _("resource name")); overrun (flaginfo, _("resource name"));
return NULL; return NULL;
} }
length = windres_get_16 (wrbfd, ers, 2); length = windres_get_16 (wrbfd, ers);
/* PR 17512: file: 05dc4a16. */ /* PR 17512: file: 05dc4a16. */
if (length * 2 + 4 > flaginfo->data_end - ers) 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.length = length;
re->id.u.n.name = (unichar *) res_alloc (length * sizeof (unichar)); re->id.u.n.name = (unichar *) res_alloc (length * sizeof (unichar));
for (j = 0; j < length; j++) 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) if (level == 0)
type = &re->id; type = &re->id;
@@ -337,8 +337,8 @@ read_coff_res_dir (windres_bfd *wrbfd, const bfd_byte *data,
return NULL; return NULL;
} }
name = windres_get_32 (wrbfd, ere->name, 4); name = windres_get_32 (wrbfd, ere->name);
rva = windres_get_32 (wrbfd, ere->rva, 4); rva = windres_get_32 (wrbfd, ere->rva);
re = (rc_res_entry *) res_alloc (sizeof *re); re = (rc_res_entry *) res_alloc (sizeof *re);
re->next = NULL; 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; erd = (const struct extern_res_data *) data;
size = windres_get_32 (wrbfd, erd->size, 4); size = windres_get_32 (wrbfd, erd->size);
rva = windres_get_32 (wrbfd, erd->rva, 4); rva = windres_get_32 (wrbfd, erd->rva);
if (rva < flaginfo->secaddr if (rva < flaginfo->secaddr
|| rva - flaginfo->secaddr >= (rc_uint_type) (flaginfo->data_end - flaginfo->data)) || 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) if (r != NULL)
{ {
memset (&r->res_info, 0, sizeof (rc_res_res_info)); memset (&r->res_info, 0, sizeof (rc_res_res_info));
r->coff_info.codepage = windres_get_32 (wrbfd, erd->codepage, 4); r->coff_info.codepage = windres_get_32 (wrbfd, erd->codepage);
r->coff_info.reserved = windres_get_32 (wrbfd, erd->reserved, 4); r->coff_info.reserved = windres_get_32 (wrbfd, erd->reserved);
} }
return r; return r;

View File

@@ -299,7 +299,7 @@ run_cmd (char *cmd, const char *redir)
if (WEXITSTATUS (wait_status) != 0) if (WEXITSTATUS (wait_status) != 0)
{ {
fatal (_("%s exited with status %d"), cmd, fatal (_("%s exited with status %d"), cmd,
WEXITSTATUS (wait_status)); WEXITSTATUS (wait_status));
retcode = 1; retcode = 1;
} }
} }
@@ -331,7 +331,7 @@ open_input_stream (char *cmd)
if (verbose) if (verbose)
fprintf (stderr, fprintf (stderr,
_("Using temporary file `%s' to read preprocessor output\n"), _("Using temporary file `%s' to read preprocessor output\n"),
cpp_temp_file); cpp_temp_file);
} }
else else
@@ -359,15 +359,15 @@ filename_need_quotes (const char *filename)
while (*filename != 0) while (*filename != 0)
{ {
switch (*filename) switch (*filename)
{ {
case '&': case '&':
case ' ': case ' ':
case '<': case '<':
case '>': case '>':
case '|': case '|':
case '%': case '%':
return 1; return 1;
} }
++filename; ++filename;
} }
return 0; return 0;
@@ -529,7 +529,7 @@ read_rc_file (const char *filename, const char *preprocessor,
if (slash && ! cpp_pipe) if (slash && ! cpp_pipe)
{ {
/* Next, try looking for a gcc in the same directory as /* Next, try looking for a gcc in the same directory as
that windres */ that windres */
cpp_pipe = look_for_default (cmd, program_name, slash - program_name + 1, cpp_pipe = look_for_default (cmd, program_name, slash - program_name + 1,
preprocargs, filename); preprocargs, filename);
@@ -586,11 +586,11 @@ close_input_stream (void)
else else
{ {
if (cpp_pipe != NULL) if (cpp_pipe != NULL)
{ {
int err; int err;
err = pclose (cpp_pipe); err = pclose (cpp_pipe);
/* We are reading from a pipe, therefore we don't /* We are reading from a pipe, therefore we don't
know if cpp failed or succeeded until pclose. */ know if cpp failed or succeeded until pclose. */
if (err != 0 || errno == ECHILD) if (err != 0 || errno == ECHILD)
{ {
/* Since this is also run via xatexit, safeguard. */ /* Since this is also run via xatexit, safeguard. */
@@ -598,7 +598,7 @@ close_input_stream (void)
cpp_temp_file = NULL; cpp_temp_file = NULL;
fatal (_("preprocessing failed.")); fatal (_("preprocessing failed."));
} }
} }
} }
/* Since this is also run via xatexit, safeguard. */ /* Since this is also run via xatexit, safeguard. */
@@ -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"), fatal (_("%s: read of %lu returned %lu"),
msg, (unsigned long) c, (unsigned long) got); 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. */ /* Define an accelerator resource. */
@@ -1094,7 +1110,7 @@ define_fontdir_rcdata (rc_res_id id,const rc_res_res_info *resinfo,
if (pb_data) if (pb_data)
{ {
rc_uint_type off = 2; 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--) for (; c > 0; c--)
{ {
size_t len; 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; bfi = (const struct bin_fontdir_item *) pb_data + off;
fd = (rc_fontdir *) res_alloc (sizeof (rc_fontdir)); 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; fd->data = pb_data + off;
off += 56; off += 56;
len = strlen ((char *) bfi->device_name) + 1; len = strlen ((char *) bfi->device_name) + 1;
@@ -1230,8 +1246,8 @@ define_icon (rc_res_id id, const rc_res_res_info *resinfo,
rc_group_icon *cg; rc_group_icon *cg;
/* For some reason, at least in some files the planes and bits /* For some reason, at least in some files the planes and bits
are zero. We instead set them from the color. This is are zero. We instead set them from the color. This is
copied from rcl. */ copied from rcl. */
cg = (rc_group_icon *) res_alloc (sizeof (rc_group_icon)); cg = (rc_group_icon *) res_alloc (sizeof (rc_group_icon));
cg->next = NULL; cg->next = NULL;
@@ -1288,10 +1304,10 @@ define_group_icon_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
{ {
int c, i; int c, i;
unsigned short type; 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) if (type != 1)
fatal (_("unexpected group icon type %d"), type); 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; len_data -= 6;
pb_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->width = pb_data[0];
cg->height = pb_data[1]; cg->height = pb_data[1];
cg->colors = pb_data[2]; cg->colors = pb_data[2];
cg->planes = windres_get_16 (&wrtarget, pb_data + 4, len_data - 4); cg->planes = target_get_16 (pb_data + 4, len_data - 4);
cg->bits = windres_get_16 (&wrtarget, pb_data + 6, len_data - 6); cg->bits = target_get_16 (pb_data + 6, len_data - 6);
cg->bytes = windres_get_32 (&wrtarget, pb_data + 8, len_data - 8); cg->bytes = target_get_32 (pb_data + 8, len_data - 8);
cg->index = windres_get_16 (&wrtarget, pb_data + 12, len_data - 12); cg->index = target_get_16 (pb_data + 12, len_data - 12);
if (! first) if (! first)
first = cg; first = cg;
else else
@@ -1341,10 +1357,10 @@ define_group_cursor_rcdata (rc_res_id id, const rc_res_res_info *resinfo,
{ {
int c, i; int c, i;
unsigned short type; 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) if (type != 2)
fatal (_("unexpected group cursor type %d"), type); 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; len_data -= 6;
pb_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"); fatal ("too small group icon rcdata");
cg = (rc_group_cursor *) res_alloc (sizeof (rc_group_cursor)); cg = (rc_group_cursor *) res_alloc (sizeof (rc_group_cursor));
cg->next = NULL; cg->next = NULL;
cg->width = windres_get_16 (&wrtarget, pb_data, len_data); cg->width = target_get_16 (pb_data, len_data);
cg->height = windres_get_16 (&wrtarget, pb_data + 2, len_data - 2); cg->height = target_get_16 (pb_data + 2, len_data - 2);
cg->planes = windres_get_16 (&wrtarget, pb_data + 4, len_data - 4); cg->planes = target_get_16 (pb_data + 4, len_data - 4);
cg->bits = windres_get_16 (&wrtarget, pb_data + 6, len_data - 6); cg->bits = target_get_16 (pb_data + 6, len_data - 6);
cg->bytes = windres_get_32 (&wrtarget, pb_data + 8, len_data - 8); cg->bytes = target_get_32 (pb_data + 8, len_data - 8);
cg->index = windres_get_16 (&wrtarget, pb_data + 12, len_data - 12); cg->index = target_get_16 (pb_data + 12, len_data - 12);
if (! first) if (! first)
first = cg; first = cg;
else 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); pb_data = rcdata_render_as_buffer (data, &len_data);
c = (rc_cursor *) res_alloc (sizeof (rc_cursor)); c = (rc_cursor *) res_alloc (sizeof (rc_cursor));
c->xhotspot = windres_get_16 (&wrtarget, pb_data, len_data); c->xhotspot = target_get_16 (pb_data, len_data);
c->yhotspot = windres_get_16 (&wrtarget, pb_data + 2, len_data - 2); c->yhotspot = target_get_16 (pb_data + 2, len_data - 2);
c->length = len_data - BIN_CURSOR_SIZE; c->length = len_data - BIN_CURSOR_SIZE;
c->data = (const bfd_byte *) (data + BIN_CURSOR_SIZE); c->data = (const bfd_byte *) (data + BIN_CURSOR_SIZE);
@@ -1994,9 +2010,9 @@ write_rc_directory (FILE *e, const rc_res_directory *rd,
{ {
case 1: case 1:
/* If we're at level 1, the key of this resource is the /* If we're at level 1, the key of this resource is the
type. This normally duplicates the information we have type. This normally duplicates the information we have
stored with the resource itself, but we need to remember stored with the resource itself, but we need to remember
the type if this is a user define resource type. */ the type if this is a user define resource type. */
type = &re->id; type = &re->id;
break; break;
@@ -2031,10 +2047,10 @@ write_rc_directory (FILE *e, const rc_res_directory *rd,
if (level == 3) if (level == 3)
{ {
/* This is the normal case: the three levels are /* This is the normal case: the three levels are
TYPE/NAME/LANGUAGE. NAME will have been set at level TYPE/NAME/LANGUAGE. NAME will have been set at level
2, and represents the name to use. We probably just 2, and represents the name to use. We probably just
set LANGUAGE, and it will probably match what the set LANGUAGE, and it will probably match what the
resource itself records if anything. */ resource itself records if anything. */
write_rc_resource (e, type, name, re->u.res, language); write_rc_resource (e, type, name, re->u.res, language);
} }
else else
@@ -2493,7 +2509,7 @@ write_rc_cursor (FILE *e, const rc_cursor *cursor)
(unsigned int) cursor->xhotspot, (unsigned int) cursor->yhotspot, (unsigned int) cursor->xhotspot, (unsigned int) cursor->yhotspot,
(int) cursor->xhotspot, (int) cursor->yhotspot); (int) cursor->xhotspot, (int) cursor->yhotspot);
write_rc_datablock (e, (rc_uint_type) cursor->length, (const bfd_byte *) cursor->data, write_rc_datablock (e, (rc_uint_type) cursor->length, (const bfd_byte *) cursor->data,
0, 0, 0); 0, 0, 0);
fprintf (e, "END\n"); fprintf (e, "END\n");
} }
@@ -2654,10 +2670,10 @@ write_rc_dialog_control (FILE *e, const rc_dialog_control *control)
/* For EDITTEXT, COMBOBOX, LISTBOX, and SCROLLBAR don't dump text. */ /* For EDITTEXT, COMBOBOX, LISTBOX, and SCROLLBAR don't dump text. */
if ((control->text.named || control->text.u.id != 0) if ((control->text.named || control->text.u.id != 0)
&& (!ci && (!ci
|| (ci->class != CTL_EDIT || (ci->class != CTL_EDIT
&& ci->class != CTL_COMBOBOX && ci->class != CTL_COMBOBOX
&& ci->class != CTL_LISTBOX && ci->class != CTL_LISTBOX
&& ci->class != CTL_SCROLLBAR))) && ci->class != CTL_SCROLLBAR)))
{ {
fprintf (e, " "); fprintf (e, " ");
res_id_print (e, control->text, 1); res_id_print (e, control->text, 1);
@@ -2906,8 +2922,8 @@ test_rc_datablock_text (rc_uint_type length, const bfd_byte *data)
for (i = 0, c = 0; i < length; i++) for (i = 0, c = 0; i < length; i++)
{ {
if (! ISPRINT (data[i]) && data[i] != '\n' if (! ISPRINT (data[i]) && data[i] != '\n'
&& ! (data[i] == '\r' && (i + 1) < length && data[i + 1] == '\n') && ! (data[i] == '\r' && (i + 1) < length && data[i + 1] == '\n')
&& data[i] != '\t' && data[i] != '\t'
&& ! (data[i] == 0 && (i + 1) != length)) && ! (data[i] == 0 && (i + 1) != length))
{ {
if (data[i] <= 7) if (data[i] <= 7)
@@ -2944,7 +2960,7 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
rc_uint_type m, i; rc_uint_type m, i;
mt = (const struct bin_messagetable *) data; 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)) 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; rc_uint_type low, high, offset;
const struct bin_messagetable_item *mti; const struct bin_messagetable_item *mti;
low = windres_get_32 (&wrtarget, mt->items[i].lowid, 4); low = windres_get_32 (&wrtarget, mt->items[i].lowid);
high = windres_get_32 (&wrtarget, mt->items[i].highid, 4); high = windres_get_32 (&wrtarget, mt->items[i].highid);
offset = windres_get_32 (&wrtarget, mt->items[i].offset, 4); offset = windres_get_32 (&wrtarget, mt->items[i].offset);
while (low <= high) while (low <= high)
{ {
@@ -2969,8 +2985,8 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
break; break;
} }
mti = (const struct bin_messagetable_item *) &data[offset]; mti = (const struct bin_messagetable_item *) &data[offset];
elen = windres_get_16 (&wrtarget, mti->length, 2); elen = windres_get_16 (&wrtarget, mti->length);
flags = windres_get_16 (&wrtarget, mti->flags, 2); flags = windres_get_16 (&wrtarget, mti->flags);
if ((offset + elen) > length) if ((offset + elen) > length)
{ {
has_error = 1; has_error = 1;
@@ -3008,8 +3024,8 @@ write_rc_messagetable (FILE *e, rc_uint_type length, const bfd_byte *data)
} }
static void static void
write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_next, write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data,
int hasblock, int show_comment) int has_next, int hasblock, int show_comment)
{ {
int plen; int plen;
@@ -3031,23 +3047,23 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
if (i < length && data[i] == '\n') if (i < length && data[i] == '\n')
++i, ++c; ++i, ++c;
ascii_print(e, (const char *) &data[i - c], c); ascii_print(e, (const char *) &data[i - c], c);
fprintf (e, "\""); fprintf (e, "\"");
if (i < length) if (i < length)
fprintf (e, "\n"); fprintf (e, "\n");
} }
if (i == 0) if (i == 0)
{ {
indent (e, 2); indent (e, 2);
fprintf (e, "\"\""); fprintf (e, "\"\"");
} }
if (has_next) if (has_next)
fprintf (e, ","); fprintf (e, ",");
fprintf (e, "\n"); fprintf (e, "\n");
if (hasblock) if (hasblock)
fprintf (e, "END\n"); fprintf (e, "END\n");
return; return;
} }
if (test_rc_datablock_unicode (length, data)) if (test_rc_datablock_unicode (length, data))
{ {
rc_uint_type i, c; rc_uint_type i, c;
@@ -3057,20 +3073,20 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
u = (const unichar *) &data[i]; u = (const unichar *) &data[i];
indent (e, 2); indent (e, 2);
fprintf (e, "L\""); fprintf (e, "L\"");
for (c = 0; i < length && c < 160 && u[c] != '\n'; c++, i += 2) for (c = 0; i < length && c < 160 && u[c] != '\n'; c++, i += 2)
; ;
if (i < length && u[c] == '\n') if (i < length && u[c] == '\n')
i += 2, ++c; i += 2, ++c;
unicode_print (e, u, c); unicode_print (e, u, c);
fprintf (e, "\""); fprintf (e, "\"");
if (i < length) if (i < length)
fprintf (e, "\n"); fprintf (e, "\n");
} }
if (i == 0) if (i == 0)
{ {
indent (e, 2); indent (e, 2);
fprintf (e, "L\"\""); fprintf (e, "L\"\"");
} }
@@ -3086,14 +3102,14 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
} }
if (length != 0) if (length != 0)
{ {
rc_uint_type i, max_row; rc_uint_type i, max_row;
int first = 1; int first = 1;
max_row = (show_comment ? 4 : 8); max_row = (show_comment ? 4 : 8);
indent (e, 2); indent (e, 2);
for (i = 0; i + 3 < length;) for (i = 0; i + 3 < length;)
{ {
rc_uint_type k; rc_uint_type k;
rc_uint_type comment_start; rc_uint_type comment_start;
@@ -3103,65 +3119,68 @@ write_rc_datablock (FILE *e, rc_uint_type length, const bfd_byte *data, int has_
indent (e, 2); indent (e, 2);
for (k = 0; k < max_row && i + 3 < length; k++, i += 4) for (k = 0; k < max_row && i + 3 < length; k++, i += 4)
{ {
if (k == 0) if (k == 0)
plen = fprintf (e, "0x%lxL", plen = fprintf (e, "0x%lxL",
(unsigned long) windres_get_32 (&wrtarget, data + i, length - i)); (unsigned long) target_get_32 (data + i,
else length - i));
else
plen = fprintf (e, " 0x%lxL", 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 (has_next || (i + 4) < length)
{ {
if (plen>0 && plen < 11) if (plen>0 && plen < 11)
indent (e, 11 - plen); indent (e, 11 - plen);
fprintf (e, ","); fprintf (e, ",");
} }
} }
if (show_comment) if (show_comment)
{ {
fprintf (e, "\t/* "); 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, ". */");
} }
fprintf (e, "\n"); fprintf (e, "\n");
first = 0; first = 0;
} }
if (i + 1 < length) if (i + 1 < length)
{ {
if (! first) if (! first)
indent (e, 2); indent (e, 2);
plen = fprintf (e, "0x%x", 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 (has_next || i + 2 < length)
{ {
if (plen > 0 && plen < 11) if (plen > 0 && plen < 11)
indent (e, 11 - plen); indent (e, 11 - plen);
fprintf (e, ","); fprintf (e, ",");
} }
if (show_comment) if (show_comment)
{ {
fprintf (e, "\t/* "); fprintf (e, "\t/* ");
ascii_print (e, (const char *) &data[i], 2); ascii_print (e, (const char *) &data[i], 2);
fprintf (e, ". */"); fprintf (e, ". */");
} }
fprintf (e, "\n"); fprintf (e, "\n");
i += 2; i += 2;
first = 0; first = 0;
} }
if (i < length) if (i < length)
{ {
if (! first) if (! first)
indent (e, 2); indent (e, 2);
fprintf (e, "\""); fprintf (e, "\"");
ascii_print (e, (const char *) &data[i], 1); ascii_print (e, (const char *) &data[i], 1);
fprintf (e, "\""); fprintf (e, "\"");
if (has_next) if (has_next)
fprintf (e, ","); fprintf (e, ",");
fprintf (e, "\n"); fprintf (e, "\n");
first = 0; first = 0;
} }
} }
if (hasblock) if (hasblock)
fprintf (e, "END\n"); fprintf (e, "END\n");
@@ -3214,9 +3233,9 @@ write_rc_rcdata (FILE *e, const rc_rcdata_item *rcdata, int ind)
case RCDATA_BUFFER: case RCDATA_BUFFER:
write_rc_datablock (e, (rc_uint_type) ri->u.buffer.length, write_rc_datablock (e, (rc_uint_type) ri->u.buffer.length,
(const bfd_byte *) ri->u.buffer.data, (const bfd_byte *) ri->u.buffer.data,
ri->next != NULL, 0, -1); ri->next != NULL, 0, -1);
break; break;
} }
if (ri->type != RCDATA_BUFFER) if (ri->type != RCDATA_BUFFER)
@@ -3257,7 +3276,7 @@ write_rc_stringtable (FILE *e, const rc_res_id *name,
{ {
fprintf (e, " %lu, ", (unsigned long) offset + i); fprintf (e, " %lu, ", (unsigned long) offset + i);
unicode_print_quoted (e, stringtable->strings[i].string, unicode_print_quoted (e, stringtable->strings[i].string,
stringtable->strings[i].length); stringtable->strings[i].length);
fprintf (e, "\n"); fprintf (e, "\n");
} }
} }
@@ -3298,7 +3317,7 @@ write_rc_versioninfo (FILE *e, const rc_versioninfo *versioninfo)
fprintf (e, " FILESUBTYPE 0x%x\n", (unsigned int) f->file_subtype); fprintf (e, " FILESUBTYPE 0x%x\n", (unsigned int) f->file_subtype);
if (f->file_date_ms != 0 || f->file_date_ls != 0) if (f->file_date_ms != 0 || f->file_date_ls != 0)
fprintf (e, "/* Date: %u, %u. */\n", fprintf (e, "/* Date: %u, %u. */\n",
(unsigned int) f->file_date_ms, (unsigned int) f->file_date_ls); (unsigned int) f->file_date_ms, (unsigned int) f->file_date_ls);
fprintf (e, "BEGIN\n"); fprintf (e, "BEGIN\n");
@@ -3366,7 +3385,7 @@ rcdata_copy (const rc_rcdata_item *src, bfd_byte *dst)
if (! src) if (! src)
return 0; return 0;
switch (src->type) switch (src->type)
{ {
case RCDATA_WORD: case RCDATA_WORD:
if (dst) if (dst)
windres_put_16 (&wrtarget, dst, (rc_uint_type) src->u.word); windres_put_16 (&wrtarget, dst, (rc_uint_type) src->u.word);

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 additional resource header */
read_res_data (wrbfd, off, omax, &l, BIN_RES_INFO_SIZE); read_res_data (wrbfd, off, omax, &l, BIN_RES_INFO_SIZE);
resinfo.version = windres_get_32 (wrbfd, l.version, 4); resinfo.version = windres_get_32 (wrbfd, l.version);
resinfo.memflags = windres_get_16 (wrbfd, l.memflags, 2); resinfo.memflags = windres_get_16 (wrbfd, l.memflags);
resinfo.language = windres_get_16 (wrbfd, l.language, 2); resinfo.language = windres_get_16 (wrbfd, l.language);
/* resinfo.version2 = windres_get_32 (wrbfd, l.version2, 4); */ /* resinfo.version2 = windres_get_32 (wrbfd, l.version2); */
resinfo.characteristics = windres_get_32 (wrbfd, l.characteristics, 4); resinfo.characteristics = windres_get_32 (wrbfd, l.characteristics);
off[0] = (off[0] + 3) & ~3; 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); 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); get_windres_bfd_content (wrbfd, &brh, off[0], BIN_RES_HDR_SIZE);
reshdr->data_size = windres_get_32 (wrbfd, brh.data_size, 4); reshdr->data_size = windres_get_32 (wrbfd, brh.data_size);
reshdr->header_size = windres_get_32 (wrbfd, brh.header_size, 4); reshdr->header_size = windres_get_32 (wrbfd, brh.header_size);
off[0] += BIN_RES_HDR_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; rc_uint_type len;
read_res_data (wrbfd, off, omax, &bid, BIN_RES_ID - 2); 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 */ if (ord == 0xFFFF) /* an ordinal id */
{ {
read_res_data (wrbfd, off, omax, bid.id, BIN_RES_ID - 2); read_res_data (wrbfd, off, omax, bid.id, BIN_RES_ID - 2);
id->named = 0; id->named = 0;
id->u.id = windres_get_16 (wrbfd, bid.id, 2); id->u.id = windres_get_16 (wrbfd, bid.id);
} }
else else
/* named id */ /* named id */
@@ -575,7 +575,7 @@ read_unistring (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
do do
{ {
read_res_data (wrbfd, &soff, omax, d, sizeof (unichar)); 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); while (c != 0);
l = ((soff - off[0]) / sizeof (unichar)); l = ((soff - off[0]) / sizeof (unichar));
@@ -585,7 +585,7 @@ read_unistring (windres_bfd *wrbfd, rc_uint_type *off, rc_uint_type omax,
do do
{ {
read_res_data (wrbfd, off, omax, d, sizeof (unichar)); read_res_data (wrbfd, off, omax, d, sizeof (unichar));
c = windres_get_16 (wrbfd, d, 2); c = windres_get_16 (wrbfd, d);
*p++ = c; *p++ = c;
} }
while (c != 0); 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_8 (windres_bfd *, void *, rc_uint_type);
extern void windres_put_16 (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 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_8 (windres_bfd *, const void *);
extern rc_uint_type windres_get_16 (windres_bfd *, const void *, rc_uint_type); extern rc_uint_type windres_get_16 (windres_bfd *, const void *);
extern rc_uint_type windres_get_32 (windres_bfd *, const void *, rc_uint_type); 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 (windres_bfd *, bfd *, asection *, rc_uint_type);
extern void set_windres_bfd_endianness (windres_bfd *, int); 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 static rc_uint_type
target_get_8 (const void *p, rc_uint_type length) target_get_8 (const void *p)
{ {
rc_uint_type ret; rc_uint_type ret = *((const bfd_byte *) p);
if (length < 1)
fatal ("Resource too small for getting 8-bit value.");
ret = (rc_uint_type) *((const bfd_byte *) p);
return ret & 0xff; return ret & 0xff;
} }
static rc_uint_type 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) if (target_is_bigendian)
return bfd_getb16 (p); return bfd_getb16 (p);
else else
@@ -1234,11 +1226,8 @@ target_get_16 (const void *p, rc_uint_type length)
} }
static rc_uint_type 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) if (target_is_bigendian)
return bfd_getb32 (p); return bfd_getb32 (p);
else else
@@ -1304,14 +1293,12 @@ windres_put_32 (windres_bfd *wrbfd, void *data, rc_uint_type value)
} }
rc_uint_type 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)) switch (WR_KIND(wrbfd))
{ {
case WR_KIND_TARGET: case WR_KIND_TARGET:
return target_get_8 (data, length); return target_get_8 (data);
case WR_KIND_BFD: case WR_KIND_BFD:
case WR_KIND_BFD_BIN_B: case WR_KIND_BFD_BIN_B:
case WR_KIND_BFD_BIN_L: 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 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)) switch (WR_KIND(wrbfd))
{ {
case WR_KIND_TARGET: case WR_KIND_TARGET:
return target_get_16 (data, length); return target_get_16 (data);
case WR_KIND_BFD: case WR_KIND_BFD:
case WR_KIND_BFD_BIN_B: case WR_KIND_BFD_BIN_B:
return bfd_get_16 (WR_BFD(wrbfd), data); 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 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)) switch (WR_KIND(wrbfd))
{ {
case WR_KIND_TARGET: case WR_KIND_TARGET:
return target_get_32 (data, length); return target_get_32 (data);
case WR_KIND_BFD: case WR_KIND_BFD:
case WR_KIND_BFD_BIN_B: case WR_KIND_BFD_BIN_B:
return bfd_get_32 (WR_BFD(wrbfd), data); return bfd_get_32 (WR_BFD(wrbfd), data);