Skip to content

Commit 1b4efcd

Browse files
committed
untar: optional checking euid
Signed-off-by: yuchen.cc <[email protected]>
1 parent 4472ea4 commit 1b4efcd

File tree

5 files changed

+12
-10
lines changed

5 files changed

+12
-10
lines changed

src/overlaybd/tar/header.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ size_t TarCore::get_size() {
139139
}
140140
}
141141

142-
#define BIT_ISSET(bitmask, bit) ((bitmask) & (bit))
143142
static const char ZERO_BLOCK[T_BLOCKSIZE] = {0};
144143

145144
int TarCore::read_header_internal(photon::fs::IFile *dump) {

src/overlaybd/tar/libtar.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ int UnTar::set_file_perms(const char *filename) {
4343
tv[0].tv_usec = tv[1].tv_usec = 0;
4444

4545
/* change owner/group */
46-
if (geteuid() == 0) {
46+
if (!BIT_ISSET(options, TAR_CHECK_EUID) || geteuid() == 0) {
4747
if (fs->lchown(filename, uid, gid) == -1) {
4848
LOG_ERRNO_RETURN(0, -1, "lchown failed, filename `, uid `, gid `", filename, uid, gid);
4949
}
@@ -174,7 +174,7 @@ int UnTar::extract_file() {
174174
// check file exist
175175
struct stat s;
176176
if (fs->lstat(npath.c_str(), &s) == 0 || errno != ENOENT) {
177-
if (options & TAR_NOOVERWRITE) {
177+
if (BIT_ISSET(options, TAR_NOOVERWRITE)) {
178178
errno = EEXIST;
179179
return -1;
180180
} else {
@@ -202,7 +202,7 @@ int UnTar::extract_file() {
202202
else if (TH_ISSYM(header))
203203
i = extract_symlink(filename);
204204
else if (TH_ISCHR(header) || TH_ISBLK(header)) {
205-
if (geteuid() == 0) {
205+
if (!BIT_ISSET(options, TAR_CHECK_EUID) || geteuid() == 0) {
206206
i = extract_block_char_fifo(filename);
207207
} else {
208208
LOG_WARN("file ` ignored: skip for user namespace", filename);
@@ -332,7 +332,7 @@ int UnTar::extract_symlink(const char *filename) {
332332
int UnTar::extract_dir(const char *filename) {
333333
mode_t mode = header.get_mode();
334334

335-
LOG_DEBUG(" ==> extracting: ` (mode `, directory)", filename, mode);
335+
LOG_DEBUG(" ==> extracting: ` (mode `, directory)", filename, OCT(mode));
336336
if (fs->mkdir(filename, mode) < 0) {
337337
if (errno == EEXIST) {
338338
return 1;

src/overlaybd/tar/libtar.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ class UnTar : public TarCore {
233233
#define TAR_CHECK_MAGIC 16 /* check magic in file header */
234234
#define TAR_CHECK_VERSION 32 /* check version in file header */
235235
#define TAR_IGNORE_CRC 64 /* ignore CRC in file header */
236+
#define TAR_CHECK_EUID 128 /* check effective uid of calling process */
237+
238+
#define BIT_ISSET(bitmask, bit) ((bitmask) & (bit))
236239

237240
/* this is obsolete - it's here for backwards-compatibility only */
238241
#define TAR_IGNORE_MAGIC 0

src/overlaybd/tar/tar_file.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,15 @@ class TarFile : public ForwardFile_Ownership {
199199
th_buf = (TarHeader *)(buf + 2 * T_BLOCKSIZE);
200200
th_buf->typeflag = REGTYPE; // type
201201
struct passwd *pw;
202-
pw = getpwuid(s.st_uid);
202+
pw = getpwuid(0);
203203
if (pw != NULL)
204204
strlcpy(th_buf->uname, pw->pw_name, sizeof(th_buf->uname)); // uname
205-
int_to_oct(s.st_uid, th_buf->uid, 8); // uid
205+
int_to_oct(0, th_buf->uid, 8); // uid
206206
struct group *gr;
207-
gr = getgrgid(s.st_gid);
207+
gr = getgrgid(0);
208208
if (gr != NULL)
209209
strlcpy(th_buf->gname, gr->gr_name, sizeof(th_buf->gname)); // gname
210-
int_to_oct(s.st_gid, th_buf->gid, 8); // gid
210+
int_to_oct(0, th_buf->gid, 8); // gid
211211
int_to_oct(s.st_mode, th_buf->mode, 8); // mode
212212
#ifndef NO_TIMESTAMP
213213
int_to_oct_nonull(s.st_mtime, th_buf->mtime, 12); // mtime

src/overlaybd/tar/test/test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ TEST_F(TarTest, untar) {
169169
auto target = photon::fs::new_subfs(fs, "rootfs", false);
170170
ASSERT_NE(nullptr, target);
171171
DEFER(delete target);
172-
auto tar = new UnTar(tarf, target, 0);
172+
auto tar = new UnTar(tarf, target, TAR_CHECK_EUID);
173173
auto ret = tar->extract_all();
174174
EXPECT_EQ(0, ret);
175175
delete tar;

0 commit comments

Comments
 (0)