|
@@ -88,14 +88,20 @@ int ssh_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
|
|
inlen -= size;
|
|
inlen -= size;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ vdata = va_arg(args, void*);
|
|
|
|
+ if (vdata == NULL) {
|
|
|
|
+ err = CRYPT_INVALID_ARG;
|
|
|
|
+ goto error;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* Read data */
|
|
/* Read data */
|
|
switch (type) {
|
|
switch (type) {
|
|
case LTC_SSHDATA_BYTE:
|
|
case LTC_SSHDATA_BYTE:
|
|
- cdata = va_arg(args, unsigned char*);
|
|
|
|
|
|
+ cdata = vdata;
|
|
*cdata = *in++;
|
|
*cdata = *in++;
|
|
break;
|
|
break;
|
|
case LTC_SSHDATA_BOOLEAN:
|
|
case LTC_SSHDATA_BOOLEAN:
|
|
- cdata = va_arg(args, unsigned char*);
|
|
|
|
|
|
+ cdata = vdata;
|
|
/*
|
|
/*
|
|
The value 0 represents FALSE, and the value 1 represents TRUE. All non-zero values MUST be
|
|
The value 0 represents FALSE, and the value 1 represents TRUE. All non-zero values MUST be
|
|
interpreted as TRUE; however, applications MUST NOT store values other than 0 and 1.
|
|
interpreted as TRUE; however, applications MUST NOT store values other than 0 and 1.
|
|
@@ -103,18 +109,18 @@ int ssh_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
|
|
*cdata = (*in++)?1:0;
|
|
*cdata = (*in++)?1:0;
|
|
break;
|
|
break;
|
|
case LTC_SSHDATA_UINT32:
|
|
case LTC_SSHDATA_UINT32:
|
|
- u32data = va_arg(args, ulong32*);
|
|
|
|
|
|
+ u32data = vdata;
|
|
LOAD32H(*u32data, in);
|
|
LOAD32H(*u32data, in);
|
|
in += 4;
|
|
in += 4;
|
|
break;
|
|
break;
|
|
case LTC_SSHDATA_UINT64:
|
|
case LTC_SSHDATA_UINT64:
|
|
- u64data = va_arg(args, ulong64*);
|
|
|
|
|
|
+ u64data = vdata;
|
|
LOAD64H(*u64data, in);
|
|
LOAD64H(*u64data, in);
|
|
in += 8;
|
|
in += 8;
|
|
break;
|
|
break;
|
|
case LTC_SSHDATA_STRING:
|
|
case LTC_SSHDATA_STRING:
|
|
case LTC_SSHDATA_NAMELIST:
|
|
case LTC_SSHDATA_NAMELIST:
|
|
- sdata = va_arg(args, char*);
|
|
|
|
|
|
+ sdata = vdata;
|
|
bufsize = va_arg(args, ulong32*);
|
|
bufsize = va_arg(args, ulong32*);
|
|
if (bufsize == NULL) {
|
|
if (bufsize == NULL) {
|
|
err = CRYPT_INVALID_ARG;
|
|
err = CRYPT_INVALID_ARG;
|
|
@@ -132,7 +138,6 @@ int ssh_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
|
|
in += size;
|
|
in += size;
|
|
break;
|
|
break;
|
|
case LTC_SSHDATA_MPINT:
|
|
case LTC_SSHDATA_MPINT:
|
|
- vdata = va_arg(args, void*);
|
|
|
|
if (size == 0) {
|
|
if (size == 0) {
|
|
if ((err = mp_set(vdata, 0)) != CRYPT_OK) { goto error; }
|
|
if ((err = mp_set(vdata, 0)) != CRYPT_OK) { goto error; }
|
|
} else if ((in[0] & 0x80) != 0) {
|
|
} else if ((in[0] & 0x80) != 0) {
|