X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=gnutls-helpers.c;h=5a567e2940ef9376f35a535382f31107e0b0e640;hb=fd25d7c2bbbf6e36ee1d2a3ebd9b804e2d64bab3;hp=ce77d0cbdd4ad9ad81093a3e2b3e946c32457a26;hpb=76c17804015ffb6c18232cd9ba80cf2a641fd59e;p=monkeysphere.git diff --git a/gnutls-helpers.c b/gnutls-helpers.c index ce77d0c..5a567e2 100644 --- a/gnutls-helpers.c +++ b/gnutls-helpers.c @@ -20,6 +20,7 @@ void err(const char* fmt, ...) { va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); + fflush(stderr); } void logfunc(int level, const char* string) { @@ -210,11 +211,29 @@ int write_datum_fd(int fd, const gnutls_datum_t* d) { int write_datum_fd_with_length(int fd, const gnutls_datum_t* d) { - uint32_t len = htonl(d->size); + uint32_t len; + int looks_negative = (d->data[0] & 0x80); + unsigned char zero = 0; + + /* if the first bit is 1, then the datum will appear negative in the + MPI encoding style used by OpenSSH. In that case, we'll increase + the length by one, and dump out one more byte */ + + if (looks_negative) { + len = htonl(d->size + 1); + } else { + len = htonl(d->size); + } if (write(fd, &len, sizeof(len)) != sizeof(len)) { err("failed to write size of datum.\n"); return -2; } + if (looks_negative) { + if (write(fd, &zero, 1) != 1) { + err("failed to write padding byte for MPI.\n"); + return -2; + } + } return write_datum_fd(fd, d); } @@ -268,6 +287,10 @@ int create_writing_pipe(pid_t* pid, const char* path, char* const argv[]) { } execv(path, argv); err("exec %s failed (error: %d \"%s\")\n", path, errno, strerror(errno)); + /* close the open file descriptors */ + close(p[0]); + close(0); + exit(1); } else { /* this is the parent */ close(p[0]); /* close unused read end */