Просмотр исходного кода

libdpkg: Unconfuse TarExtractor symlink handling

The code was using confusing variable names to handle the symlink lists.
Guillem Jover лет назад: 16
Родитель
Сommit
68094d5e8c
1 измененных файлов с 19 добавлено и 17 удалено
  1. 19 17
      lib/dpkg/tarfn.c

+ 19 - 17
lib/dpkg/tarfn.c

@@ -191,8 +191,7 @@ TarExtractor(void *userData, const TarFunctions *ops)
 
 	next_long_name = NULL;
 	next_long_link = NULL;
-	symlink_tail = symlink_node = symlink_head = m_malloc(sizeof(symlinkList));
-	symlink_head->next = NULL;
+	symlink_tail = symlink_head = NULL;
 
 	h.Name = NULL;
 	h.LinkName = NULL;
@@ -252,13 +251,17 @@ TarExtractor(void *userData, const TarFunctions *ops)
 			status = ops->MakeHardLink(&h);
 			break;
 		case SymbolicLink:
-			memcpy(&symlink_tail->h, &h, sizeof(TarInfo));
-			symlink_tail->h.Name = m_strdup(h.Name);
-			symlink_tail->h.LinkName = m_strdup(h.LinkName);
-			symlink_tail->next = m_malloc(sizeof(symlinkList));
-
-			symlink_tail = symlink_tail->next;
-			symlink_tail->next = NULL;
+			symlink_node = m_malloc(sizeof(*symlink_node));
+			memcpy(&symlink_node->h, &h, sizeof(TarInfo));
+			symlink_node->h.Name = m_strdup(h.Name);
+			symlink_node->h.LinkName = m_strdup(h.LinkName);
+			symlink_node->next = NULL;
+
+			if (symlink_head)
+				symlink_tail->next = symlink_node;
+			else
+				symlink_head = symlink_node;
+			symlink_tail = symlink_node;
 			status = 0;
 			break;
 		case CharacterDevice:
@@ -327,16 +330,15 @@ TarExtractor(void *userData, const TarFunctions *ops)
 			break;
 	}
 
-	while (symlink_node->next) {
+	while (symlink_head) {
+		symlink_node = symlink_head->next;
 		if (status == 0)
-			status = ops->MakeSymbolicLink(&symlink_node->h);
-		symlink_tail = symlink_node->next;
-		free(symlink_node->h.Name);
-		free(symlink_node->h.LinkName);
-		free(symlink_node);
-		symlink_node = symlink_tail;
+			status = ops->MakeSymbolicLink(&symlink_head->h);
+		free(symlink_head->h.Name);
+		free(symlink_head->h.LinkName);
+		free(symlink_head);
+		symlink_head = symlink_node;
 	}
-	free(symlink_node);
 	free(h.Name);
 	free(h.LinkName);