- Update port description
- Tidy up patches
This commit is contained in:
parent
433e0a25b0
commit
667ae54134
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=408602
@ -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}
|
||||
|
@ -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
|
@ -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)
|
@ -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;
|
120
archivers/unarj/files/patch-CVE-2004-1027
Normal file
120
archivers/unarj/files/patch-CVE-2004-1027
Normal 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';
|
||||
+}
|
@ -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';
|
||||
}
|
@ -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/
|
||||
|
Loading…
Reference in New Issue
Block a user