blob: 28fba6cf50f588290e3a740bd982026044422e66 [file] [log] [blame]
Avoid assigning thread data outside of mutex lock
Patch originally from OpenSUSE:
https://build.opensuse.org/package/show?package=atftp&project=openSUSE%3A12.2
Upstream-Status: Pending
Index: git/tftpd_list.c
===================================================================
--- git.orig/tftpd_list.c 2012-10-24 21:48:47.000000000 -0700
+++ git/tftpd_list.c 2012-10-24 21:52:04.266205076 -0700
@@ -49,11 +49,11 @@
*/
int tftpd_list_add(struct thread_data *new)
{
- struct thread_data *current = thread_data;
+ struct thread_data *current;
int ret;
pthread_mutex_lock(&thread_list_mutex);
-
+ current = thread_data;
number_of_thread++;
ret = number_of_thread;
@@ -81,11 +81,13 @@
*/
int tftpd_list_remove(struct thread_data *old)
{
- struct thread_data *current = thread_data;
+ struct thread_data *current;
int ret;
pthread_mutex_lock(&thread_list_mutex);
+ current = thread_data;
+
number_of_thread--;
ret = number_of_thread;
@@ -137,23 +139,26 @@
struct thread_data *data,
struct client_info *client)
{
- struct thread_data *current = thread_data; /* head of the list */
- struct tftp_opt *tftp_options = data->tftp_options;
+ struct thread_data *current; /* head of the list */
+ struct tftp_opt *tftp_options;
struct client_info *tmp;
char options[MAXLEN];
char string[MAXLEN];
char *index;
int len;
+ /* lock the whole list before walking it */
+ pthread_mutex_lock(&thread_list_mutex);
+
*thread = NULL;
+ current = thread_data;
+ tftp_options = data->tftp_options;
+
opt_request_to_string(tftp_options, options, MAXLEN);
index = strstr(options, "multicast");
len = (int)index - (int)options;
- /* lock the whole list before walking it */
- pthread_mutex_lock(&thread_list_mutex);
-
while (current)
{
if (current != data)
@@ -214,9 +219,10 @@
void tftpd_clientlist_remove(struct thread_data *thread,
struct client_info *client)
{
- struct client_info *tmp = thread->client_info;
+ struct client_info *tmp;
pthread_mutex_lock(&thread->client_mutex);
+ tmp = thread->client_info;
while ((tmp->next != client) && (tmp->next != NULL))
tmp = tmp->next;
if (tmp->next == NULL)
@@ -231,9 +237,11 @@
void tftpd_clientlist_free(struct thread_data *thread)
{
struct client_info *tmp;
- struct client_info *head = thread->client_info;
+ struct client_info *head;
pthread_mutex_lock(&thread->client_mutex);
+ head = thread->client_info;
+
while (head)
{
tmp = head;
@@ -250,9 +258,10 @@
struct client_info *client,
struct sockaddr_storage *sock)
{
- struct client_info *head = thread->client_info;
+ struct client_info *head;
pthread_mutex_lock(&thread->client_mutex);
+ head = thread->client_info;
if (client)
{
@@ -334,10 +343,10 @@
void tftpd_list_kill_threads(void)
{
- struct thread_data *current = thread_data; /* head of list */
+ struct thread_data *current; /* head of list */
pthread_mutex_lock(&thread_list_mutex);
-
+ current = thread_data;
while (current != NULL)
{
Index: git/tftpd_mcast.c
===================================================================
--- git.orig/tftpd_mcast.c 2012-10-24 21:48:47.000000000 -0700
+++ git/tftpd_mcast.c 2012-10-24 21:49:11.570201582 -0700
@@ -51,9 +51,11 @@
*/
int tftpd_mcast_get_tid(char **addr, short *port)
{
- struct tid *current = tid_list;
+ struct tid *current;
pthread_mutex_lock(&mcast_tid_list);
+ current = tid_list;
+
/* walk the list for a free tid */
while (current != NULL)
{
@@ -74,9 +76,11 @@
int tftpd_mcast_free_tid(char *addr, short port)
{
- struct tid *current = tid_list;
+ struct tid *current;
pthread_mutex_lock(&mcast_tid_list);
+ current = tid_list;
+
while (current != NULL)
{
if ((current->used == 1) && (current->port == port) &&