summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-06-16 08:02:13 +0200
committerLuc Verhaegen <libv@skynet.be>2009-06-16 08:02:13 +0200
commit2e42406f9256273d78b5a2c8f71e9d0b5b8c648b (patch)
treea1cefacf84ac60a38c3adc826ecad649cdb9b12b
parentb8941803e73d29dd942ee6b67e984fa459383731 (diff)
Allocate output filename.
-rw-r--r--lh5_extract.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/lh5_extract.c b/lh5_extract.c
index 7ba714c..ba1e2b2 100644
--- a/lh5_extract.c
+++ b/lh5_extract.c
@@ -27,6 +27,8 @@
* the work at http://sourceforge.jp/projects/lha/.
*/
+#define _GNU_SOURCE 1
+
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
@@ -37,8 +39,6 @@
#include <sys/mman.h>
#include <sys/stat.h>
-#define FILENAME_LENGTH 1024
-
/*
*
* LHA header parsing.
@@ -87,9 +87,9 @@ calc_sum(unsigned char *p, int len)
*
*/
static unsigned int
-lha_header_level1_parse(unsigned char *Buffer, int BufferSize,
- unsigned int *original_size, unsigned int *packed_size,
- char *filename, unsigned short *crc)
+LH5HeaderParse(unsigned char *Buffer, int BufferSize,
+ unsigned int *original_size, unsigned int *packed_size,
+ char **name, unsigned short *crc)
{
unsigned int offset;
unsigned char header_size, checksum, name_length;
@@ -137,8 +137,7 @@ lha_header_level1_parse(unsigned char *Buffer, int BufferSize,
*original_size = *(unsigned int *) (Buffer + 11);
name_length = Buffer[21];
- memcpy(filename, Buffer + 22, name_length);
- filename[name_length] = '\0';
+ *name = strndup((char *) Buffer + 22, name_length);
*crc = *(unsigned short *) (Buffer + 22 + name_length);
@@ -561,7 +560,7 @@ LH5Decode(unsigned char *PackedBuffer, int PackedBufferSize,
int
main(int argc, char *argv[])
{
- char filename[FILENAME_LENGTH];
+ char *filename;
unsigned short header_crc;
unsigned int header_size, original_size, packed_size;
int infd, outfd;
@@ -595,10 +594,8 @@ main(int argc, char *argv[])
return 1;
}
- header_size = lha_header_level1_parse(LHABuffer, LHABufferSize,
- &original_size, &packed_size,
- filename, &header_crc);
-
+ header_size = LH5HeaderParse(LHABuffer, LHABufferSize, &original_size,
+ &packed_size, &filename, &header_crc);
if (!header_size)
return 1;
@@ -650,6 +647,8 @@ main(int argc, char *argv[])
fprintf(stderr, "Warning: Failed to close \"%s\": %s\n",
filename, strerror(errno));
+ free(filename);
+
/* get rid of our input file */
if (munmap(LHABuffer, LHABufferSize))
fprintf(stderr, "Warning: Failed to munmap \"%s\": %s\n",