mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Merge branch 'PHP-8.4'
* PHP-8.4: Fix potential OOB read in zend_dirname() on Windows
This commit is contained in:
@@ -2196,7 +2196,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
|
||||
}
|
||||
|
||||
/* Strip trailing slashes */
|
||||
while (end >= path && IS_SLASH_P(end)) {
|
||||
while (end >= path && IS_SLASH_P_EX(end, end == path)) {
|
||||
end--;
|
||||
}
|
||||
if (end < path) {
|
||||
@@ -2207,7 +2207,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
|
||||
}
|
||||
|
||||
/* Strip filename */
|
||||
while (end >= path && !IS_SLASH_P(end)) {
|
||||
while (end >= path && !IS_SLASH_P_EX(end, end == path)) {
|
||||
end--;
|
||||
}
|
||||
if (end < path) {
|
||||
@@ -2218,7 +2218,7 @@ ZEND_API size_t zend_dirname(char *path, size_t len)
|
||||
}
|
||||
|
||||
/* Strip slashes which came before the file name */
|
||||
while (end >= path && IS_SLASH_P(end)) {
|
||||
while (end >= path && IS_SLASH_P_EX(end, end == path)) {
|
||||
end--;
|
||||
}
|
||||
if (end < path) {
|
||||
|
||||
@@ -75,8 +75,11 @@ typedef unsigned short mode_t;
|
||||
#define DEFAULT_SLASH '\\'
|
||||
#define DEFAULT_DIR_SEPARATOR ';'
|
||||
#define IS_SLASH(c) ((c) == '/' || (c) == '\\')
|
||||
// IS_SLASH_P() may read the previous char on Windows, which may be OOB; use IS_SLASH_P_EX() instead
|
||||
#define IS_SLASH_P(c) (*(c) == '/' || \
|
||||
(*(c) == '\\' && !IsDBCSLeadByte(*(c-1))))
|
||||
#define IS_SLASH_P_EX(c, first_byte) (*(c) == '/' || \
|
||||
(*(c) == '\\' && ((first_byte) || !IsDBCSLeadByte(*(c-1)))))
|
||||
|
||||
/* COPY_WHEN_ABSOLUTE is 2 under Win32 because by chance both regular absolute paths
|
||||
in the file system and UNC paths need copying of two characters */
|
||||
@@ -110,7 +113,9 @@ typedef unsigned short mode_t;
|
||||
#endif
|
||||
|
||||
#define IS_SLASH(c) ((c) == '/')
|
||||
// IS_SLASH_P() may read the previous char on Windows, which may be OOB; use IS_SLASH_P_EX() instead
|
||||
#define IS_SLASH_P(c) (*(c) == '/')
|
||||
#define IS_SLASH_P_EX(c, first_byte) IS_SLASH_P(c)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user