Optionally return bytes received from http_file_get()
`http_dl->bytes_received` was already free'd when it was accessed inside `aesgcm_file_get()`. Change `http_file_get()` to optionally return the number of bytes received so we know how much data we have to decrypt. This fixes #1994 Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
This commit is contained in:
@@ -109,9 +109,15 @@ aesgcm_file_get(void* userdata)
|
|||||||
http_dl->filename = strdup(tmpname);
|
http_dl->filename = strdup(tmpname);
|
||||||
http_dl->cmd_template = NULL;
|
http_dl->cmd_template = NULL;
|
||||||
http_dl->silent = FALSE;
|
http_dl->silent = FALSE;
|
||||||
|
http_dl->return_bytes_received = TRUE;
|
||||||
aesgcm_dl->http_dl = http_dl;
|
aesgcm_dl->http_dl = http_dl;
|
||||||
|
|
||||||
http_file_get(http_dl); // TODO(wstrm): Verify result.
|
ssize_t* p_bytes_received = http_file_get(http_dl);
|
||||||
|
if (!p_bytes_received) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ssize_t bytes_received = *p_bytes_received;
|
||||||
|
free(p_bytes_received);
|
||||||
|
|
||||||
auto_FILE FILE* tmpfh = fopen(tmpname, "rb");
|
auto_FILE FILE* tmpfh = fopen(tmpname, "rb");
|
||||||
if (tmpfh == NULL) {
|
if (tmpfh == NULL) {
|
||||||
@@ -125,7 +131,7 @@ aesgcm_file_get(void* userdata)
|
|||||||
|
|
||||||
gcry_error_t crypt_res;
|
gcry_error_t crypt_res;
|
||||||
crypt_res = omemo_decrypt_file(tmpfh, outfh,
|
crypt_res = omemo_decrypt_file(tmpfh, outfh,
|
||||||
http_dl->bytes_received, fragment);
|
bytes_received, fragment);
|
||||||
|
|
||||||
remove(tmpname);
|
remove(tmpname);
|
||||||
|
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ void*
|
|||||||
http_file_get(void* userdata)
|
http_file_get(void* userdata)
|
||||||
{
|
{
|
||||||
HTTPDownload* download = (HTTPDownload*)userdata;
|
HTTPDownload* download = (HTTPDownload*)userdata;
|
||||||
|
ssize_t* ret = NULL;
|
||||||
|
|
||||||
char* err = NULL;
|
char* err = NULL;
|
||||||
|
|
||||||
@@ -208,6 +209,10 @@ http_file_get(void* userdata)
|
|||||||
"Downloading '%s': done\nSaved to '%s'",
|
"Downloading '%s': done\nSaved to '%s'",
|
||||||
download->url, download->filename);
|
download->url, download->filename);
|
||||||
win_mark_received(download->window, download->id);
|
win_mark_received(download->window, download->id);
|
||||||
|
if (download->return_bytes_received) {
|
||||||
|
ret = malloc(sizeof(*ret));
|
||||||
|
*ret = download->bytes_received;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,7 +246,7 @@ out:
|
|||||||
free(download->id);
|
free(download->id);
|
||||||
free(download);
|
free(download);
|
||||||
|
|
||||||
return NULL;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ typedef struct http_download_t
|
|||||||
pthread_t worker;
|
pthread_t worker;
|
||||||
int cancel;
|
int cancel;
|
||||||
gboolean silent;
|
gboolean silent;
|
||||||
|
gboolean return_bytes_received;
|
||||||
} HTTPDownload;
|
} HTTPDownload;
|
||||||
|
|
||||||
void* http_file_get(void* userdata);
|
void* http_file_get(void* userdata);
|
||||||
|
|||||||
Reference in New Issue
Block a user