aboutsummaryrefslogtreecommitdiff
path: root/libssh/keyfiles.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-19 09:24:24 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-19 09:24:24 +0000
commita3c820cf948c25afd36c85a2302ecfdeb82a0cf4 (patch)
tree2548fd286404922272df09814f72201bfa36273b /libssh/keyfiles.c
parente6474a34c31101aa0964c395eafeb929f5bf4263 (diff)
downloadlibssh-a3c820cf948c25afd36c85a2302ecfdeb82a0cf4.tar.gz
libssh-a3c820cf948c25afd36c85a2302ecfdeb82a0cf4.tar.xz
libssh-a3c820cf948c25afd36c85a2302ecfdeb82a0cf4.zip
Add more error checks to read_dsa_privatekey().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@562 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/keyfiles.c')
-rw-r--r--libssh/keyfiles.c77
1 files changed, 48 insertions, 29 deletions
diff --git a/libssh/keyfiles.c b/libssh/keyfiles.c
index 8a7678a6..51b99e8e 100644
--- a/libssh/keyfiles.c
+++ b/libssh/keyfiles.c
@@ -512,43 +512,62 @@ error:
static int read_dsa_privatekey(FILE *fp, gcry_sexp_t *r, ssh_auth_callback cb,
void *userdata, const char *desc) {
- STRING *p;
- STRING *q;
- STRING *g;
- STRING *y;
- STRING *x;
- STRING *v;
- BUFFER *buffer;
-
- if (!(buffer=privatekey_file_to_buffer(fp, TYPE_DSS, cb, userdata, desc)))
+ BUFFER *buffer = NULL;
+ STRING *p = NULL;
+ STRING *q = NULL;
+ STRING *g = NULL;
+ STRING *y = NULL;
+ STRING *x = NULL;
+ STRING *v = NULL;
+ int rc = 1;
+
+ buffer = privatekey_file_to_buffer(fp, TYPE_DSS, cb, userdata, desc);
+ if (buffer == NULL) {
return 0;
- if (!asn1_check_sequence(buffer))
- {
+ }
+
+ if (!asn1_check_sequence(buffer)) {
buffer_free(buffer);
return 0;
}
- v=asn1_get_int(buffer);
- if (ntohl(v->size)!=1 || v->string[0]!=0)
- {
+
+ v = asn1_get_int(buffer);
+ if (ntohl(v->size) != 1 || v->string[0] != 0) {
buffer_free(buffer);
return 0;
}
- p=asn1_get_int(buffer);
- q=asn1_get_int(buffer);
- g=asn1_get_int(buffer);
- y=asn1_get_int(buffer);
- x=asn1_get_int(buffer);
+
+ p = asn1_get_int(buffer);
+ q = asn1_get_int(buffer);
+ g = asn1_get_int(buffer);
+ y = asn1_get_int(buffer);
+ x = asn1_get_int(buffer);
buffer_free(buffer);
- if (!p || !q || !g || !y || !x)
- return 0;
- gcry_sexp_build(r,NULL,"(private-key(dsa(p %b)(q %b)(g %b)(y %b)(x %b)))",ntohl(p->size),p->string,ntohl(q->size),q->string,ntohl(g->size),g->string,ntohl(y->size),y->string,ntohl(x->size),x->string);
- free(p);
- free(q);
- free(g);
- free(y);
- free(x);
- free(v);
- return 1;
+
+ if (p == NULL || q == NULL || g == NULL || y == NULL || x == NULL) {
+ rc = 0;
+ goto error;
+ }
+
+ if (gcry_sexp_build(r, NULL,
+ "(private-key(dsa(p %b)(q %b)(g %b)(y %b)(x %b)))",
+ ntohl(p->size), p->string,
+ ntohl(q->size), q->string,
+ ntohl(g->size), g->string,
+ ntohl(y->size), y->string,
+ ntohl(x->size), x->string)) {
+ rc = 0;
+ }
+
+error:
+ string_free(p);
+ string_free(q);
+ string_free(g);
+ string_free(y);
+ string_free(x);
+ string_free(v);
+
+ return rc;
}
#endif /* HAVE_LIBGCRYPT */