diff --git a/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java b/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java index b556c90524c6a445cd606b509fbc9da89ca495fa..c1372ff35f43a4fecef3522171c24788a1996507 100644 --- a/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java +++ b/src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java @@ -78,7 +78,7 @@ public class KeyTab implements KeyTabConstants { private final String tabName; private long lastModified; - private int kt_vno; + private int kt_vno = KRB5_KT_VNO; private Vector entries = new Vector<>(); diff --git a/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java b/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java index 51c2c3dbc325572b9e2ad14c3f87c4353b76f3c8..eeeb848e6e55c918f088d11b26451cd16fb1c6cd 100644 --- a/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java +++ b/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java @@ -80,42 +80,24 @@ public class Ktab { } else { ktab.processArgs(args); } - try { + ktab.table = KeyTab.getInstance(ktab.name); + if (ktab.table.isMissing() && ktab.action != 'a') { if (ktab.name == null) { - // ktab.admin = new KeyTabAdmin(); // use the default keytab. - ktab.table = KeyTab.getInstance(); - if (ktab.table == null) { - if (ktab.action == 'a') { - ktab.table = KeyTab.create(); - } else { - System.out.println("No default key table exists."); - System.exit(-1); - } - } + System.out.println("No default key table exists."); } else { - if ((ktab.action != 'a') && - !(new File(ktab.name)).exists()) { - System.out.println("Key table " + - ktab.name + " does not exist."); - System.exit(-1); - } else { - ktab.table = KeyTab.getInstance(ktab.name); - } - if (ktab.table == null) { - if (ktab.action == 'a') { - ktab.table = KeyTab.create(ktab.name); - } else { - System.out.println("The format of key table " + - ktab.name + " is incorrect."); - System.exit(-1); - } - } + System.out.println("Key table " + + ktab.name + " does not exist."); } - } catch (RealmException e) { - System.err.println("Error loading key table."); System.exit(-1); - } catch (IOException e) { - System.err.println("Error loading key table."); + } + if (!ktab.table.isValid()) { + if (ktab.name == null) { + System.out.println("The format of the default key table " + + " is incorrect."); + } else { + System.out.println("The format of key table " + + ktab.name + " is incorrect."); + } System.exit(-1); } switch (ktab.action) { diff --git a/test/sun/security/krb5/tools/KtabZero.java b/test/sun/security/krb5/tools/KtabZero.java new file mode 100644 index 0000000000000000000000000000000000000000..8a4a6a4fcd29d65b56226900d1426b64ea50d58d --- /dev/null +++ b/test/sun/security/krb5/tools/KtabZero.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import sun.security.krb5.internal.ktab.KeyTab; +import sun.security.krb5.internal.ktab.KeyTabConstants; + +import java.io.File; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.nio.file.Paths; + +/* + * @test + * @bug 8014196 + * @summary ktab creates a file with zero kt_vno + */ +public class KtabZero { + + static final String NAME = "k.tab"; + + public static void main(String[] args) throws Exception { + + // 0. Non-existing keytab + Files.deleteIfExists(Paths.get(NAME)); + check(true); + + // 1. Create with KeyTab + Files.deleteIfExists(Paths.get(NAME)); + KeyTab.getInstance(NAME).save(); + check(false); + + // 2. Create with the tool + Files.deleteIfExists(Paths.get(NAME)); + try { + Class ktab = Class.forName("sun.security.krb5.internal.tools.Ktab"); + ktab.getDeclaredMethod("main", String[].class).invoke(null, + (Object)(("-k " + NAME + " -a me@HERE pass").split(" "))); + } catch (ClassNotFoundException cnfe) { + // Only Windows has ktab tool + System.out.println("No ktab tool here. Ignored."); + return; + } + check(false); + } + + // Checks existence as well as kt-vno + static void check(boolean showBeMissing) throws Exception { + KeyTab kt = KeyTab.getInstance(NAME); + if (kt.isMissing() != showBeMissing) { + throw new Exception("isMissing is not " + showBeMissing); + } + Field f = KeyTab.class.getDeclaredField("kt_vno"); + f.setAccessible(true); + if (f.getInt(kt) != KeyTabConstants.KRB5_KT_VNO) { + throw new Exception("kt_vno is " + f.getInt(kt)); + } + } +} diff --git a/test/sun/security/krb5/tools/ktzero.sh b/test/sun/security/krb5/tools/ktzero.sh new file mode 100644 index 0000000000000000000000000000000000000000..fd5c488d4eab726ab203ff908e46801666a37946 --- /dev/null +++ b/test/sun/security/krb5/tools/ktzero.sh @@ -0,0 +1,74 @@ +# +# Copyright (c) 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8014196 +# @summary ktab creates a file with zero kt_vno +# @run shell ktzero.sh +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +if [ "${TESTSRC}" = "" ] ; then + TESTSRC="." +fi + +OS=`uname -s` +case "$OS" in + CYGWIN* ) + FS="/" + ;; + Windows_* ) + FS="\\" + ;; + * ) + FS="/" + echo "Unsupported system!" + exit 0; + ;; +esac + +KEYTAB=ktzero.tmp + +rm $KEYTAB 2> /dev/null +KTAB="${TESTJAVA}${FS}bin${FS}ktab -k $KEYTAB" + +# Listing non-existing ktab should fail +$KTAB -l && exit 1 + +# Can add to non-existing ktab +$KTAB -a me@LOCAL mine || exit 2 + +# Now can be listed +$KTAB -l || exit 3 + +echo ABCDEFG > $KEYTAB + +# Invalid keytab should fail for all commands +$KTAB -l && exit 4 +$KTAB -a me@LOCAL mine && exit 2 + +exit 0