diff options
author | Peter Shoults <Peter.Shoults@Sun.COM> | 2009-05-22 10:09:37 -0400 |
---|---|---|
committer | Peter Shoults <Peter.Shoults@Sun.COM> | 2009-05-22 10:09:37 -0400 |
commit | 503a2b89eaf04b96af9e457a7806f65ce3e0b723 (patch) | |
tree | 84074541784934c8ef72a0e2709bd6080710e9ee /usr/src/lib/libgss/g_dup_name.c | |
parent | 97ed649eea0490aaae8e85481e0f9c636bda74a5 (diff) | |
download | illumos-gate-503a2b89eaf04b96af9e457a7806f65ce3e0b723.tar.gz |
6510866 libgss(3LIB) input checking needs to be improved
Diffstat (limited to 'usr/src/lib/libgss/g_dup_name.c')
-rw-r--r-- | usr/src/lib/libgss/g_dup_name.c | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/usr/src/lib/libgss/g_dup_name.c b/usr/src/lib/libgss/g_dup_name.c index e60220581b..0ea8ea53aa 100644 --- a/usr/src/lib/libgss/g_dup_name.c +++ b/usr/src/lib/libgss/g_dup_name.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * routine gss_duplicate_name * @@ -39,6 +37,36 @@ #include <string.h> #include <errno.h> +static OM_uint32 +val_dup_name_args( + OM_uint32 *minor_status, + const gss_name_t src_name, + gss_name_t *dest_name) +{ + + /* Initialize outputs. */ + + if (minor_status != NULL) + *minor_status = 0; + + if (dest_name != NULL) + *dest_name = GSS_C_NO_NAME; + + /* Validate arguments. */ + + if (minor_status == NULL) + return (GSS_S_CALL_INACCESSIBLE_WRITE); + + /* if output_name is NULL, simply return */ + if (dest_name == NULL) + return (GSS_S_CALL_INACCESSIBLE_WRITE); + + if (src_name == GSS_C_NO_NAME) + return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME); + + return (GSS_S_COMPLETE); +} + OM_uint32 gss_duplicate_name(minor_status, src_name, @@ -50,20 +78,11 @@ gss_name_t *dest_name; gss_union_name_t src_union, dest_union; OM_uint32 major_status = GSS_S_FAILURE; + major_status = val_dup_name_args(minor_status, src_name, dest_name); + if (major_status != GSS_S_COMPLETE) + return (major_status); - if (!minor_status) - return (GSS_S_CALL_INACCESSIBLE_WRITE); - - *minor_status = 0; - - /* if output_name is NULL, simply return */ - if (dest_name == NULL) - return (GSS_S_CALL_INACCESSIBLE_WRITE | GSS_S_BAD_NAME); - - *dest_name = 0; - - if (src_name == NULL) - return (GSS_S_CALL_INACCESSIBLE_READ); + major_status = GSS_S_FAILURE; src_union = (gss_union_name_t)src_name; |