Fix incorrect check in phar tar parsing

The entry.flags was used to check whether the entry has the directory
flag. The flags however were masked to only contain the permissions. We
need to check the mode, before the permission masking, instead of the
flags to check whether it is a directory.

Closes GH-10464

Signed-off-by: George Peter Banyard <girgias@php.net>
This commit is contained in:
Niels Dossche 2023-01-28 00:07:35 +01:00 committed by George Peter Banyard
parent 284c29328e
commit ec4939b170
No known key found for this signature in database
GPG Key ID: 3306078E3194AEBD
2 changed files with 6 additions and 2 deletions

3
NEWS
View File

@ -17,6 +17,9 @@ PHP NEWS
- Opcache:
. Fix incorrect page_size check. (nielsdos)
- Phar:
. Fix incorrect check in phar tar parsing. (nielsdos)
- Standard:
. Fixed bug GH-10292 (Made the default value of the first param of srand() and
mt_srand() unknown). (kocsismate)

View File

@ -478,14 +478,15 @@ bail:
return FAILURE;
}
uint32_t entry_mode = phar_tar_number(hdr->mode, sizeof(hdr->mode));
entry.tar_type = ((old & (hdr->typeflag == '\0')) ? TAR_FILE : hdr->typeflag);
entry.offset = entry.offset_abs = pos; /* header_offset unused in tar */
entry.fp_type = PHAR_FP;
entry.flags = phar_tar_number(hdr->mode, sizeof(hdr->mode)) & PHAR_ENT_PERM_MASK;
entry.flags = entry_mode & PHAR_ENT_PERM_MASK;
entry.timestamp = phar_tar_number(hdr->mtime, sizeof(hdr->mtime));
entry.is_persistent = myphar->is_persistent;
if (old && entry.tar_type == TAR_FILE && S_ISDIR(entry.flags)) {
if (old && entry.tar_type == TAR_FILE && S_ISDIR(entry_mode)) {
entry.tar_type = TAR_DIR;
}