Package: dump
Version: 0.4b47-4+~tjw12r5
Severity: normal

Dear Maintainer,

When using restore -C lgetflags returns 0 for symlinks as flags are not
vaild/settable on a symlink.

However, if EXT4_EXTENTS_FL is set then the verification fails saying
that the flags have changed.

./long_symlink: flags changed from 0x00080000 to 0x00000000.


-- System Information:
Debian Release: 12.7
  APT prefers stable-security
  APT policy: (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 6.1.0-25-amd64 (SMP w/4 CPU threads; PREEMPT)
Kernel taint flags: TAINT_WARN
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: sysvinit (via /sbin/init)

Versions of packages dump depends on:
ii  libblkid1     2.38.1-5+deb12u1
ii  libbz2-1.0    1.0.8-5+b1
ii  libc6         2.36-9+deb12u8
ii  libcom-err2   1.47.0-2
ii  libext2fs2    1.47.0-2
ii  liblzo2-2     2.10-2
ii  libreadline8  8.2-1.3
ii  libselinux1   3.4-1+b6
ii  tar           1.34+dfsg-1.2+deb12u1
ii  zlib1g        1:1.2.13.dfsg-1

dump recommends no packages.

dump suggests no packages.

-- no debconf information
diff -urN dump-0.4b47.orig/restore/dirs.c dump-0.4b47/restore/dirs.c
--- dump-0.4b47.orig/restore/dirs.c     2022-05-03 10:02:27.000000000 +0000
+++ dump-0.4b47/restore/dirs.c  2022-05-03 10:02:27.000000000 +0000
@@ -791,7 +791,7 @@
                                do_compare_error;
                        }
 #ifdef __linux__
-                       if (lgetflags(cp, &newflags) < 0) {
+                       if (lgetflags(cp, &newflags, 0) < 0) {
                                if (node.flags != 0) {
                                        warn("%s: lgetflags failed", cp);
                                        do_compare_error;
diff -urN dump-0.4b47.orig/restore/extern.h dump-0.4b47/restore/extern.h
--- dump-0.4b47.orig/restore/extern.h   2022-05-03 10:02:27.000000000 +0000
+++ dump-0.4b47/restore/extern.h        2022-05-03 10:02:27.000000000 +0000
@@ -127,7 +127,7 @@
 int setflags (int, unsigned long);
 
 int lsetflags (const char *, unsigned long);
-int lgetflags (const char *, unsigned long *);
+int lgetflags (const char *, unsigned long *, unsigned long);
 
 #ifdef USE_QFA
 int    Inode2Tapepos (dump_ino_t, long *, long long *, int);
diff -urN dump-0.4b47.orig/restore/tape.c dump-0.4b47/restore/tape.c
--- dump-0.4b47.orig/restore/tape.c     2022-05-03 10:02:27.000000000 +0000
+++ dump-0.4b47/restore/tape.c  2022-05-03 10:02:27.000000000 +0000
@@ -1805,7 +1805,7 @@
                do_compare_error;
        }
 #ifdef  __linux__
-       if (lgetflags(name, &newflags) < 0) {
+       if (lgetflags(name, &newflags, flags) < 0) {
                if (flags != 0) {
                        warn("%s: lgetflags failed", name);
                        do_compare_error;
diff -urN dump-0.4b47.orig/restore/utilities.c dump-0.4b47/restore/utilities.c
--- dump-0.4b47.orig/restore/utilities.c        2022-05-03 10:02:27.000000000 
+0000
+++ dump-0.4b47/restore/utilities.c     2022-05-03 10:02:27.000000000 +0000
@@ -263,7 +263,7 @@
                         */
 #ifdef sunos
 #else
-                       if (lgetflags (existing, &s) != -1 &&
+                       if (lgetflags (existing, &s, 0) != -1 &&
                            lsetflags (existing, 0) != -1) {
                                ret = link(existing, new);
                                lsetflags(existing, s);
@@ -731,7 +731,7 @@
 #endif /* DUMP_MACOSX */
 
 int
-lgetflags(const char *path, unsigned long *flags)
+lgetflags(const char *path, unsigned long *flags, unsigned long inode_flags)
 {
        int err;
        struct stat sb;
@@ -742,7 +742,7 @@
 
        if (S_ISLNK(sb.st_mode) || S_ISFIFO(sb.st_mode)) {
                // no way to get/set flags on a symlink
-               *flags = 0;
+               *flags = inode_flags & EXT4_EXTENTS_FL;
                return 0;
        }
        else

Reply via email to