- Update port description

- Tidy up patches
This commit is contained in:
Alex Kozlov 2016-02-09 22:46:58 +00:00
parent 433e0a25b0
commit 667ae54134
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=408602
10 changed files with 125 additions and 129 deletions

View File

@ -17,9 +17,6 @@ PORTDOCS= unarj.txt technote.txt
OPTIONS_DEFINE= DOCS
post-patch:
${CP} ${FILESDIR}/sanitize.c ${WRKSRC}
do-install:
${INSTALL_PROGRAM} ${WRKSRC}/unarj ${STAGEDIR}${PREFIX}/bin
@${MKDIR} ${STAGEDIR}${DOCSDIR}

View File

@ -1,13 +0,0 @@
--- Makefile.orig Mon Nov 29 16:47:24 2004
+++ Makefile Mon Nov 29 22:46:56 2004
@@ -9,7 +9,9 @@
decode.o: decode.c unarj.h
-OBJS = unarj.o decode.o environ.o
+sanitize.o: sanitize.c unarj.h
+
+OBJS = unarj.o decode.o environ.o sanitize.o
unarj: $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) -o unarj

View File

@ -1,25 +0,0 @@
--- unarj-2.65.orig/unarj.c
+++ unarj.c
@@ -235,6 +235,8 @@ static UCRC crctable[UCHAR_MAX + 1];
/* Functions */
+void copy_path_relative(char *dest, char *src, size_t len);
+
static void
make_crctable()
{
@@ -738,11 +740,11 @@ extract()
no_output = 0;
if (command == 'E')
- strncopy(name, &filename[entry_pos], sizeof(name));
+ copy_path_relative(name, &filename[entry_pos], sizeof(name));
else
{
strcpy(name, DEFAULT_DIR);
- strncopy(name+strlen(name), filename, sizeof(name)-strlen(name));
+ copy_path_relative(name+strlen(name), filename, sizeof(name)-strlen(name));
}
if (host_os != OS)

View File

@ -1,5 +1,5 @@
--- unarj-2.65.orig/unarj.c
+++ unarj.c
- Fix buffer overflow problem in filename handling (CAN-2004-0947)
Index: unarj.c
@@ -217,7 +217,7 @@ static uchar arj_flags;
static short method;
static uint file_mode;

View File

@ -0,0 +1,120 @@
- Fix unchecked path extraction problem (CAN-2004-1027)
Index: unarj.c
@@ -235,6 +235,8 @@ static UCRC crctable[UCHAR_MAX + 1];
/* Functions */
+void copy_path_relative(char *dest, char *src, size_t len);
+
static void
make_crctable()
{
@@ -738,11 +740,11 @@ extract()
no_output = 0;
if (command == 'E')
- strncopy(name, &filename[entry_pos], sizeof(name));
+ copy_path_relative(name, &filename[entry_pos], sizeof(name));
else
{
strcpy(name, DEFAULT_DIR);
- strncopy(name+strlen(name), filename, sizeof(name)-strlen(name));
+ copy_path_relative(name+strlen(name), filename, sizeof(name)-strlen(name));
}
if (host_os != OS)
Index: Makefile
@@ -9,7 +9,9 @@
decode.o: decode.c unarj.h
-OBJS = unarj.o decode.o environ.o
+sanitize.o: sanitize.c unarj.h
+
+OBJS = unarj.o decode.o environ.o sanitize.o
unarj: $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) -o unarj
Index: sanitize.c
@@ -0,0 +1,81 @@
+/*
+ * Path sanitation code by Ludwig Nussel <ludwig.nussel@suse.de>. Public Domain.
+ */
+
+#include "unarj.h"
+
+#include <string.h>
+#include <limits.h>
+#include <stdio.h>
+
+#ifndef PATH_CHAR
+#define PATH_CHAR '/'
+#endif
+#ifndef MIN
+#define MIN(x,y) ((x)<(y)?(x):(y))
+#endif
+
+/* copy src into dest converting the path to a relative one inside the current
+ * directory. dest must hold at least len bytes */
+void copy_path_relative(char *dest, char *src, size_t len)
+{
+ char* o = dest;
+ char* p = src;
+
+ *o = '\0';
+
+ while(*p && *p == PATH_CHAR) ++p;
+ for(; len && *p;)
+ {
+ src = p;
+ p = strchr(src, PATH_CHAR);
+ if(!p) p = src+strlen(src);
+
+ /* . => skip */
+ if(p-src == 1 && *src == '.' )
+ {
+ if(*p) src = ++p;
+ }
+ /* .. => pop one */
+ else if(p-src == 2 && *src == '.' && src[1] == '.')
+ {
+ if(o != dest)
+ {
+ char* tmp;
+ *o = '\0';
+ tmp = strrchr(dest, PATH_CHAR);
+ if(!tmp)
+ {
+ len += o-dest;
+ o = dest;
+ if(*p) ++p;
+ }
+ else
+ {
+ len += o-tmp;
+ o = tmp;
+ if(*p) ++p;
+ }
+ }
+ else /* nothing to pop */
+ if(*p) ++p;
+ }
+ else
+ {
+ size_t copy;
+ if(o != dest)
+ {
+ --len;
+ *o++ = PATH_CHAR;
+ }
+ copy = MIN(p-src,len);
+ memcpy(o, src, copy);
+ len -= copy;
+ src += copy;
+ o += copy;
+ if(*p) ++p;
+ }
+ while(*p && *p == PATH_CHAR) ++p;
+ }
+ o[len?0:-1] = '\0';
+}

View File

@ -1,81 +0,0 @@
/*
* Path sanitation code by Ludwig Nussel <ludwig.nussel@suse.de>. Public Domain.
*/
#include "unarj.h"
#include <string.h>
#include <limits.h>
#include <stdio.h>
#ifndef PATH_CHAR
#define PATH_CHAR '/'
#endif
#ifndef MIN
#define MIN(x,y) ((x)<(y)?(x):(y))
#endif
/* copy src into dest converting the path to a relative one inside the current
* directory. dest must hold at least len bytes */
void copy_path_relative(char *dest, char *src, size_t len)
{
char* o = dest;
char* p = src;
*o = '\0';
while(*p && *p == PATH_CHAR) ++p;
for(; len && *p;)
{
src = p;
p = strchr(src, PATH_CHAR);
if(!p) p = src+strlen(src);
/* . => skip */
if(p-src == 1 && *src == '.' )
{
if(*p) src = ++p;
}
/* .. => pop one */
else if(p-src == 2 && *src == '.' && src[1] == '.')
{
if(o != dest)
{
char* tmp;
*o = '\0';
tmp = strrchr(dest, PATH_CHAR);
if(!tmp)
{
len += o-dest;
o = dest;
if(*p) ++p;
}
else
{
len += o-tmp;
o = tmp;
if(*p) ++p;
}
}
else /* nothing to pop */
if(*p) ++p;
}
else
{
size_t copy;
if(o != dest)
{
--len;
*o++ = PATH_CHAR;
}
copy = MIN(p-src,len);
memcpy(o, src, copy);
len -= copy;
src += copy;
o += copy;
if(*p) ++p;
}
while(*p && *p == PATH_CHAR) ++p;
}
o[len?0:-1] = '\0';
}

View File

@ -1,7 +1,5 @@
This is an extract-only program which allows access to the contents of ARJ
archives. You cannot specify a base directory or select individual files
to extract. UNARJ does not support empty directories or volume labels.
UNARJ is much slower than ARJ because ARJ is highly optimized using
assembly language.
This is an extract-only program which allows access to the contents of ARJ
archives. You cannot specify a base directory or select individual files
to extract. UNARJ does not support empty directories or volume labels.
WWW: http://www.arjsoftware.com/