Missing extattr syscalls on compat32 (was Re: libarchive extattr
i386/amd64 syscall issue)
Tim Kientzle
kientzle at freebsd.org
Thu Jun 4 04:43:39 UTC 2009
Dmitry Marakasov wrote:
>
> The problem: on recent current, 32bit bsdtar won't write archives when
> running under 64bit kernel, dying with exit code 140 and `Bad system call'
> message. I've ran into that using i386 tinderbox jail on amd64 host.
> The problem actually happens in libarchive:
>
> --- lib/libarchive/archive_read_disk_entry_from_file.c ---
> 484 if (!a->follow_symlinks)
> 485 list_size = extattr_list_link(path, namespace, NULL, 0); // <-- HERE
> 486 else
> 487 list_size = extattr_list_file(path, namespace, NULL, 0);
> --- lib/libarchive/archive_read_disk_entry_from_file.c ---
Yes, it looks like only about half of the extattr calls are
actually connected in the freebsd32 compatibility layer. (see below)
According to SVN history, peter@ reserved these slots back
in December 2003 but no one ever went back and connected
them up. I don't know if there was a reason for not
connecting them or if simply no one remembered to do so.
I would guess the latter; the ones that are connected
were all implemented before mid-2002.
I don't see any obvious reason these should not just
work. If you're feeling adventurous, you could try
copying the data from /usr/src/kern/syscalls.master
and see what happens. I don't have a 64-bit system
handy here or I would try this myself.
You can test by going to /usr/src/lib/libarchive/test and
running "make check". That will build and run the libarchive
test suite, which does exercise the extended attribute support.
(Of course, you should revert your change first so that the
extended attribute support is actually compiled.)
Let me know if you find anything,
Tim
$ grep extattr /usr/src/sys/compat/freebsd32/syscalls.master
355 AUE_EXTATTRCTL NOPROTO { int extattrctl(const char *path, int
cmd, \
356 AUE_EXTATTR_SET_FILE NOPROTO { int extattr_set_file( \
357 AUE_EXTATTR_GET_FILE NOPROTO { ssize_t extattr_get_file( \
358 AUE_EXTATTR_DELETE_FILE NOPROTO { int extattr_delete_file( \
371 AUE_EXTATTR_SET_FD NOPROTO { int extattr_set_fd(int fd, \
372 AUE_EXTATTR_GET_FD NOPROTO { ssize_t extattr_get_fd(int fd, \
373 AUE_EXTATTR_DELETE_FD NOPROTO { int extattr_delete_fd(int fd, \
412 AUE_EXTATTR_SET_LINK UNIMPL extattr_set_link
413 AUE_EXTATTR_GET_LINK UNIMPL extattr_get_link
414 AUE_EXTATTR_DELETE_LINK UNIMPL extattr_delete_link
437 AUE_EXTATTR_LIST_FD UNIMPL extattr_list_fd
438 AUE_EXTATTR_LIST_FILE UNIMPL extattr_list_file
439 AUE_EXTATTR_LIST_LINK UNIMPL extattr_list_link
More information about the freebsd-current
mailing list