Harden threading and path handling
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
project(libprozilla VERSION 1.2.1 LANGUAGES C)
|
||||
project(libprozilla VERSION 1.2.2 LANGUAGES C)
|
||||
|
||||
include(CTest)
|
||||
|
||||
|
||||
+5
-6
@@ -434,9 +434,7 @@ void proz_get_url_info_loop(connection_t * connection, pthread_t *thread)
|
||||
assert(connection);
|
||||
assert(thread);
|
||||
connection->running = TRUE;
|
||||
pthread_create(thread, NULL,
|
||||
(void *(*)(void *))get_url_info_loop,
|
||||
(void *)connection);
|
||||
pthread_create(thread, NULL, get_url_info_loop, connection);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -444,8 +442,9 @@ void proz_get_url_info_loop(connection_t * connection, pthread_t *thread)
|
||||
handling conditions like redirection from http to ftp etc
|
||||
|
||||
*************************************************************************/
|
||||
void get_url_info_loop(connection_t * connection)
|
||||
void *get_url_info_loop(void *opaque)
|
||||
{
|
||||
connection_t *connection = opaque;
|
||||
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
|
||||
|
||||
/*TODO Should we try to make it broadcast a condition to the other threads? */
|
||||
@@ -497,7 +496,7 @@ void get_url_info_loop(connection_t * connection)
|
||||
pthread_mutex_unlock(&connection->access_mutex);
|
||||
kfree(constructed_newloc);
|
||||
connection->err = HERR;
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
connection_show_message(connection, _("Redirected to => %s"),
|
||||
@@ -512,7 +511,7 @@ void get_url_info_loop(connection_t * connection)
|
||||
connection->running = FALSE;
|
||||
pthread_mutex_unlock(&connection->access_mutex);
|
||||
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -54,7 +54,7 @@ void connection_show_message(connection_t * connection,
|
||||
const char *format, ...);
|
||||
void connection_calc_ratebps(connection_t * connection);
|
||||
void connection_throttle_bps(connection_t * connection);
|
||||
void get_url_info_loop(connection_t * connection);
|
||||
void *get_url_info_loop(void *opaque);
|
||||
size_t write_data_with_lock(connection_t *connection, const void *ptr, size_t size, size_t nmemb);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
+9
-13
@@ -51,12 +51,9 @@ download_t *proz_download_init(urlinfo * u)
|
||||
|
||||
memcpy(&download->u, u, sizeof(urlinfo));
|
||||
|
||||
download->dl_dir = kmalloc(PATH_MAX);
|
||||
download->output_dir = kmalloc(PATH_MAX);
|
||||
download->log_dir = kmalloc(PATH_MAX);
|
||||
strcpy(download->dl_dir, libprozrtinfo.dl_dir);
|
||||
strcpy(download->output_dir, libprozrtinfo.output_dir);
|
||||
strcpy(download->log_dir, libprozrtinfo.log_dir);
|
||||
download->dl_dir = kstrdup(libprozrtinfo.dl_dir);
|
||||
download->output_dir = kstrdup(libprozrtinfo.output_dir);
|
||||
download->log_dir = kstrdup(libprozrtinfo.log_dir);
|
||||
download->resume_mode = FALSE;
|
||||
download->max_simul_connections = 0;
|
||||
|
||||
@@ -188,8 +185,7 @@ int proz_download_setup_connections_no_ftpsearch(download_t * download,
|
||||
sizeof(http_stat_t));
|
||||
|
||||
|
||||
download->pconnections[i]->localfile = kmalloc(PATH_MAX);
|
||||
strcpy(out_file, download->pconnections[i]->localfile);
|
||||
download->pconnections[i]->localfile = kstrdup(out_file);
|
||||
|
||||
|
||||
download->pconnections[i]->fp = fp;
|
||||
@@ -839,17 +835,18 @@ void proz_download_join_downloads(download_t * download)
|
||||
{
|
||||
download->building = TRUE;
|
||||
pthread_create(&download->join_thread, NULL,
|
||||
(void *(*)(void *))download_join_downloads,
|
||||
(void *)download);
|
||||
download_join_downloads, download);
|
||||
}
|
||||
|
||||
|
||||
/*This function will call download_join_downloads with a handler to join the downloaded files*/
|
||||
void download_join_downloads(download_t * download)
|
||||
void *download_join_downloads(void *opaque)
|
||||
{
|
||||
download_t *download = opaque;
|
||||
// pthread_cleanup_push(cleanup_joining_thread, (void *) download);
|
||||
join_downloads(download);
|
||||
// pthread_cleanup_pop(0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*This function will join the downloaded files*/
|
||||
@@ -2067,8 +2064,7 @@ int proz_download_setup_connections_ftpsearch(download_t * download,
|
||||
|
||||
|
||||
|
||||
download->pconnections[i]->localfile = kmalloc(PATH_MAX);
|
||||
strcpy(out_file, download->pconnections[i]->localfile);
|
||||
download->pconnections[i]->localfile = kstrdup(out_file);
|
||||
download->pconnections[i]->fp = fp;
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ void download_show_message(download_t * download, const char *format,
|
||||
int download_query_conns_status_count(download_t * download,
|
||||
dl_status status, char *server);
|
||||
|
||||
void download_join_downloads(download_t * download);
|
||||
void *download_join_downloads(void *opaque);
|
||||
void join_downloads(download_t * download);
|
||||
void download_calc_throttle_factor(download_t * download);
|
||||
uerr_t download_handle_threads_ftpsearch(download_t * download);
|
||||
|
||||
@@ -383,7 +383,7 @@ void path_simplify(char *path)
|
||||
break;
|
||||
}
|
||||
if (i)
|
||||
strcpy(path, path + i - ddot);
|
||||
memmove(path, path + i - ddot, strlen(path + i - ddot) + 1);
|
||||
|
||||
/* Replace single `.' or `..' with `/'. */
|
||||
if ((path[0] == '.' && path[1] == '\0')
|
||||
@@ -415,7 +415,7 @@ void path_simplify(char *path)
|
||||
|
||||
if ((start + 1) != i)
|
||||
{
|
||||
strcpy(path + start + 1, path + i);
|
||||
memmove(path + start + 1, path + i, strlen(path + i) + 1);
|
||||
i = start + 1;
|
||||
}
|
||||
|
||||
@@ -437,7 +437,7 @@ zero_last:
|
||||
/* Handle `./'. */
|
||||
if (path[i + 1] == '/')
|
||||
{
|
||||
strcpy(path + i, path + i + 1);
|
||||
memmove(path + i, path + i + 1, strlen(path + i + 1) + 1);
|
||||
i = (start < 0) ? 0 : start;
|
||||
continue;
|
||||
}
|
||||
@@ -447,7 +447,8 @@ zero_last:
|
||||
{
|
||||
while (--start > -1 && path[start] != '/')
|
||||
;
|
||||
strcpy(path + start + 1, path + i + 2);
|
||||
memmove(path + start + 1, path + i + 2,
|
||||
strlen(path + i + 2) + 1);
|
||||
i = (start < 0) ? 0 : start;
|
||||
continue;
|
||||
}
|
||||
@@ -830,7 +831,7 @@ uerr_t proz_parse_url(const char *url, urlinfo * u, int strict)
|
||||
path_simplify(u->dir);
|
||||
/* Remove the leading `/' in HTTP. */
|
||||
if ((type == URLHTTP || type == URLHTTPS) && *u->dir == '/')
|
||||
strcpy(u->dir, u->dir + 1);
|
||||
memmove(u->dir, u->dir + 1, strlen(u->dir + 1) + 1);
|
||||
/* Strip trailing `/'. */
|
||||
l = strlen(u->dir);
|
||||
if (l > 1 && u->dir[l - 1] == '/')
|
||||
|
||||
Reference in New Issue
Block a user