Using locking winpr file functions for known hosts.

This commit is contained in:
Armin Novak 2015-12-09 18:29:41 +01:00
parent 19744f3bb8
commit df528cefc5

View File

@ -116,63 +116,55 @@ fail:
static int certificate_data_match_legacy(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data)
{
FILE* fp;
HANDLE fp;
int match = 1;
char* data;
char* mdata;
char* pline;
char* hostname;
long size;
DWORD lowSize, highSize;
UINT64 size;
size_t length;
DWORD read;
fp = fopen(certificate_store->legacy_file, "rb");
if (!fp)
/* Assure POSIX style paths, CreateFile expects either '/' or '\\' */
PathCchConvertStyleA(certificate_store->legacy_file, strlen(certificate_store->legacy_file), PATH_STYLE_UNIX);
fp = CreateFileA(certificate_store->legacy_file, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fp == INVALID_HANDLE_VALUE)
return match;
if (fseek(fp, 0, SEEK_END) < 0)
if ((lowSize = GetFileSize(fp, &highSize)) == INVALID_FILE_SIZE)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->legacy_file, strerror(errno), errno);
fclose(fp);
return match;
}
if ((size = ftell(fp)) < 0)
{
WLog_ERR(TAG, "ftell(%s) returned %s [%08X]",
certificate_store->legacy_file, strerror(errno), errno);
fclose(fp);
return match;
}
if (fseek(fp, 0, SEEK_SET) < 0)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->legacy_file, strerror(errno), errno);
fclose(fp);
WLog_ERR(TAG, "GetFileSize(%s) returned %s [%08X]",
certificate_store->legacy_file, strerror(errno), GetLastError());
CloseHandle(fp);
return match;
}
size = (UINT64)lowSize | ((UINT64)highSize << 32);
if (size < 1)
{
fclose(fp);
CloseHandle(fp);
return match;
}
mdata = (char*) malloc(size + 2);
if (!mdata)
{
fclose(fp);
CloseHandle(fp);
return match;
}
data = mdata;
if (fread(data, size, 1, fp) != 1)
if (!ReadFile(fp, data, size, &read, NULL) || (read != size))
{
free(data);
fclose(fp);
CloseHandle(fp);
return match;
}
fclose(fp);
CloseHandle(fp);
data[size] = '\n';
data[size + 1] = '\0';
@ -243,67 +235,59 @@ static int certificate_data_match_raw(rdpCertificateStore* certificate_store,
char** fprint)
{
BOOL found = FALSE;
FILE* fp;
HANDLE fp;
size_t length;
char* data;
char* mdata;
char* pline;
int match = 1;
long int size;
DWORD lowSize, highSize;
UINT64 size;
char* hostname = NULL;
char* subject = NULL;
char* issuer = NULL;
char* fingerprint = NULL;
unsigned short port = 0;
DWORD read;
fp = fopen(certificate_store->file, "rb");
/* Assure POSIX style paths, CreateFile expects either '/' or '\\' */
PathCchConvertStyleA(certificate_store->file, strlen(certificate_store->file), PATH_STYLE_UNIX);
fp = CreateFileA(certificate_store->file, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_NORMAL, NULL);
if (!fp)
if (fp == INVALID_HANDLE_VALUE)
return match;
if (fseek(fp, 0, SEEK_END) < 0)
if ((lowSize = GetFileSize(fp, &highSize)) == INVALID_FILE_SIZE)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
return match;
}
if ((size = ftell(fp)) < 0)
{
WLog_ERR(TAG, "ftell(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
return match;
}
if (fseek(fp, 0, SEEK_SET) < 0)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
WLog_ERR(TAG, "GetFileSize(%s) returned %s [%08X]",
certificate_store->legacy_file, strerror(errno), GetLastError());
CloseHandle(fp);
return match;
}
size = (UINT64)lowSize | ((UINT64)highSize << 32);
if (size < 1)
{
fclose(fp);
CloseHandle(fp);
return match;
}
mdata = (char*) malloc(size + 2);
if (!mdata)
{
fclose(fp);
CloseHandle(fp);
return match;
}
data = mdata;
if (fread(data, size, 1, fp) != 1)
if (!ReadFile(fp, data, size, &read, NULL) || (read != size))
{
fclose(fp);
free(data);
CloseHandle(fp);
return match;
}
fclose(fp);
CloseHandle(fp);
data[size] = '\n';
data[size + 1] = '\0';
@ -371,40 +355,36 @@ int certificate_data_match(rdpCertificateStore* certificate_store,
BOOL certificate_data_replace(rdpCertificateStore* certificate_store,
rdpCertificateData* certificate_data)
{
FILE* fp;
HANDLE fp;
BOOL rc = FALSE;
size_t length;
char* data;
char* sdata;
char* pline;
long int size;
UINT64 size;
DWORD read, written;
DWORD lowSize, highSize;
fp = fopen(certificate_store->file, "rb");
/* Assure POSIX style paths, CreateFile expects either '/' or '\\' */
PathCchConvertStyleA(certificate_store->file, strlen(certificate_store->file), PATH_STYLE_UNIX);
fp = CreateFileA(certificate_store->file, GENERIC_READ | GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (!fp)
if (fp == INVALID_HANDLE_VALUE)
return FALSE;
/* Read the current contents of the file. */
if (fseek(fp, 0, SEEK_END) < 0)
if ((lowSize = GetFileSize(fp, &highSize)) == INVALID_FILE_SIZE)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
WLog_ERR(TAG, "GetFileSize(%s) returned %s [%08X]",
certificate_store->legacy_file, strerror(errno), GetLastError());
CloseHandle(fp);
return FALSE;
}
size = (UINT64)lowSize | ((UINT64)highSize << 32);
if ((size = ftell(fp)) < 0)
if (size < 1)
{
WLog_ERR(TAG, "ftell(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
return FALSE;
}
if (fseek(fp, 0, SEEK_SET) < 0)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
CloseHandle(fp);
return FALSE;
}
@ -415,22 +395,26 @@ BOOL certificate_data_replace(rdpCertificateStore* certificate_store,
return FALSE;
}
if (fread(data, size, 1, fp) != 1)
if (!ReadFile(fp, data, size, &read, NULL) || (read != size))
{
fclose(fp);
free(data);
CloseHandle(fp);
return FALSE;
}
fclose(fp);
fp = fopen(certificate_store->file, "wb");
if (fp == NULL)
if (SetFilePointer(fp, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
{
WLog_ERR(TAG, "freopen(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
free(data);
WLog_ERR(TAG, "SetFilePointer(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), GetLastError());
CloseHandle(fp);
return FALSE;
}
if (!SetEndOfFile(fp))
{
WLog_ERR(TAG, "SetEndOfFile(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), GetLastError());
CloseHandle(fp);
return FALSE;
}
@ -451,6 +435,7 @@ BOOL certificate_data_replace(rdpCertificateStore* certificate_store,
char* fingerprint = NULL;
char* subject = NULL;
char* issuer = NULL;
char* tdata;
if (!certificate_split_line(pline, &hostname, &port, &subject, &issuer, &fingerprint))
WLog_WARN(TAG, "Skipping invalid %s entry %s!",
@ -464,26 +449,41 @@ BOOL certificate_data_replace(rdpCertificateStore* certificate_store,
fingerprint = certificate_data->fingerprint;
rc = TRUE;
}
if (fprintf(fp, "%s %hu %s %s %s\n", hostname, port, fingerprint, subject, issuer) < 0)
size = _snprintf(NULL, 0, "%s %hu %s %s %s\n", hostname, port, fingerprint, subject, issuer);
tdata = malloc(size + 1);
if (!tdata)
{
WLog_ERR(TAG, "fprintf(%s) returned %s [%08X]",
WLog_ERR(TAG, "malloc(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
CloseHandle(fp);
return FALSE;
}
if (_snprintf(tdata, size + 1, "%s %hu %s %s %s\n", hostname, port, fingerprint, subject, issuer) != size)
{
WLog_ERR(TAG, "_snprintf(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
free(tdata);
CloseHandle(fp);
return FALSE;
}
if (!WriteFile(fp, tdata, size, &written, NULL) || (written != size))
{
WLog_ERR(TAG, "WriteFile(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
free(tdata);
CloseHandle(fp);
return FALSE;
}
free(tdata);
}
}
pline = StrSep(&sdata, "\r\n");
}
if (fflush(fp) != 0)
{
WLog_WARN(TAG, "fflush(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
}
fclose(fp);
CloseHandle(fp);
free(data);
return rc;
@ -533,39 +533,60 @@ BOOL certificate_split_line(char* line, char** host, UINT16* port, char** subjec
BOOL certificate_data_print(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data)
{
FILE* fp;
HANDLE fp;
char* tdata;
UINT64 size;
DWORD written;
/* reopen in append mode */
fp = fopen(certificate_store->file, "ab");
/* Assure POSIX style paths, CreateFile expects either '/' or '\\' */
PathCchConvertStyleA(certificate_store->file, strlen(certificate_store->file), PATH_STYLE_UNIX);
fp = CreateFileA(certificate_store->file, GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (!fp)
if (fp == INVALID_HANDLE_VALUE)
return FALSE;
if (fseek(fp, 0, SEEK_END) < 0)
if (SetFilePointer(fp, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER)
{
WLog_ERR(TAG, "fseek(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
WLog_ERR(TAG, "SetFilePointer(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), GetLastError());
CloseHandle(fp);
return FALSE;
}
if (fprintf(fp, "%s %hu %s %s %s\n", certificate_data->hostname, certificate_data->port,
size = _snprintf(NULL, 0, "%s %hu %s %s %s\n", certificate_data->hostname, certificate_data->port,
certificate_data->fingerprint, certificate_data->subject,
certificate_data->issuer) < 0)
certificate_data->issuer);
tdata = malloc(size + 1);
if (!tdata)
{
WLog_ERR(TAG, "fprintf(%s) returned %s [%08X]",
WLog_ERR(TAG, "malloc(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
fclose(fp);
CloseHandle(fp);
return FALSE;
}
if (fflush(fp) != 0)
if (_snprintf(tdata, size + 1, "%s %hu %s %s %s\n", certificate_data->hostname, certificate_data->port,
certificate_data->fingerprint, certificate_data->subject,
certificate_data->issuer) != size)
{
WLog_WARN(TAG, "fflush(%s) returned %s [%08X]",
WLog_ERR(TAG, "_snprintf(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
free(tdata);
CloseHandle(fp);
return FALSE;
}
if (!WriteFile(fp, tdata, size, &written, NULL) || (written != size))
{
WLog_ERR(TAG, "WriteFile(%s) returned %s [%08X]",
certificate_store->file, strerror(errno), errno);
free(tdata);
CloseHandle(fp);
return FALSE;
}
free(tdata);
fclose(fp);
CloseHandle(fp);
return TRUE;
}