In krb5_cc_move if something went wrong, free the dst credential cache
authorZhanna Tsitkov <tsitkova@mit.edu>
Tue, 29 Mar 2011 18:52:22 +0000 (18:52 +0000)
committerZhanna Tsitkov <tsitkova@mit.edu>
Tue, 29 Mar 2011 18:52:22 +0000 (18:52 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@24754 dc483132-0cff-0310-8789-dd5450dbe970

src/include/krb5/krb5.hin
src/lib/krb5/ccache/ccbase.c

index 0e7fd3fe5d13fa542d4770a85943b74010255f10..c28e8571e50fd4ee7cff2ce8d2d24faca25c956c 100644 (file)
@@ -2284,7 +2284,7 @@ krb5_cc_get_type(krb5_context context, krb5_ccache cache);
  * @retval
  * 0 Sucess; @a src is freed.
  * @return
- * Kerberos error codes; @a src and @a dst are both still allocated.
+ * Kerberos error codes; @a src is still allocated, while @a dst is freed.
  */
 krb5_error_code KRB5_CALLCONV
 krb5_cc_move(krb5_context context, krb5_ccache src, krb5_ccache dst);
index 6a113346a15b50220c36480880e0d2f783f1e8b3..69bb8b876bb2e5b0ec3d3a57ece19f8ad66da8cc 100644 (file)
@@ -386,9 +386,13 @@ krb5_cc_move(krb5_context context, krb5_ccache src, krb5_ccache dst)
     if (!ret) {
         ret = krb5_cc_initialize(context, dst, princ);
     }
-    if (!ret) {
-        ret = krb5_cc_lock(context, dst);
+    if (ret) {
+        krb5_cc_unlock(context, src);
+        krb5_cccol_unlock(context);
+        return ret;
     }
+
+    ret = krb5_cc_lock(context, dst);
     if (!ret) {
         ret = krb5_cc_copy_creds(context, src, dst);
         krb5_cc_unlock(context, dst);
@@ -397,6 +401,8 @@ krb5_cc_move(krb5_context context, krb5_ccache src, krb5_ccache dst)
     krb5_cc_unlock(context, src);
     if (!ret) {
         ret = krb5_cc_destroy(context, src);
+    } else {
+        ret = krb5_cc_destroy(context, dst);
     }
     krb5_cccol_unlock(context);
     if (princ) {