From 31f388c353da864dc816c212dbe2ddf8cfc7851f Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 9 Mar 2023 11:15:58 +0000 Subject: [PATCH] Fix GH-10747: Private and protected properties in serialized Date* objects throw --- NEWS | 2 ++ ext/date/php_date.c | 38 ++++++++++++++++++++++++++---- ext/date/tests/gh10152.phpt | 3 +-- ext/date/tests/gh10747-1.phpt | Bin 0 -> 1092 bytes ext/date/tests/gh10747-2.phpt | Bin 0 -> 1044 bytes ext/date/tests/gh10747-3.phpt | Bin 0 -> 1409 bytes ext/date/tests/gh10747-4.phpt | Bin 0 -> 3198 bytes ext/date/tests/gh10747-error.phpt | Bin 0 -> 1056 bytes 8 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 ext/date/tests/gh10747-1.phpt create mode 100644 ext/date/tests/gh10747-2.phpt create mode 100644 ext/date/tests/gh10747-3.phpt create mode 100644 ext/date/tests/gh10747-4.phpt create mode 100644 ext/date/tests/gh10747-error.phpt diff --git a/NEWS b/NEWS index b3bf2f709ae..115cb7a879a 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,8 @@ PHP NEWS . Fix GH-10447 ('p' format specifier does not yield 'Z' for 00:00). (Derick) . Fix GH-10152 (Custom properties of Date's child classes are not serialised). (Derick) + . Fixed bug GH-10747 (Private and protected properties in serialized Date* + objects throw). (Derick) - FFI: . Fixed incorrect bitshifting and masking in ffi bitfield. (nielsdos) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 9bfc4e19740..3ba577c7b2d 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -565,6 +565,36 @@ PHPAPI timelib_tzinfo *get_timezone_info(void) } return tzi; } + +static void update_property(zend_object *object, zend_string *key, zval *prop_val) +{ + if (ZSTR_VAL(key)[0] == '\0') { // not public + const char *class_name, *prop_name; + size_t prop_name_len; + + if (zend_unmangle_property_name_ex(key, &class_name, &prop_name, &prop_name_len) == SUCCESS) { + if (class_name[0] != '*') { // private + zend_string *cname; + zend_class_entry *ce; + + cname = zend_string_init(class_name, strlen(class_name), 0); + ce = zend_lookup_class(cname); + + if (ce) { + zend_update_property(ce, object, prop_name, prop_name_len, prop_val); + } + + zend_string_release_ex(cname, 0); + } else { // protected + zend_update_property(object->ce, object, prop_name, prop_name_len, prop_val); + } + } + return; + } + + // public + zend_update_property(object->ce, object, ZSTR_VAL(key), ZSTR_LEN(key), prop_val); +} /* }}} */ @@ -2794,7 +2824,7 @@ static void restore_custom_datetime_properties(zval *object, HashTable *myht) if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_time_is_internal_property(prop_name)) { continue; } - add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val); + update_property(Z_OBJ_P(object), prop_name, prop_val); } ZEND_HASH_FOREACH_END(); } @@ -3828,7 +3858,7 @@ static void restore_custom_datetimezone_properties(zval *object, HashTable *myht if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_timezone_is_internal_property(prop_name)) { continue; } - add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val); + update_property(Z_OBJ_P(object), prop_name, prop_val); } ZEND_HASH_FOREACH_END(); } @@ -4456,7 +4486,7 @@ static void restore_custom_dateinterval_properties(zval *object, HashTable *myht if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_interval_is_internal_property(prop_name)) { continue; } - add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val); + update_property(Z_OBJ_P(object), prop_name, prop_val); } ZEND_HASH_FOREACH_END(); } @@ -5418,7 +5448,7 @@ static void restore_custom_dateperiod_properties(zval *object, HashTable *myht) if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_period_is_internal_property(prop_name)) { continue; } - add_property_zval_ex(object, ZSTR_VAL(prop_name), ZSTR_LEN(prop_name), prop_val); + update_property(Z_OBJ_P(object), prop_name, prop_val); } ZEND_HASH_FOREACH_END(); } diff --git a/ext/date/tests/gh10152.phpt b/ext/date/tests/gh10152.phpt index 7886cf90ef2..8b5ec9529e2 100644 --- a/ext/date/tests/gh10152.phpt +++ b/ext/date/tests/gh10152.phpt @@ -1,5 +1,5 @@ --TEST-- -GH-10152: Custom properties of DateTimeImmutable child classes are not serialized +Bug GH-10152 (Custom properties of DateTimeImmutable child classes are not serialized) --FILE-- myProperty); ?> --EXPECT-- diff --git a/ext/date/tests/gh10747-1.phpt b/ext/date/tests/gh10747-1.phpt new file mode 100644 index 0000000000000000000000000000000000000000..04f3efc1296cb462764074a0dffe7afb77916046 GIT binary patch literal 1092 zcmd^7|4QUA81&!fDL!&tXvKp40hLr&IB&fx2nzP#KxC^w-@MQY^rER=T;h3`>D3HPPtWT`O^Ri%6r{laXfDz1!#r6NtL_s4 z!!+2>dE>(w_{o?7d<+vHbKEhN#$4ReFcTsZ?lHqmln`P)wzANok}#hal~lTE3+=eX z!hEaF8!k0tdlXt(wq6M3P5aznABr##t*s5&5Mm4blKchIgxCt#yV4w6xQMlgwQ__i zL0uZ;SBx6nmWgx|v;MmssVtVkdRK_~67YtO>v!H8oL2Q_A}O?$4%3 zU>%O{4vOGEieRS*&3xbGyF<9+qkre%y|`Q6XPY^_+tXcwI*HYu6O!<8R0I#_NK6Tw0xPTp~& tLz(f%Rm|u?de9Y#Qh$sD6p^4u4vi)>h_N$M9TFKNN;Y(KLc!-cp*LBKIQIYm literal 0 HcmV?d00001 diff --git a/ext/date/tests/gh10747-2.phpt b/ext/date/tests/gh10747-2.phpt new file mode 100644 index 0000000000000000000000000000000000000000..7bda7858d88df02b29b8faac5a3283103826f67e GIT binary patch literal 1044 zcmds#(N5bi6o$EtpW?`iL^3TJP9ln&QKW4FB9K6$7ibfzveZyd#ff64K&!qx$8AzF zU@t(VT;%)DIseIT2f--48U+FQ-rT{-X~6ad@c_KbTF!GL;8u#+M1xeIMJ@B0T!;z$ zL}euJ#jjEcDF6Hwh0$Q9b@||vAUMv>Q=IqhsG3%!nB`hS2IA2Og@gL7WJ#Q=^#Qan z;Lh`!C4CC`SQ^41glnZVXopL5^${x3KT6jVCxke+jVg>R6^zG4skEt^!g#J(_{2eb zr^;)g4Ck*^9O$@aDs?clJE4c&tA}DlXyB~KiV#=gml6+_9W-KenMQ0 z(l$HKm6kQg8r7p3DM6$0q`9xK=nJ?S-v;r~5Hn4$FVi2RV~lkZx0m^!7GZRcNO7(D#C3=Wc%BIUnWFbJ$_e@H@d+avA`QKHcyqHZ`wP# zRq!OFy7L(Gf%YP!7-uKN5o#Blt^aGEFEwWor`?>5O(J=eXnyd*DSk5S=?_IT;B+V3 kS?7d3tWQFUBy7oNTN7Dg=i06{i7knf7402B_)!nw8A4Dm_5c6? literal 0 HcmV?d00001 diff --git a/ext/date/tests/gh10747-3.phpt b/ext/date/tests/gh10747-3.phpt new file mode 100644 index 0000000000000000000000000000000000000000..2ea11619e7bb2484235eaa4001c4e55bd19b5eae GIT binary patch literal 1409 zcmeH_ZHv=D5XbLr_EQXN;1V&=JYXU5dZ5?SfMCJC5JXDaY_2QmCS*4~d!^sq**x@C zt8aZ}ATas;XXZZ{#`Bi*&r8oEZ`%iW|H1Po(`X9LqT%~YF(^1Ia|v94WDUD@XF?A>mw_TgXkeYli4dFPmtc>OI@gQv?%GX=EfJk}=Ga`b z7FjC{Dv=U2Smo`m#-vwZOMF|zw=>-3{L5ngZh4RE?APq1?h79rKXTzn0KQT^9F1v8 z<6)EEZe}Rpava|sGlIWl1m}!U*AJV0?hu~!=#P5T>j(N=GU?Io66FRO8gC6W6!J?X zFHtd|qO3CIjHP1F8g-eRXNR%Hx~fX2$V$ojF^i_!t?(weco^!;j1%c4CkSxg^i%A2 zi}s`VD0O_G36Cd97w?QX*KyeMt--kwOCv65l6QSx$CUR!F*J^1+D)IVdml74M;`Dr srdR1zcL`YMqw$#p+9nvtOPv#HqKDHt9f>rFk`py zR_t`UF72nTiGy_Ro%=lZj%|B-_HJt1#;f`R`Qwf4I!D0~F|VrZHkO>sGoGh{WCant z%Hllx#8dJbk}JHHDJgIM=7|(UE~@gQW!QFf8NpZzjb}1j@=s;KkKa#EAvupO&LH~z zxC-lg7OdgPdRT2e}cfzUdA9}@q8 zq&pLYhB2DgMIy7ZAhTIg7D85aBF(XoaV4LUF^ur)HqP;g;4EW=kVdPx;)P`Fznp;M z(O51rVV|hj5sQj{00n>$$Y^b>4P%_)t>7O?WUBwF6jPKgS}toD-{jmp^c>H(9rZ`t z3G;$O>#0_Y+CUjgDvo34Rk>8h-^nT~KA4BUx@1w-l~VtjTLe0rmYh$C<)v zV0AG-1yBR&&C+_gf)c7F@T~#AJVC$D{=7Onot~rR4N1(%I&g{Ux)!-N2)U-Z-1M*G z6TG!5JGom2&xz?bC)Ak~*|kRqLEluG-ozqwyF|=!o;mtMVO|~W=s1&itBnox8uqtT zwml#K3KA1cNwJlMs#QW6jVNpPV>3DfhiWB$LBms-X&b&e-|owe1w8{=9y}@!EUc<_;3ht1n7(DM z4#suay7nKEDL1+1CjP%v-8{%vfb;reWAY{QKC5d5~mDPEzb#xqMJy`xCcQC=8b4xW)hk1y1- z+vsEiTnwJ)G)%P}6uF&))`0E+$RFM`e&A@xb`7JDXe%AEyK|{i+2J)#>43DiM%uHv zb%f45iJoW@x3+r3Q-OO(NFl!{9bX};(>)R>Bna1ZaGiMjUnej2T)*v&`(xK{$Jk~Z p_qtA8XU~LoDUHSOz3<1K>^rx6M|u1fP(KF#zfk%G|1(}Fp8>$UbqW9g literal 0 HcmV?d00001 diff --git a/ext/date/tests/gh10747-error.phpt b/ext/date/tests/gh10747-error.phpt new file mode 100644 index 0000000000000000000000000000000000000000..bfa3751217241dc28ff3b2679cfb86fdecc786c3 GIT binary patch literal 1056 zcmc&y(QeZ)6y0n56;~$J5=2lOhXowgNsJBxNK7I~NC;I~}n;Uy80;>T7h0R)i0NL-bM0hhNiF2>Saw9t4t|KK>pUUM7M)_vLRO8 zcLZ#v!M@EJ2B*N{hYa9nm;f2SV=9e(@km1rM~07>p(cz8v98;4p^K`7`Fv58N;mC7 zJ1()Xzg1_AEVU3L3au<#FAL>O`@X>#3b7$tTU)Xv#8$XF{w$cF2^EppC=m*p_O2@BT>q)DtPmWDm-o2Qq3mmVZvG-c zkCG!ZEF)zPk-#89k32ORKG>P64hans#@pkV*e#yDE%(pt*vgFwR?YKvUE}T<*exRe z>5?A~F8R?Q|LT%wQw;I!+vV&$y}%sr^6ezDpCco{RFvndC0eiK5*B#&J4uA80yq;Amh1 HhME2gz7;5T literal 0 HcmV?d00001