Signed-off-by: Andrew Gregory <[email protected]>
---
 lib/libalpm/add.c | 33 ++++++++-------------------------
 1 file changed, 8 insertions(+), 25 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index 1d9db60..0b8aedf 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -204,19 +204,17 @@ static int extract_single_file(alpm_handle_t *handle, 
struct archive *archive,
         *  D            |   10  |  11 |  12
         *
         *  1,2,3- extract, no magic necessary. lstat (_alpm_lstat) will fail 
here.
-        *  4,5,6,7,8- conflict checks should have caught this. either overwrite
+        *  4,5,6,7,8,9- conflict checks should have caught this. either 
overwrite
         *      or backup the file.
-        *  9- follow the symlink, hopefully it is a directory, check it.
-        *  10- file replacing directory- don't allow it.
-        *  11- don't extract symlink- a dir exists here. we don't want links to
-        *      links, etc.
+        *  10,11- file replacing directory- don't allow it.
         *  12- skip extraction, dir already exists.
         */
 
-       /* do both a lstat and a stat, so we can see what symlinks point to */
        struct stat lsbuf, sbuf;
-       if(_alpm_lstat(filename, &lsbuf) != 0 || stat(filename, &sbuf) != 0) {
-               /* cases 1,2,3: couldn't stat an existing file, skip all backup 
checks */
+       if(stat(filename, &sbuf) != 0 || _alpm_lstat(filename, &lsbuf) != 0) {
+               /* cases 1,2,3: file doesn't exist or is a broken symlink,
+                * skip all backup checks */
+               /* TODO: should we really treat broken symlinks as if they 
don't exist? */
        } else {
                if(S_ISDIR(lsbuf.st_mode)) {
                        if(S_ISDIR(entrymode)) {
@@ -243,23 +241,8 @@ static int extract_single_file(alpm_handle_t *handle, 
struct archive *archive,
                                archive_read_data_skip(archive);
                                return 1;
                        }
-               } else if(S_ISLNK(lsbuf.st_mode) && S_ISDIR(entrymode)) {
-                       /* case 9: existing symlink, dir in package */
-                       if(S_ISDIR(sbuf.st_mode)) {
-                               /* the symlink on FS is to a directory, so 
we'll use it */
-                               _alpm_log(handle, ALPM_LOG_DEBUG, "extract: 
skipping symlink overwrite of %s\n",
-                                               filename);
-                               archive_read_data_skip(archive);
-                               return 0;
-                       } else {
-                               /* this is BAD. symlink was not to a directory 
*/
-                               _alpm_log(handle, ALPM_LOG_ERROR, _("extract: 
symlink %s does not point to dir\n"),
-                                               filename);
-                               archive_read_data_skip(archive);
-                               return 1;
-                       }
-               } else if(S_ISREG(lsbuf.st_mode) && S_ISDIR(entrymode)) {
-                       /* case 6: trying to overwrite file with dir */
+               } else if(!S_ISDIR(lsbuf.st_mode) && S_ISDIR(entrymode)) {
+                       /* case 6,9: trying to overwrite file with dir */
                        _alpm_log(handle, ALPM_LOG_DEBUG, "extract: overwriting 
file with dir %s\n",
                                        filename);
                } else if(S_ISREG(entrymode)) {
-- 
1.8.2.1


Reply via email to