@@ -9,6 +9,7 @@ AC_PREREQ(2.59)
AC_PREFIX_DEFAULT(/usr)
AM_MAINTAINER_MODE
AC_USE_SYSTEM_EXTENSIONS
+AC_PROG_RANLIB
dnl *************************************************************
dnl * Define the set of applicable options
@@ -149,13 +149,19 @@ do_downcall(int k5_fd, uid_t uid, struct authgss_private_data *pd,
char *buf = NULL, *p = NULL, *end = NULL;
unsigned int timeout = context_timeout;
unsigned int buf_size = 0;
+ bool use_gss_vers = true;
- printerr(2, "doing downcall: lifetime_rec=%u acceptor=%.*s\n",
- lifetime_rec, acceptor->length, acceptor->value);
+retry:
+ printerr(2, "doing downcall: lifetime_rec=%u acceptor=%.*s"
+ "gss vers %d\n", lifetime_rec, acceptor->length,
+ acceptor->value, use_gss_vers ? pd->pd_gss_vers : 1);
buf_size = sizeof(uid) + sizeof(timeout) + sizeof(pd->pd_seq_win) +
sizeof(pd->pd_ctx_hndl.length) + pd->pd_ctx_hndl.length +
sizeof(context_token->length) + context_token->length +
sizeof(acceptor->length) + acceptor->length;
+ if (use_gss_vers)
+ buf_size += sizeof(pd->pd_gss_vers);
+
p = buf = malloc(buf_size);
if (!buf)
goto out_err;
@@ -171,6 +177,8 @@ do_downcall(int k5_fd, uid_t uid, struct authgss_private_data *pd,
if (write_buffer(&p, end, &pd->pd_ctx_hndl)) goto out_err;
if (write_buffer(&p, end, context_token)) goto out_err;
if (write_buffer(&p, end, acceptor)) goto out_err;
+ if (use_gss_vers)
+ if (WRITE_BYTES(&p, end, pd->pd_gss_vers)) goto out_err;
if (write(k5_fd, buf, p - buf) < p - buf) goto out_err;
free(buf);
@@ -178,6 +186,11 @@ do_downcall(int k5_fd, uid_t uid, struct authgss_private_data *pd,
out_err:
free(buf);
printerr(1, "Failed to write downcall!\n");
+ if (use_gss_vers) {
+ printerr(1, "Retry downcall without gss_vers\n");
+ use_gss_vers = false;
+ goto retry;
+ }
return;
}