diff options
author | kientzle <kientzle@FreeBSD.org> | 2006-11-13 00:26:45 +0000 |
---|---|---|
committer | kientzle <kientzle@FreeBSD.org> | 2006-11-13 00:26:45 +0000 |
commit | 925ac6f1b9b066042073d7a1f49a8a722f1e37fe (patch) | |
tree | ed97538fdbb50cf64986e9c6b394dcd876243405 /lib/libarchive/archive_read_open_filename.c | |
parent | 7f111df0280b73ecaf3370e35a7e2dd7c92ba596 (diff) | |
download | FreeBSD-src-925ac6f1b9b066042073d7a1f49a8a722f1e37fe.zip FreeBSD-src-925ac6f1b9b066042073d7a1f49a8a722f1e37fe.tar.gz |
Minor cleanup of the standard read/write I/O modules:
* Use public API, don't access struct archive directly. (People should be able to copy these into their applications as a template for custom I/O callbacks.)
* Set "skip" only for regular files. ("skip" allows the low-level library to catch attempts to add an archive to itself or extract over itself.)
* Simplify the write_open functions by just calling stat() at the beginning. Somehow, these functions had acquired some complex logic that tried to avoid the stat() call but never succeeded.
MFC after: 10 days
Diffstat (limited to 'lib/libarchive/archive_read_open_filename.c')
-rw-r--r-- | lib/libarchive/archive_read_open_filename.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/libarchive/archive_read_open_filename.c b/lib/libarchive/archive_read_open_filename.c index 0da7d7c..1538c5b 100644 --- a/lib/libarchive/archive_read_open_filename.c +++ b/lib/libarchive/archive_read_open_filename.c @@ -110,9 +110,10 @@ file_open(struct archive *a, void *client_data) return (ARCHIVE_FATAL); } if (fstat(mine->fd, &st) == 0) { - /* Set dev/ino of archive file so extract won't overwrite. */ - a->skip_file_dev = st.st_dev; - a->skip_file_ino = st.st_ino; + /* If we're reading a file from disk, ensure that we don't + overwrite it with an extracted file. */ + if (S_ISREG(st.st_mode)) + archive_read_extract_set_skip_file(a, st.st_dev, st.st_ino); /* Remember mode so close can decide whether to flush. */ mine->st_mode = st.st_mode; } else { |