/*
* Skip the path-name which is quoted.
*/
- while (ll > 0 && *pp != ' ' && *pp != '\t') {
+ while (ll > 0 && *pp != ' ' &&*pp != '\t' && *pp != '\r' &&
+ *pp != '\n') {
if (!safe_char[*(const unsigned char *)pp]) {
f = 0;
break;
if (f == 0) {
const char *pb = p + len - nl;
int name_len = 0;
+ int slash;
/* Do not accept multi lines for form D. */
if (pb-2 >= p &&
if (pb-1 >= p && pb[-1] == '\\')
return (-1);
+ slash = 0;
while (p <= --pb && *pb != ' ' && *pb != '\t') {
if (!safe_char[*(const unsigned char *)pb])
return (-1);
name_len++;
+ /* The pathname should have a slash in this
+ * format. */
+ if (*pb == '/')
+ slash = 1;
}
- if (name_len == 0)
+ if (name_len == 0 || slash == 0)
return (-1);
ll = len - nl - name_len;
pp = p;
test_read_format_mtree3();
}
+DEFINE_TEST(test_read_format_mtree_filenames_only)
+{
+ static char archive[] =
+ "/set type=file mode=0644\n"
+ "./a\n"
+ "./b\n"
+ "./c\n"
+ "./d\n"
+ "./e\n"
+ "./f mode=0444\n";
+ struct archive_entry *ae;
+ struct archive *a;
+
+ assertMakeFile("file", 0644, "file contents");
+
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_support_filter_all(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_support_format_all(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_memory(a, archive, sizeof(archive)));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "./a");
+ assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "./b");
+ assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "./c");
+ assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "./d");
+ assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "./e");
+ assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "./f");
+ assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0444);
+
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+ assertEqualInt(6, archive_file_count(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
DEFINE_TEST(test_read_format_mtree_nomagic_v1_form)
{
const char reffile[] = "test_read_format_mtree_nomagic.mtree";