Merge commit 'micah/master'
[monkeysphere.git] / gnutls-helpers.c
index ce77d0cbdd4ad9ad81093a3e2b3e946c32457a26..5a567e2940ef9376f35a535382f31107e0b0e640 100644 (file)
@@ -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 */