This code needs a way to construct a valid st_rdev (dev_t) from major
and minor device numbers, so that erofs_new_encode_dev() can later
convert the dev_t into the EROFS on-disk rdev format.

But it never uses makedev() to generate dev_t; instead,
erofs_new_encode_dev() uses major()/minor(), so the usage is unpaired
and the original one works only on the Linux platform and non-portable.

Reported-by: Kern Walster <[email protected]>
Closes: https://github.com/erofs/go-erofs/pull/9#issuecomment-4008973934
Fixes: 95d315fd7958 ("erofs-utils: introduce tarerofs")
Cc: Derek McGowan <[email protected]>
Signed-off-by: Gao Xiang <[email protected]>
---
 lib/tar.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lib/tar.c b/lib/tar.c
index eca29f54c06f..26461f8cdbc9 100644
--- a/lib/tar.c
+++ b/lib/tar.c
@@ -11,6 +11,9 @@
 #include "erofs/xattr.h"
 #include "erofs/blobchunk.h"
 #include "erofs/importer.h"
+#if defined(HAVE_SYS_SYSMACROS_H)
+#include <sys/sysmacros.h>
+#endif
 #if defined(HAVE_ZLIB)
 #include <zlib.h>
 #endif
@@ -957,7 +960,7 @@ out_eot:
                        goto out;
                }
 
-               st.st_rdev = (major << 8) | (minor & 0xff) | ((minor & ~0xff) 
<< 12);
+               st.st_rdev = makedev(major, minor);
        } else if (th->typeflag == '1' || th->typeflag == '2') {
                if (!eh.link)
                        eh.link = strndup(th->linkname, sizeof(th->linkname));
-- 
2.43.5


Reply via email to