aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2016-01-01 21:51:15 +0100
committerAris Adamantiadis <aris@0xbadc0de.be>2017-06-08 10:45:54 +0200
commit249f047feff1fbbf64049b99055b1969ff6d0f0e (patch)
tree3a790e301b4b9028569684f9f5e26f905e15fb88
parentc9e7037f0a3ed9d3fb7dbe7796a0636348d5a359 (diff)
downloadlibssh-249f047feff1fbbf64049b99055b1969ff6d0f0e.tar.gz
libssh-249f047feff1fbbf64049b99055b1969ff6d0f0e.tar.xz
libssh-249f047feff1fbbf64049b99055b1969ff6d0f0e.zip
buffer_unpack: support bignums
Conflicts: src/buffer.c
-rw-r--r--src/buffer.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 2da6758a..b0bb3213 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -852,9 +852,11 @@ int ssh_buffer_unpack_va(struct ssh_buffer_struct *buffer,
uint64_t *qword;
ssh_string *string;
char **cstring;
+ bignum *bignum;
void **data;
} o;
size_t len, rlen, max_len;
+ ssh_string tmp_string;
va_list ap_copy;
int count;
@@ -894,6 +896,18 @@ int ssh_buffer_unpack_va(struct ssh_buffer_struct *buffer,
*o.qword = ntohll(*o.qword);
rc = rlen==8 ? SSH_OK : SSH_ERROR;
break;
+ case 'B':
+ o.bignum = va_arg(ap, bignum *);
+ *o.bignum = NULL;
+ tmp_string = ssh_buffer_get_ssh_string(buffer);
+ if (tmp_string == NULL){
+ rc = SSH_ERROR;
+ break;
+ }
+ *o.bignum = ssh_make_string_bn(tmp_string);
+ ssh_string_free(tmp_string);
+ rc = (*o.bignum != NULL)? SSH_OK : SSH_ERROR;
+ break;
case 'S':
o.string = va_arg(ap, ssh_string *);
*o.string = ssh_buffer_get_ssh_string(buffer);
@@ -1039,6 +1053,7 @@ int ssh_buffer_unpack_va(struct ssh_buffer_struct *buffer,
* 's': char ** (C string, pulled as SSH string)
* 'P': size_t, void ** (len of data, pointer to data)
* only pulls data.
+ * 'B': bignum * (pulled as SSH string)
* @returns SSH_OK on success
* SSH_ERROR on error
* @warning when using 'P' with a constant size (e.g. 8), do not