#endif
static char *get_ptr;
-#define GET_BYTE() (*get_ptr++ & 0xff)
+static char *start_ptr;
+static off_t storage_size;
+#define setup_get(PTR, SIZE) (start_ptr = get_ptr = (PTR), storage_size = (SIZE))
#if DUMP_HEADER
-static char *start_ptr;
-#define setup_get(PTR) (start_ptr = get_ptr = (PTR))
#define get_byte() dump_get_byte()
#define skip_bytes(len) dump_skip_bytes(len)
#else
-#define setup_get(PTR) (get_ptr = (PTR))
-#define get_byte() GET_BYTE()
-#define skip_bytes(len) (get_ptr += (len))
+#define get_byte() _get_byte()
+#define skip_bytes(len) _skip_bytes(len)
#endif
#define put_ptr get_ptr
#define setup_put(PTR) (put_ptr = (PTR))
return sum & 0xff;
}
+static void
+_skip_bytes(len)
+{
+ if (len < 0) {
+ error("Invalid header: %d", len);
+ exit(1);
+ }
+ get_ptr += len;
+}
+
+static int
+_get_byte()
+{
+ if (get_ptr < start_ptr || get_ptr - start_ptr >= storage_size) {
+ error("Invalid header");
+ exit(1);
+ }
+
+ return (*get_ptr++ & 0xff);
+}
+
#if DUMP_HEADER
static int
dump_get_byte()
if (verbose_listing && verbose > 1)
printf("%02d %2d: ", get_ptr - start_ptr, 1);
- c = GET_BYTE();
+ c = _get_byte();
if (verbose_listing && verbose > 1) {
if (isprint(c))
printf("%d(0x%02x) '%c'\n", c, c, c);
if (len == 0) return;
if (verbose_listing && verbose > 1) {
printf("%02d %2d: ", get_ptr - start_ptr, len);
+ if (len < 0) {
+ error("Invalid header: %d", len);
+ exit(1);
+ }
while (len--)
- printf("0x%02x ", GET_BYTE());
+ printf("0x%02x ", _get_byte());
printf("... ignored\n");
}
else
- get_ptr += len;
+ _skip_bytes(len);
}
#endif
if (verbose_listing && verbose > 1)
printf("%02d %2d: ", get_ptr - start_ptr, 2);
#endif
- b0 = GET_BYTE();
- b1 = GET_BYTE();
+ b0 = _get_byte();
+ b1 = _get_byte();
w = (b1 << 8) + b0;
#if DUMP_HEADER
if (verbose_listing && verbose > 1)
if (verbose_listing && verbose > 1)
printf("%02d %2d: ", get_ptr - start_ptr, 4);
#endif
- b0 = GET_BYTE();
- b1 = GET_BYTE();
- b2 = GET_BYTE();
- b3 = GET_BYTE();
+ b0 = _get_byte();
+ b1 = _get_byte();
+ b2 = _get_byte();
+ b3 = _get_byte();
l = (b3 << 24) + (b2 << 16) + (b1 << 8) + b0;
#if DUMP_HEADER
if (verbose_listing && verbose > 1)
if (verbose_listing && verbose > 1)
printf("%02d %2d: ", get_ptr - start_ptr, 4);
#endif
- b0 = GET_BYTE();
- b1 = GET_BYTE();
- b2 = GET_BYTE();
- b3 = GET_BYTE();
- b4 = GET_BYTE();
- b5 = GET_BYTE();
- b6 = GET_BYTE();
- b7 = GET_BYTE();
+ b0 = _get_byte();
+ b1 = _get_byte();
+ b2 = _get_byte();
+ b3 = _get_byte();
+ b4 = _get_byte();
+ b5 = _get_byte();
+ b6 = _get_byte();
+ b7 = _get_byte();
l = (b7 << 24) + (b6 << 16) + (b5 << 8) + b4;
l <<= 32;
#if DUMP_HEADER
if (verbose_listing && verbose > 1)
printf("%02d %2d: \"", get_ptr - start_ptr, len);
+ if (len < 0) {
+ error("Invalid header: %d", len);
+ exit(1);
+ }
- for (i = 0; i < len; i++) {
- if (i < size) buf[i] = get_ptr[i];
+ for (i = 0; i < len && i < size; i++) {
+ buf[i] = get_ptr[i];
if (verbose_listing && verbose > 1) {
if (isprint(buf[i]))
if (verbose_listing && verbose > 1)
printf("\"\n");
#else
+ if (len < 0) {
+ error("Invalid header: %d", len);
+ exit(1);
+ }
for (i = 0; i < len && i < size; i++)
buf[i] = get_ptr[i];
#endif
if (verbose_listing && verbose > 1)
printf("---\n");
#endif
- setup_get(data);
+ setup_get(data, sizeof(data));
if (sizeof(data) < header_size) {
error("header size (%ld) too large.", header_size);
exit(1);
char *data;
{
size_t header_size;
+ ssize_t remain_size;
ssize_t extend_size;
int checksum;
int name_length;
hdr->header_size = header_size = get_byte();
checksum = get_byte();
- if (fread(data + COMMON_HEADER_SIZE,
- header_size + 2 - COMMON_HEADER_SIZE, 1, fp) == 0) {
+ /* The data variable has been already read as COMMON_HEADER_SIZE bytes.
+ So we must read the remaining header size by the header_size. */
+ remain_size = header_size + 2 - COMMON_HEADER_SIZE;
+ if (remain_size <= 0) {
+ error("Invalid header size (LHarc file ?)");
+ return FALSE;
+ }
+ if (fread(data + COMMON_HEADER_SIZE, remain_size, 1, fp) == 0) {
error("Invalid header (LHarc file ?)");
return FALSE; /* finish */
}
char *data;
{
size_t header_size;
+ ssize_t remain_size;
ssize_t extend_size;
int checksum;
int name_length;
hdr->header_size = header_size = get_byte();
checksum = get_byte();
- if (fread(data + COMMON_HEADER_SIZE,
- header_size + 2 - COMMON_HEADER_SIZE, 1, fp) == 0) {
+ /* The data variable has been already read as COMMON_HEADER_SIZE bytes.
+ So we must read the remaining header size by the header_size. */
+ remain_size = header_size + 2 - COMMON_HEADER_SIZE;
+ if (remain_size <= 0) {
+ error("Invalid header size (LHarc file ?)");
+ return FALSE;
+ }
+ if (fread(data + COMMON_HEADER_SIZE, remain_size, 1, fp) == 0) {
error("Invalid header (LHarc file ?)");
return FALSE; /* finish */
}
char *data;
{
size_t header_size;
+ ssize_t remain_size;
ssize_t extend_size;
int padding;
unsigned int hcrc;
hdr->size_field_length = 2; /* in bytes */
hdr->header_size = header_size = get_word();
+ /* The data variable has been already read as COMMON_HEADER_SIZE bytes.
+ So we must read the remaining header size without ext-header. */
+ remain_size = header_size - I_LEVEL2_HEADER_SIZE;
+ if (remain_size < 0) {
+ error("Invalid header size (LHarc file ?)");
+ return FALSE;
+ }
if (fread(data + COMMON_HEADER_SIZE,
I_LEVEL2_HEADER_SIZE - COMMON_HEADER_SIZE, 1, fp) == 0) {
error("Invalid header (LHarc file ?)");
return FALSE;
padding = header_size - I_LEVEL2_HEADER_SIZE - extend_size;
- while (padding--) /* padding should be 0 or 1 */
+ /* padding should be 0 or 1 */
+ if (padding != 0 && padding != 1) {
+ error("Invalid header size (padding: %d)", padding);
+ return FALSE;
+ }
+ while (padding--)
hcrc = UPDATE_CRC(hcrc, fgetc(fp));
if (hdr->header_crc != hcrc)
char *data;
{
size_t header_size;
+ ssize_t remain_size;
ssize_t extend_size;
int padding;
unsigned int hcrc;
hdr->crc = get_word();
hdr->extend_type = get_byte();
hdr->header_size = header_size = get_longword();
+ remain_size = header_size - I_LEVEL3_HEADER_SIZE;
+ if (remain_size < 0) {
+ error("Invalid header size (LHarc file ?)");
+ return FALSE;
+ }
extend_size = get_longword();
INITIALIZE_CRC(hcrc);
if (extend_size == -1)
return FALSE;
- padding = header_size - I_LEVEL3_HEADER_SIZE - extend_size;
- while (padding--) /* padding should be 0 */
- hcrc = UPDATE_CRC(hcrc, fgetc(fp));
+ padding = remain_size - extend_size;
+ /* padding should be 0 */
+ if (padding != 0) {
+ error("Invalid header size (padding: %d)", padding);
+ return FALSE;
+ }
if (hdr->header_crc != hcrc)
error("header CRC error");
memset(hdr, 0, sizeof(LzHeader));
- setup_get(data);
+ setup_get(data, sizeof(data));
if ((end_mark = getc(fp)) == EOF || end_mark == 0) {
return FALSE; /* finish */
}
/*
- * SJIS <-> EUC ÊÑ´¹´Ø¿ô
- * ¡ÖÆüËܸì¾ðÊó½èÍý¡× ¥½¥Õ¥È¥Ð¥ó¥¯(³ô)
- * ¤è¤êÈ´¿è(by Koji Arai)
+ * SJIS <-> EUC 変換関数
+ * 「日本語情報処理」 ソフトバンク(株)
+ * より抜粋(by Koji Arai)
*/
void
euc2sjis(int *p1, int *p2)