pki: Replace BUILD_FROM_FD with passing a chunk via BUILD_BLOB
This allows more than one builder to try parsing the data read from STDIN.
This commit is contained in:
@@ -454,47 +454,12 @@ static void *load_from_file(char *file, credential_type_t type, int subtype,
|
||||
return cred;
|
||||
}
|
||||
|
||||
/**
|
||||
* load the credential from a file descriptor
|
||||
*/
|
||||
static void *load_from_fd(int fd, credential_type_t type, int subtype,
|
||||
identification_t *subject, x509_flag_t flags)
|
||||
{
|
||||
char buf[8096];
|
||||
char *pos = buf;
|
||||
ssize_t len, total = 0;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
len = read(fd, pos, buf + sizeof(buf) - pos);
|
||||
if (len < 0)
|
||||
{
|
||||
DBG1(DBG_LIB, "reading from file descriptor failed: %s",
|
||||
strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
if (len == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
total += len;
|
||||
if (total == sizeof(buf))
|
||||
{
|
||||
DBG1(DBG_LIB, "buffer too small to read from file descriptor");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return load_from_blob(chunk_create(buf, total), type, subtype,
|
||||
subject, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load all kind of PEM encoded credentials.
|
||||
*/
|
||||
static void *pem_load(credential_type_t type, int subtype, va_list args)
|
||||
{
|
||||
char *file = NULL;
|
||||
int fd = -1;
|
||||
chunk_t pem = chunk_empty;
|
||||
identification_t *subject = NULL;
|
||||
int flags = 0;
|
||||
@@ -506,9 +471,7 @@ static void *pem_load(credential_type_t type, int subtype, va_list args)
|
||||
case BUILD_FROM_FILE:
|
||||
file = va_arg(args, char*);
|
||||
continue;
|
||||
case BUILD_FROM_FD:
|
||||
fd = va_arg(args, int);
|
||||
continue;
|
||||
case BUILD_BLOB:
|
||||
case BUILD_BLOB_PEM:
|
||||
pem = va_arg(args, chunk_t);
|
||||
continue;
|
||||
@@ -534,10 +497,6 @@ static void *pem_load(credential_type_t type, int subtype, va_list args)
|
||||
{
|
||||
return load_from_file(file, type, subtype, subject, flags);
|
||||
}
|
||||
if (fd != -1)
|
||||
{
|
||||
return load_from_fd(fd, type, subtype, subject, flags);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -162,22 +162,15 @@ static sshkey_public_key_t *load_from_stream(FILE *file)
|
||||
}
|
||||
|
||||
/**
|
||||
* Load SSH key from FD
|
||||
* Load SSH key from a blob of data (most likely the content of a file)
|
||||
*/
|
||||
static sshkey_public_key_t *load_from_fd(int fd)
|
||||
static sshkey_public_key_t *load_from_blob(chunk_t blob)
|
||||
{
|
||||
FILE *stream;
|
||||
|
||||
/* dup the FD as it gets closed in fclose() */
|
||||
fd = dup(fd);
|
||||
if (fd == -1)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
stream = fdopen(fd, "r");
|
||||
stream = fmemopen(blob.ptr, blob.len, "r");
|
||||
if (!stream)
|
||||
{
|
||||
close(fd);
|
||||
return NULL;
|
||||
}
|
||||
return load_from_stream(stream);
|
||||
@@ -204,22 +197,21 @@ static sshkey_public_key_t *load_from_file(char *file)
|
||||
*/
|
||||
sshkey_public_key_t *sshkey_public_key_load(key_type_t type, va_list args)
|
||||
{
|
||||
chunk_t blob = chunk_empty;
|
||||
chunk_t sshkey = chunk_empty, blob = chunk_empty;
|
||||
char *file = NULL;
|
||||
int fd = -1;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
switch (va_arg(args, builder_part_t))
|
||||
{
|
||||
case BUILD_BLOB_SSHKEY:
|
||||
blob = va_arg(args, chunk_t);
|
||||
sshkey = va_arg(args, chunk_t);
|
||||
continue;
|
||||
case BUILD_FROM_FILE:
|
||||
file = va_arg(args, char*);
|
||||
continue;
|
||||
case BUILD_FROM_FD:
|
||||
fd = va_arg(args, int);
|
||||
case BUILD_BLOB:
|
||||
blob = va_arg(args, chunk_t);
|
||||
continue;
|
||||
case BUILD_END:
|
||||
break;
|
||||
@@ -228,17 +220,17 @@ sshkey_public_key_t *sshkey_public_key_load(key_type_t type, va_list args)
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (blob.ptr)
|
||||
if (sshkey.ptr)
|
||||
{
|
||||
return parse_public_key(blob);
|
||||
return parse_public_key(sshkey);
|
||||
}
|
||||
if (file)
|
||||
{
|
||||
return load_from_file(file);
|
||||
}
|
||||
if (fd != -1)
|
||||
if (blob.ptr)
|
||||
{
|
||||
return load_from_fd(fd);
|
||||
return load_from_blob(blob);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user