Patch from Matt Kraai:
    The following patch makes the -X option to tar behave like GNU,
    which reads one file per line.  It also prevents the last file
    from being appended to the list twice (though that has no
    noticeable impact).
diff --git a/archival/tar.c b/archival/tar.c
index 3a3b7f1..e1beee1 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -246,7 +246,8 @@
 #if defined BB_FEATURE_TAR_EXCLUDE
 				case 'e':
 					if (strcmp(*argv, "xclude")==0) {
-						excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
+						excludeList=xrealloc( excludeList,
+								sizeof(char *) * (excludeListSize+2));
 						excludeList[excludeListSize] = *(++argv);
 						if (excludeList[excludeListSize] == NULL)
 							error_msg_and_die( "Option requires an argument: No file specified\n");
@@ -258,30 +259,30 @@
 						stopIt=TRUE;
 						break;
 					}
-                                case 'X':
-                                       if (*excludeFileName != '-')
-                                               error_msg_and_die("Only one 'X' option allowed\n");
-                                       excludeFileName = *(++argv);
-                                       if  (excludeFileName == NULL)
-                                               error_msg_and_die("Option requires an argument: No file specified\n");
-                                       fileList = fopen (excludeFileName, "rt");
-                                       if (! fileList)
-                                               error_msg_and_die("Exclude file: file not found\n");
-                                       while (!feof(fileList)) {
-                                               fscanf(fileList, "%s", file);
-                                               excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
-                                               excludeList[excludeListSize] = malloc(sizeof(char) * (strlen(file)+1));
-                                               strcpy(excludeList[excludeListSize],file);
-                                               /* Remove leading "/"s */
-                                               if (*excludeList[excludeListSize] == '/')
-                                                       excludeList[excludeListSize] = (excludeList[excludeListSize])+1;
-                                               /* Tack a NULL onto the end of the list */
-                                                       excludeList[++excludeListSize] = NULL;
-                                       }
- 
-                                       fclose(fileList);
-                                       stopIt=TRUE;
-                                       break;
+				case 'X':
+					if (*excludeFileName != '-')
+						error_msg_and_die("Only one 'X' option allowed\n");
+					excludeFileName = *(++argv);
+					if (excludeFileName == NULL)
+						error_msg_and_die("Option requires an argument: No file specified\n");
+					fileList = fopen (excludeFileName, "r");
+					if (! fileList)
+						error_msg_and_die("Exclude file: file not found\n");
+					while (fgets(file, sizeof(file), fileList) != NULL) {
+						excludeList = xrealloc(excludeList,
+								sizeof(char *) * (excludeListSize+2));
+						if (file[strlen(file)-1] == '\n')
+							file[strlen(file)-1] = '\0';
+						excludeList[excludeListSize] = xstrdup(file);
+						/* Remove leading "/"s */
+						while (*excludeList[excludeListSize] == '/')
+							excludeList[excludeListSize]++;
+						/* Tack a NULL onto the end of the list */
+						excludeList[++excludeListSize] = NULL;
+					}
+					fclose(fileList);
+					stopIt=TRUE;
+					break;
 #endif
 				case '-':
 						break;
diff --git a/tar.c b/tar.c
index 3a3b7f1..e1beee1 100644
--- a/tar.c
+++ b/tar.c
@@ -246,7 +246,8 @@
 #if defined BB_FEATURE_TAR_EXCLUDE
 				case 'e':
 					if (strcmp(*argv, "xclude")==0) {
-						excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
+						excludeList=xrealloc( excludeList,
+								sizeof(char *) * (excludeListSize+2));
 						excludeList[excludeListSize] = *(++argv);
 						if (excludeList[excludeListSize] == NULL)
 							error_msg_and_die( "Option requires an argument: No file specified\n");
@@ -258,30 +259,30 @@
 						stopIt=TRUE;
 						break;
 					}
-                                case 'X':
-                                       if (*excludeFileName != '-')
-                                               error_msg_and_die("Only one 'X' option allowed\n");
-                                       excludeFileName = *(++argv);
-                                       if  (excludeFileName == NULL)
-                                               error_msg_and_die("Option requires an argument: No file specified\n");
-                                       fileList = fopen (excludeFileName, "rt");
-                                       if (! fileList)
-                                               error_msg_and_die("Exclude file: file not found\n");
-                                       while (!feof(fileList)) {
-                                               fscanf(fileList, "%s", file);
-                                               excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
-                                               excludeList[excludeListSize] = malloc(sizeof(char) * (strlen(file)+1));
-                                               strcpy(excludeList[excludeListSize],file);
-                                               /* Remove leading "/"s */
-                                               if (*excludeList[excludeListSize] == '/')
-                                                       excludeList[excludeListSize] = (excludeList[excludeListSize])+1;
-                                               /* Tack a NULL onto the end of the list */
-                                                       excludeList[++excludeListSize] = NULL;
-                                       }
- 
-                                       fclose(fileList);
-                                       stopIt=TRUE;
-                                       break;
+				case 'X':
+					if (*excludeFileName != '-')
+						error_msg_and_die("Only one 'X' option allowed\n");
+					excludeFileName = *(++argv);
+					if (excludeFileName == NULL)
+						error_msg_and_die("Option requires an argument: No file specified\n");
+					fileList = fopen (excludeFileName, "r");
+					if (! fileList)
+						error_msg_and_die("Exclude file: file not found\n");
+					while (fgets(file, sizeof(file), fileList) != NULL) {
+						excludeList = xrealloc(excludeList,
+								sizeof(char *) * (excludeListSize+2));
+						if (file[strlen(file)-1] == '\n')
+							file[strlen(file)-1] = '\0';
+						excludeList[excludeListSize] = xstrdup(file);
+						/* Remove leading "/"s */
+						while (*excludeList[excludeListSize] == '/')
+							excludeList[excludeListSize]++;
+						/* Tack a NULL onto the end of the list */
+						excludeList[++excludeListSize] = NULL;
+					}
+					fclose(fileList);
+					stopIt=TRUE;
+					break;
 #endif
 				case '-':
 						break;