aboutsummaryrefslogtreecommitdiff
path: root/src/lib/krb5/rcache
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2019-12-03 15:32:29 -0500
committerGreg Hudson <ghudson@mit.edu>2019-12-06 10:28:53 -0500
commit81e47875e3de0e52fbb11d61ef30a9406497af73 (patch)
tree98dbcb5982bfbe05a5640870f09c7cc84586440a /src/lib/krb5/rcache
parentab5c4259bdbe51dd3f4b5c5aff22628188d04322 (diff)
downloadkrb5-81e47875e3de0e52fbb11d61ef30a9406497af73.zip
krb5-81e47875e3de0e52fbb11d61ef30a9406497af73.tar.gz
krb5-81e47875e3de0e52fbb11d61ef30a9406497af73.tar.bz2
Improve type safety of serialization code
Remove the serialization table from krb5_context, the functions to find and register serializers, and the polymorphic serialization functions. Instead, directly call per-type serialization functions for the type of object we need to serialize. Remove the krb5_context parameter from most serialization functions as the interfaces are not public and the context is not needed. Remove the ccache, keytab, and rcache serialization handlers as they were not used. In t_ser.c, repeat the externalize-internalize-reexternalize logic for each type, but simplify the code by aborting on failure and removing the verbose flag. The krb5_context and krb5_keyblock sizing functions both reported an extra four bytes. The new test program does not tolerate that inconsistency, so fix them.
Diffstat (limited to 'src/lib/krb5/rcache')
-rw-r--r--src/lib/krb5/rcache/Makefile.in7
-rw-r--r--src/lib/krb5/rcache/deps10
-rw-r--r--src/lib/krb5/rcache/ser_rc.c184
3 files changed, 2 insertions, 199 deletions
diff --git a/src/lib/krb5/rcache/Makefile.in b/src/lib/krb5/rcache/Makefile.in
index c507f44..8874913 100644
--- a/src/lib/krb5/rcache/Makefile.in
+++ b/src/lib/krb5/rcache/Makefile.in
@@ -10,16 +10,14 @@ STLIBOBJS = \
rc_base.o \
rc_dfl.o \
rc_file2.o \
- rc_none.o \
- ser_rc.o
+ rc_none.o
OBJS= \
$(OUTPRE)memrcache.$(OBJEXT) \
$(OUTPRE)rc_base.$(OBJEXT) \
$(OUTPRE)rc_dfl.$(OBJEXT) \
$(OUTPRE)rc_file2.$(OBJEXT) \
- $(OUTPRE)rc_none.$(OBJEXT) \
- $(OUTPRE)ser_rc.$(OBJEXT)
+ $(OUTPRE)rc_none.$(OBJEXT)
SRCS= \
$(srcdir)/memrcache.c \
@@ -27,7 +25,6 @@ SRCS= \
$(srcdir)/rc_dfl.c \
$(srcdir)/rc_file2.c \
$(srcdir)/rc_none.c \
- $(srcdir)/ser_rc.c \
$(srcdir)/t_memrcache.c \
$(srcdir)/t_rcfile2.c
diff --git a/src/lib/krb5/rcache/deps b/src/lib/krb5/rcache/deps
index bf27a81..b764610 100644
--- a/src/lib/krb5/rcache/deps
+++ b/src/lib/krb5/rcache/deps
@@ -55,16 +55,6 @@ rc_none.so rc_none.po $(OUTPRE)rc_none.$(OBJEXT): $(BUILDTOP)/include/autoconf.h
$(top_srcdir)/include/krb5.h $(top_srcdir)/include/krb5/authdata_plugin.h \
$(top_srcdir)/include/krb5/plugin.h $(top_srcdir)/include/port-sockets.h \
$(top_srcdir)/include/socket-utils.h rc-int.h rc_none.c
-ser_rc.so ser_rc.po $(OUTPRE)ser_rc.$(OBJEXT): $(BUILDTOP)/include/autoconf.h \
- $(BUILDTOP)/include/krb5/krb5.h $(BUILDTOP)/include/osconf.h \
- $(BUILDTOP)/include/profile.h $(COM_ERR_DEPS) $(top_srcdir)/include/k5-buf.h \
- $(top_srcdir)/include/k5-err.h $(top_srcdir)/include/k5-gmt_mktime.h \
- $(top_srcdir)/include/k5-int-pkinit.h $(top_srcdir)/include/k5-int.h \
- $(top_srcdir)/include/k5-platform.h $(top_srcdir)/include/k5-plugin.h \
- $(top_srcdir)/include/k5-thread.h $(top_srcdir)/include/k5-trace.h \
- $(top_srcdir)/include/krb5.h $(top_srcdir)/include/krb5/authdata_plugin.h \
- $(top_srcdir)/include/krb5/plugin.h $(top_srcdir)/include/port-sockets.h \
- $(top_srcdir)/include/socket-utils.h rc-int.h ser_rc.c
t_memrcache.so t_memrcache.po $(OUTPRE)t_memrcache.$(OBJEXT): \
$(BUILDTOP)/include/autoconf.h $(BUILDTOP)/include/krb5/krb5.h \
$(BUILDTOP)/include/osconf.h $(BUILDTOP)/include/profile.h \
diff --git a/src/lib/krb5/rcache/ser_rc.c b/src/lib/krb5/rcache/ser_rc.c
deleted file mode 100644
index ee6644c..0000000
--- a/src/lib/krb5/rcache/ser_rc.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
-/* lib/krb5/rcache/ser_rc.c - Serialize replay cache context */
-/*
- * Copyright 1995 by the Massachusetts Institute of Technology.
- * All Rights Reserved.
- *
- * Export of this software from the United States of America may
- * require a specific license from the United States Government.
- * It is the responsibility of any person or organization contemplating
- * export to obtain such a license before exporting.
- *
- * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
- * distribute this software and its documentation for any purpose and
- * without fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright notice and
- * this permission notice appear in supporting documentation, and that
- * the name of M.I.T. not be used in advertising or publicity pertaining
- * to distribution of the software without specific, written prior
- * permission. Furthermore if you modify this software you must label
- * your software as modified software and not distribute it in such a
- * fashion that it might be confused with the original M.I.T. software.
- * M.I.T. makes no representations about the suitability of
- * this software for any purpose. It is provided "as is" without express
- * or implied warranty.
- */
-
-#include "k5-int.h"
-#include "rc-int.h"
-
-/*
- * Routines to deal with externalizing krb5_rcache.
- * krb5_rcache_size();
- * krb5_rcache_externalize();
- * krb5_rcache_internalize();
- */
-static krb5_error_code
-krb5_rcache_size(krb5_context, krb5_pointer, size_t *);
-
-static krb5_error_code
-krb5_rcache_externalize(krb5_context, krb5_pointer, krb5_octet **, size_t *);
-
-static krb5_error_code
-krb5_rcache_internalize(krb5_context,krb5_pointer *, krb5_octet **, size_t *);
-
-/*
- * Serialization entry for this type.
- */
-static const krb5_ser_entry krb5_rcache_ser_entry = {
- KV5M_RCACHE, /* Type */
- krb5_rcache_size, /* Sizer routine */
- krb5_rcache_externalize, /* Externalize routine */
- krb5_rcache_internalize /* Internalize routine */
-};
-
-/*
- * krb5_rcache_size() - Determine the size required to externalize
- * this krb5_rcache variant.
- */
-static krb5_error_code
-krb5_rcache_size(krb5_context kcontext, krb5_pointer arg, size_t *sizep)
-{
- krb5_error_code kret;
- krb5_rcache rcache;
-
- kret = EINVAL;
- if ((rcache = (krb5_rcache) arg)) {
- /*
- * Saving krb5_rcache requires at minimum:
- * krb5_int32 for KV5M_RCACHE
- * krb5_int32 for length of rcache name.
- * krb5_int32 for KV5M_RCACHE
- */
- *sizep += sizeof(krb5_int32) * 3 + strlen(rcache->name);
- kret = 0;
- }
- return(kret);
-}
-
-/*
- * krb5_rcache_externalize() - Externalize the krb5_rcache.
- */
-static krb5_error_code
-krb5_rcache_externalize(krb5_context kcontext, krb5_pointer arg, krb5_octet **buffer, size_t *lenremain)
-{
- krb5_error_code kret;
- krb5_rcache rcache;
- size_t required;
- krb5_octet *bp;
- size_t remain;
-
- required = 0;
- bp = *buffer;
- remain = *lenremain;
- kret = EINVAL;
- if ((rcache = (krb5_rcache) arg)) {
- kret = ENOMEM;
- if (!krb5_rcache_size(kcontext, arg, &required) &&
- (required <= remain)) {
- /* Put the header identifier. */
- (void)krb5_ser_pack_int32(KV5M_RCACHE, &bp, &remain);
-
- /* Put the replay cache name after its length. */
- (void)krb5_ser_pack_int32(strlen(rcache->name), &bp, &remain);
- (void)krb5_ser_pack_bytes((uint8_t *)rcache->name,
- strlen(rcache->name), &bp, &remain);
-
- /* Put the trailer. */
- (void)krb5_ser_pack_int32(KV5M_RCACHE, &bp, &remain);
-
- kret = 0;
- *buffer = bp;
- *lenremain = remain;
- }
- }
- return(kret);
-}
-
-/*
- * krb5_rcache_internalize() - Internalize the krb5_rcache.
- */
-static krb5_error_code
-krb5_rcache_internalize(krb5_context kcontext, krb5_pointer *argp, krb5_octet **buffer, size_t *lenremain)
-{
- krb5_error_code kret;
- krb5_rcache rcache = NULL;
- krb5_int32 ibuf;
- krb5_octet *bp;
- size_t remain;
- char *rcname = NULL;
-
- bp = *buffer;
- remain = *lenremain;
-
- /* Read our magic number */
- if (krb5_ser_unpack_int32(&ibuf, &bp, &remain) || ibuf != KV5M_RCACHE)
- return EINVAL;
-
- /* Get the length of the rcache name */
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- if (kret)
- return kret;
-
- /* Get the rcache name. */
- rcname = malloc(ibuf + 1);
- if (!rcname)
- return ENOMEM;
- kret = krb5_ser_unpack_bytes((krb5_octet*)rcname, (size_t) ibuf,
- &bp, &remain);
- if (kret)
- goto cleanup;
- rcname[ibuf] = '\0';
-
- /* Resolve and recover the rcache. */
- kret = k5_rc_resolve(kcontext, rcname, &rcache);
- if (kret)
- goto cleanup;
-
- /* Read our magic number again. */
- kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
- if (kret)
- goto cleanup;
- if (ibuf != KV5M_RCACHE) {
- kret = EINVAL;
- goto cleanup;
- }
-
- *buffer = bp;
- *lenremain = remain;
- *argp = (krb5_pointer) rcache;
-cleanup:
- free(rcname);
- if (kret != 0 && rcache)
- k5_rc_close(kcontext, rcache);
- return kret;
-}
-
-/*
- * Register the rcache serializer.
- */
-krb5_error_code KRB5_CALLCONV
-krb5_ser_rcache_init(krb5_context kcontext)
-{
- return(krb5_register_serializer(kcontext, &krb5_rcache_ser_entry));
-}