Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
726b88f9
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
726b88f9
编写于
5月 06, 2010
作者:
W
weijun
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6948909: Jarsigner removes MANIFEST.MF info for badly packages jar's
Reviewed-by: mullan, xuelei
上级
8f7dad76
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
177 addition
and
45 deletion
+177
-45
src/share/classes/sun/security/tools/JarSigner.java
src/share/classes/sun/security/tools/JarSigner.java
+64
-45
test/sun/security/tools/jarsigner/diffend.sh
test/sun/security/tools/jarsigner/diffend.sh
+113
-0
未找到文件。
src/share/classes/sun/security/tools/JarSigner.java
浏览文件 @
726b88f9
/*
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -1123,6 +1123,8 @@ public class JarSigner {
BASE64Encoder
encoder
=
new
JarBASE64Encoder
();
Vector
<
ZipEntry
>
mfFiles
=
new
Vector
<
ZipEntry
>();
boolean
wasSigned
=
false
;
for
(
Enumeration
<?
extends
ZipEntry
>
enum_
=
zipFile
.
entries
();
enum_
.
hasMoreElements
();)
{
ZipEntry
ze
=
enum_
.
nextElement
();
...
...
@@ -1132,6 +1134,11 @@ public class JarSigner {
// out first
mfFiles
.
addElement
(
ze
);
if
(
SignatureFileVerifier
.
isBlockOrSF
(
ze
.
getName
().
toUpperCase
(
Locale
.
ENGLISH
)))
{
wasSigned
=
true
;
}
if
(
signatureRelated
(
ze
.
getName
()))
{
// ignore signature-related and manifest files
continue
;
...
...
@@ -1159,37 +1166,41 @@ public class JarSigner {
if
(
mfModified
)
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
manifest
.
write
(
baos
);
byte
[]
newBytes
=
baos
.
toByteArray
();
if
(
mfRawBytes
!=
null
&&
oldAttr
.
equals
(
manifest
.
getMainAttributes
()))
{
/*
* Note:
*
* The Attributes object is based on HashMap and can handle
* continuation columns. Therefore, even if the contents are
* not changed (in a Map view), the bytes that it write()
* may be different from the original bytes that it read()
* from. Since the signature on the main attributes is based
* on raw bytes, we must retain the exact bytes.
*/
int
newPos
=
findHeaderEnd
(
newBytes
);
int
oldPos
=
findHeaderEnd
(
mfRawBytes
);
if
(
newPos
==
oldPos
)
{
System
.
arraycopy
(
mfRawBytes
,
0
,
newBytes
,
0
,
oldPos
);
}
else
{
// cat oldHead newTail > newBytes
byte
[]
lastBytes
=
new
byte
[
oldPos
+
newBytes
.
length
-
newPos
];
System
.
arraycopy
(
mfRawBytes
,
0
,
lastBytes
,
0
,
oldPos
);
System
.
arraycopy
(
newBytes
,
newPos
,
lastBytes
,
oldPos
,
newBytes
.
length
-
newPos
);
newBytes
=
lastBytes
;
if
(
wasSigned
)
{
byte
[]
newBytes
=
baos
.
toByteArray
();
if
(
mfRawBytes
!=
null
&&
oldAttr
.
equals
(
manifest
.
getMainAttributes
()))
{
/*
* Note:
*
* The Attributes object is based on HashMap and can handle
* continuation columns. Therefore, even if the contents are
* not changed (in a Map view), the bytes that it write()
* may be different from the original bytes that it read()
* from. Since the signature on the main attributes is based
* on raw bytes, we must retain the exact bytes.
*/
int
newPos
=
findHeaderEnd
(
newBytes
);
int
oldPos
=
findHeaderEnd
(
mfRawBytes
);
if
(
newPos
==
oldPos
)
{
System
.
arraycopy
(
mfRawBytes
,
0
,
newBytes
,
0
,
oldPos
);
}
else
{
// cat oldHead newTail > newBytes
byte
[]
lastBytes
=
new
byte
[
oldPos
+
newBytes
.
length
-
newPos
];
System
.
arraycopy
(
mfRawBytes
,
0
,
lastBytes
,
0
,
oldPos
);
System
.
arraycopy
(
newBytes
,
newPos
,
lastBytes
,
oldPos
,
newBytes
.
length
-
newPos
);
newBytes
=
lastBytes
;
}
}
mfRawBytes
=
newBytes
;
}
else
{
mfRawBytes
=
baos
.
toByteArray
();
}
mfRawBytes
=
newBytes
;
}
// Write out the manifest
...
...
@@ -1411,23 +1422,31 @@ public class JarSigner {
}
/**
* Find the position of an empty line inside bs
* Find the length of header inside bs. The header is a multiple (>=0)
* lines of attributes plus an empty line. The empty line is included
* in the header.
*/
private
int
findHeaderEnd
(
byte
[]
bs
)
{
// An empty line can be at the beginning...
if
(
bs
.
length
>
1
&&
bs
[
0
]
==
'\r'
&&
bs
[
1
]
==
'\n'
)
{
return
0
;
}
// ... or after another line
for
(
int
i
=
0
;
i
<
bs
.
length
-
3
;
i
++)
{
if
(
bs
[
i
]
==
'\r'
&&
bs
[
i
+
1
]
==
'\n'
&&
bs
[
i
+
2
]
==
'\r'
&&
bs
[
i
+
3
]
==
'\n'
)
{
return
i
;
}
}
// If header end is not found, return 0,
// which means no behavior change.
return
0
;
// Initial state true to deal with empty header
boolean
newline
=
true
;
// just met a newline
int
len
=
bs
.
length
;
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
switch
(
bs
[
i
])
{
case
'\r'
:
if
(
i
<
len
&&
bs
[
i
+
1
]
==
'\n'
)
i
++;
// fallthrough
case
'\n'
:
if
(
newline
)
return
i
+
1
;
//+1 to get length
newline
=
true
;
break
;
default
:
newline
=
false
;
}
}
// If header end is not found, it means the MANIFEST.MF has only
// the main attributes section and it does not end with 2 newlines.
// Returns the whole length so that it can be completely replaced.
return
len
;
}
/**
...
...
test/sun/security/tools/jarsigner/diffend.sh
0 → 100644
浏览文件 @
726b88f9
#
# Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
# @test
# @bug 6948909
# @summary Jarsigner removes MANIFEST.MF info for badly packages jar's
#
if
[
"
${
TESTSRC
}
"
=
""
]
;
then
TESTSRC
=
"."
fi
if
[
"
${
TESTCLASSES
}
"
=
""
]
;
then
TESTCLASSES
=
"."
fi
if
[
"
${
TESTJAVA
}
"
=
""
]
;
then
echo
"TESTJAVA not set. Test cannot execute."
echo
"FAILED!!!"
exit
1
fi
# set platform-dependent variables
OS
=
`
uname
-s
`
case
"
$OS
"
in
SunOS
|
Linux
)
NULL
=
/dev/null
PS
=
":"
FS
=
"/"
CP
=
"
${
FS
}
bin
${
FS
}
cp -f"
TMP
=
/tmp
;;
CYGWIN
*
)
NULL
=
/dev/null
PS
=
";"
FS
=
"/"
CP
=
"cp -f"
TMP
=
/tmp
;;
Windows_
*
)
NULL
=
NUL
PS
=
";"
FS
=
"
\\
"
CP
=
"cp -f"
TMP
=
"c:/temp"
;;
*
)
echo
"Unrecognized operating system!"
exit
1
;
;;
esac
echo
1
>
1
mkdir
META-INF
# Create a fake .RSA file so that jarsigner believes it's signed
touch
META-INF/x.RSA
# A MANIFEST.MF using \n as newlines and no double newlines at the end
cat
>
META-INF/MANIFEST.MF
<<
EOF
Manifest-Version: 1.0
Created-By: 1.7.0-internal (Sun Microsystems Inc.)
Today: Monday
EOF
# With the fake .RSA file, to trigger the if (wasSigned) block
rm
diffend.jar
zip diffend.jar META-INF/MANIFEST.MF META-INF/x.RSA 1
${
TESTJAVA
}${
FS
}
bin
${
FS
}
jarsigner
\
-keystore
${
TESTSRC
}${
FS
}
JarSigning.keystore
\
-storepass
bbbbbb
\
-digestalg
SHA1
\
-signedjar
diffend.new.jar
\
diffend.jar c
unzip
-p
diffend.new.jar META-INF/MANIFEST.MF |
grep
Today
||
exit
1
# Without the fake .RSA file, to trigger the else block
rm
diffend.jar
zip diffend.jar META-INF/MANIFEST.MF 1
${
TESTJAVA
}${
FS
}
bin
${
FS
}
jarsigner
\
-keystore
${
TESTSRC
}${
FS
}
JarSigning.keystore
\
-storepass
bbbbbb
\
-digestalg
SHA1
\
-signedjar
diffend.new.jar
\
diffend.jar c
unzip
-p
diffend.new.jar META-INF/MANIFEST.MF |
grep
Today
||
exit
2
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录