diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-19 09:24:24 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-19 09:24:24 +0000 |
commit | a3c820cf948c25afd36c85a2302ecfdeb82a0cf4 (patch) | |
tree | 2548fd286404922272df09814f72201bfa36273b /libssh/keyfiles.c | |
parent | e6474a34c31101aa0964c395eafeb929f5bf4263 (diff) | |
download | libssh-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.c | 77 |
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 */ |