From 66699def2ef3ab72117345aafc0c87cf8f170811 Mon Sep 17 00:00:00 2001 From: samypr100 <3933065+samypr100@users.noreply.github.com> Date: Wed, 4 Sep 2024 07:31:57 -0400 Subject: [PATCH] fix: adjust close_handles pointer offsets to match distlib cleanup_fds (#6955) ## Summary Resolves issues mentioned in comments * https://github.com/astral-sh/uv/issues/6699#issuecomment-2322515962 * https://github.com/astral-sh/uv/issues/6866#issuecomment-2322785906 Further investigation on the comments revealed that the pointer arithmethic being performed in `let handle_start = unsafe { crt_magic.offset(1 + handle_count) };` from [posy trampoline](https://github.com/njsmith/posy/blob/dda22e6f90f5fefa339b869dd2bbe107f5b48448/src/trampolines/windows-trampolines/posy-trampoline/src/bounce.rs#L146) had some slight errors. Since `crt_magic` was a `*const u32`, doing an offset by `1 + handle_count` would offset by too much, with some possible out of bounds reads or attempts to call CloseHandle on garbage. We needed to offset differently since we want to offset by `handle_count` bytes after the initial offset as seen in [launcher.c](https://github.com/pypa/distlib/blob/888c48b56886b03398646be1217508830427bd75/PC/launcher.c#L578). Similarly, we needed to skip the first 3 handles, otherwise we'd still be attempting to close standard I/O handles of the parent (in this case the shell from `busybox.exe sh -l`). I also added a few extra checks available from `launcher.c` which checks if the handle value is `-2` just to match the distlib implementation more closely and minimize differences. ## Test Plan Manually compiled distlib's launcher with additional logging and replaced `Lib/site-packages/pip/_vendor/distlib/t64.exe` with the compiled one to log pointers. As a result, I was able to verify the retrieved handle memory addresses in this function actually match in both uv and distlib's implementation from within busybox.exe nested shell where this behavior can be observed and manually tested. I was also able to confirm this fixes the issues mentioned in the comments, at least with busybox's shell, but I assume this would fix the case with cmake. ## Open areas `launcher.c` also [checks the size](https://github.com/pypa/distlib/blob/888c48b56886b03398646be1217508830427bd75/PC/launcher.c#L573-L576) of `cbReserved2` before retrieving `handle_start` which this function currently doesn't do. If we wanted to, we could add the additional check here as well, but I wasn't fully sure why it wasn't added in the first place. Thoughts? ```rust // Verify the buffer is large enough if si.cbReserved2 < (size_of::() as isize + handle_count + size_of::() as isize * handle_count) as u16 { return; } ``` --------- Co-authored-by: konstin --- crates/uv-trampoline/src/bounce.rs | 22 +++++++++++------- .../uv-trampoline-aarch64-console.exe | Bin 40960 -> 40960 bytes .../trampolines/uv-trampoline-aarch64-gui.exe | Bin 41984 -> 41984 bytes .../uv-trampoline-i686-console.exe | Bin 36352 -> 36352 bytes .../trampolines/uv-trampoline-i686-gui.exe | Bin 36864 -> 36864 bytes .../uv-trampoline-x86_64-console.exe | Bin 42496 -> 42496 bytes .../trampolines/uv-trampoline-x86_64-gui.exe | Bin 43520 -> 43520 bytes 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/crates/uv-trampoline/src/bounce.rs b/crates/uv-trampoline/src/bounce.rs index c8a71994ef43..22c59340a0bf 100644 --- a/crates/uv-trampoline/src/bounce.rs +++ b/crates/uv-trampoline/src/bounce.rs @@ -344,17 +344,23 @@ fn close_handles(si: &STARTUPINFOA) { if si.cbReserved2 == 0 || si.lpReserved2.is_null() { return; } + let crt_magic = si.lpReserved2 as *const u32; let handle_count = unsafe { crt_magic.read_unaligned() } as isize; - let handle_start = unsafe { crt_magic.offset(1 + handle_count) }; - for i in 0..handle_count { - let handle = HANDLE(unsafe { handle_start.offset(i).read_unaligned() as _ }); - // Close all fds inherited from the parent, except for the standard I/O fds. - if !handle.is_invalid() { - unsafe { CloseHandle(handle) }.unwrap_or_else(|_| { - eprintln!("Failed to close child file descriptors at {}", i); - }); + let handle_start = + unsafe { (crt_magic.offset(1) as *const u8).offset(handle_count) as *const HANDLE }; + + // Close all fds inherited from the parent, except for the standard I/O fds (skip first 3). + for i in 3..handle_count { + let handle = unsafe { handle_start.offset(i).read_unaligned() }; + // Ignore invalid handles, as that means this fd was not inherited. + // -2 is a special value (https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle) + if handle.is_invalid() || handle.0 == -2 as _ { + continue; } + unsafe { CloseHandle(handle) }.unwrap_or_else(|_| { + eprintln!("Failed to close child file descriptors at {}", i); + }); } } diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-aarch64-console.exe b/crates/uv-trampoline/trampolines/uv-trampoline-aarch64-console.exe index 0a4e2323afc9a1a7b61555ad5d474c4378dcb2d8..5b6ea9cab831cebd6ac79e57e2aeffbb87828e7f 100755 GIT binary patch delta 1663 zcmYjRdrVVj6hG%)z*g+AgIcxgYOMwkGlodS5#^xEv+_+%58@`dYdl3`gj_ty_6+Lfw`Ncj zI%R#*yNCw)=_ zPo0Z@!CKnCBo!;Ddx=H+0iOhR<+dlu14{}7{DHFbZ00Tv8*LF%tfCmljVL|<=!b8u z($Of7eHZP>GvVjdmN$>9T+TBJXrntX+i)uB^Nn~_PR!4Uz)pE>K{Vnysw>REf9OP^ z$xODYGEtlVcKTTFr=tdM58|_#`(wHQG5YcR=AnE`NaIx z$>421ac70M&=f}oYH67xU$=%+V=SZvT-o9Ebi!f84bMptNEa z-lw)=qalQx7`eJ=oQ2?N@rapMexvTMcpu_NX$lnWTkeEj6J;3rdYT>Q{-zF$shJIVvwrMlVUFv8Fj=8vweP(pOexfeg9`f@kB2Fqj3?}Zej`muM2Wmg`?SVoma za4|SGE|9upeMOmwf5>%fGetVS?lgb#@#+_aDH ztI@!cL1~az#e=bEDR7J#uxF?ssy(y_q)-Ng3pumu_a_~wwO|jOshxLfqxabv{M&ww zB>)1iIlPXy@M;9GI~F^N7wDf)IP!HbebJbJ{c^A|SBs-^;vQF2L!lesl|ulVHvsH_ zk8p@F5stu%)%;&#EMl}WdKuTT--H@~tt!?5yraf3PT})CjPn^gHUoIsKEznq3Xrgc e<-z-{jOmQtH(16801h#(J_K}52+JDpX!QT4i-)!V delta 1698 zcmYjRe@s<%6hG%)!1to3AwC{R?14{)h>W2UGFCiPf<*;;V2X->Oo5(2Y_>FWJV1vI zORoofImBt&io0yOYo@gfm`=&9sin@g=6x3W41Xb@+)!`lf;RuS?{mNB`#I-)&X0FJ zU4o}e*x?c5n=c$`3Pe1mY()|=Ux^AlBjOKApXnOn2g>P}C>T*G3Uf?Ei?VS#1!1ug zlCT{yMA<)UP9XbTN?s;li;_II-;CRps5dGE{8HKMOb7`1)(ov`xhU-mg4Ss8xaz2T z;cvKx+Opu zJgz2c$caRSI&xAu%cUHffOfj`mIK2mB-e&lmH6EB06eLz%469lsV+Yq@6nLeoBFGPvKl9rW_t1J*x;4>|BHCo1I7OatNB61~PHhYI@=e4GH-oqN z#_iPBQba*I2GXK}TuT{;#!yI6D>AhTI#gi8Dmq=@z}3pFf&|1ivMw48v2zeEAvN(+2Z-&Ago|j%BYJRt<>9wL(3NVFxC{KF@2DSu2VfT<;m_kRE+v-En zd19Ewr?W>GS9p1Ls$?>UwoDBHsa~-5mon42;ltw`VXl?MGNybN1d_(%RmEVbM+TM@ zChO&>jdE4G8?~WZy4UA0Nvdd-8wHQ+%82eYvKxE>vBf8vE~EO9Mc~OS}yw!MpTiDP1i|hih&mWX&w*|;i0q^`=tc#-O=GAzfqfDtiD zHYEH^KUKxyA?mBj#a)#A{u!(!jejptx7%TP^TzYmhRT1@fZK~@v~^8=)b_hPVPk~= zjvBeU`Rw79G~RDhZ1o&-?!dUJiBwjdgzHJFZniFF+g;8%=ny*9CZjF(nFlDb#)i$5 zRg-P`@v&};hUnj)PO^`{x@TOJ3#nHycY(KaUSEQk9n(i18ielz6YpB&=gbaNbr9oj-hRZh<7toff!F$MYrB=wiMDZ>gR6@rY)!F47~uVZ#aFdvzw9& z%g{}Yg_3m{^8wkrD8(Uo_j|?EwomD5;bLr|2}@mgf@+uA>{Y>U+#hhr9ilg{;_W-e zA)n*-T54H(5a+3-%VMz_!=NCG`=z_ZfZrnq^e@GL3t+ULYc}pZcz&eOe|P72$wa?Z_hvt*NK+Vepb$eTuj+%Amin#XwOR?ncx z1hUNxPuYIKZiM<(08^7ZAs`QM_qFtJ`DX<%Lybn4stHYQfZ{J<jPJ`4n^v)n0TILE z46qTFN>^9da3poFNSJWDn}c#i$#dA?fG3>|LXW99or8%~j5+iIB-K&cO3A!`SS5R@ zbY;Sna!#QCO#*#G30Re*LkYaDcRR}sdpuWlkW1%Rme?~5h=p^OIL=W<&Q@i|FvuCo zD9W^d{0^3Tu*Xl5J+E|W=)Pp4y!+XkyEajF zzSJdCkh4h>O-dF;6!TWloMLIL{6zQJL~GY19w@@)K&o|a$29y-155+>4)3WxdF{kJ<|QPSyTg%8is zg7wwW(qkSf!wbMEBf16r_5w^d?i=a;`e~uphGxK`n91%=;36$_e`RfF-edOJ>kyi> zT}CNvaUylQC44}^m6_(>UKqK=v>JKzQekBRPNdq(_~bkHcu7R$B^j-hpf|6(SN9nk ztnETsK;%N3lz&+V0Z!OgrN{<<9B*SQbysF49eZJ*Ax>ipy?jbu4xwf3Fh{_e{+y5| ze>%wi6bRg8%ZAd!b!ozT#dVJsAkm{HU{$?})%wG?%1CHPYrjy|(05^X;nT}^_XS$l{Bi6gg z^o2n;0GJLj&I2%(<;$5SGp*YMFoyXTn6~}^Ft{1u0PAOM0r;Ki>TLiU4{~TswFaQ` LLO?Yg7!3a(ikjRp delta 1771 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 OWx8o%7_siT2KWUPAt4z6 diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-x86_64-console.exe b/crates/uv-trampoline/trampolines/uv-trampoline-x86_64-console.exe index ac528ac78ba7c7f77ccbf1b598936d23cf490f67..8ba2f2b5acd060089171f9b85d4998cf4e1e3bc9 100755 GIT binary patch delta 1811 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 WJAosr5z>KuG;m|JJg{%-g#Q7|zx~z# diff --git a/crates/uv-trampoline/trampolines/uv-trampoline-x86_64-gui.exe b/crates/uv-trampoline/trampolines/uv-trampoline-x86_64-gui.exe index 1d9c5ab50e467aeecc414f5096372ec2a2bc9744..9f503fe512c95f737df40e965590077671277852 100755 GIT binary patch delta 3005 zcmZWr4Ny~87JfG*h#(}W(aLXtP=iC!preB55(>^kWBrLgbrl5pvFol10#>Ob+JN{B z*|lD0)e*b+H)|cK;8Tl=G$=(~UCS!#-)gO{IuEfHtX9Qt-+uQc+D>KW@SS_kz280O z+;i{C>UP!YcGZT}UKdlY*4s6Nm_>oqsfa;LRF`^@Xz_5bcok_CrQQL4Bu9MK-xNSX zMMKm*HQ6hAn?53Bs`zmX(U8evdE7u1X%ef4t@I`S;-E462}Z3+rRshwhH@M)bW5Y7 zIPNInI8MqGZI%c^f@w+0yW|Qzni3k&9f?Vf_k4KAOr3N^yqoeuMQ+k>((=eMF?IYP zHOUY&Cu~xa1>z6yZ6!k|>lMy}2B{gERp{Uyn~XK!P8YhQc$j2;^aM7gl^2?&YQsFwS@G0;~y-wDv?0@DA%UHSe^jP(QDwy`_8J zO5z$`Ztc9z+jlE#IeueSP_krZEE>Of?091rO486D{OCa5xyi_}BdoZAIGk#gRd~S* zC#5ei3941NlP*ZoXY}`3;UklDY{@mN@K{ROgZOh%+ttg}E^SrV|71Dc?)r(hyAaSJ zWn)GTq6T^(OHaO|UuDGx{ChWo78;Ekuy@CCDrbd|^E4#;9a2RnWDgsBnzfX(+StWP zh=WYNz;c}916|hNPEeBbl_Kbl?16nIvF2oHqkM=x<&2Td;blCg^Qb`xiA2MMJE3#A5#7YjTc{|>qlKo#( zX%wm|C1vx)G_xzsd{)*IM2n`Tzsm_5m*J)>^Uyu3d4q2AFLc|LxUI(J$5`je`Y&l> zPE=g9o8ny$#b4i~82JlD5_RO5`yGi6?!HK-%3xYHZO$K z)7ZRN?Y>Wy%i-}<(*=3qWF@W4n@qasmAoN7*>5v~u^F^?e((ilc@3 zL&#HFou5Qp^jdy6(a{(A^YnG-`(r-X!A)lXT}L%tv>?bYsR5Vwh&L)WQQWw|TNP3r zi&;79H9R>Ze_Q9%@iA7_4d`5j842{zANKUwj7Y5x^-09pPV*L;`~GRGESvEdwwO*K zDwC|w7WXb(<>h@|`J;x#J4q=$wRnV22A*Nw5xSVli_^$Znzm%H&zK`fzE$FA@sd%2 zy)amxY8+keDn5?KTzW_wm*f!}jVwqYv*_G{=!k7Yz);~T4(0{TExdj>J@Z9;C$PC8 zlb55n(VYb*GM}C+h#>drcLjs{+}VipbYHk&YA6iqm55~y|M#h-FpPxKtimP!^>|&h z6$g>0Lvw=OC=4oF1xo|FV1ni&sJwkF15Ao#SKRKu2qSh87c-~O!#-5C`>_uq8|e8? z4XBl6MFXNIgOat9(DU0UI}(4uLbQSOPr9!tBzPoZz?ZxEzJa%2P_cccc#h)= zySdE-M0uoH6Uz$DRA^Mj!Oj(!;O#{*ctADfTv7R z&btR3!}}hc;Zu*!usRD*+-gLZT#D=fm7mjQRg>uR>2tsT12B2zZU6uP delta 3010 zcmZWr4Nz3q6~1@bMFe31S*-~2_t1qPu*j%bF<^nd)s25he#QhueiUPL5l~~TV0NiK zo~zjFB(>FuDQPoR7{k*HBGv^7KdmtaXd5+2t%>bhe@5_MqrRT=b~Tx}Gl%cobM86! z-1BoEHG`U(K}~&)SJc)oKDOy7jgkaql-`M>I{KnyPaLbEZPMQ4O}=!bH16kzC~cOyXKvJvE=wYW7l!53 z7($LwLWn$1%FT?TbS$fy{R=w4j?E4axE>9g#Cblv_;R4!BYijffrfs@zR513rBYVT zI4yli%Ad1aON*pi^Y+lBxdzo|OQd`PIE&!o#ob&3_%;heaw3QnL+l*f(#;DU@*C{< zf?j%-*%vlx@Bf=6vW$H8aD~2mM?qC!r zZ@W*|>*c?(!Q3dC!0zUz`0fZMMEIAfPwr(Yi<5lwo-TK?Hy4NbCgJj*pe^6N(x zMeiq0w>T17&9+aqrn?qLJGT^aXK}>3uwxvPzePy9r?;nphfL9O6b|dF94TM+RxhpN zmF}zm=539t8R2{E+zRHibWFxI6ME6SW=G5|z zBkJks92~WO4vxf$d@G!XzZ!E|m)<_i`j#fVaIO)WNNDHkLGC*FNKu3Vi^m$Tj&VV5 zEW$(iEQ>6hOzYXa!sI!B$JTS~<%TfTQ1GlX*osShfL9Ec)6_)x%CRRPB%%ANSGMUc z_Mm(Bd3hnWHQw>2Jc9KWCS)8>R#VdtfFn8L1N1hF7xUG@!vo$6Koyvrmzy9h&@ntT zb{iZIGnLI!m!(mWtzH(NwHK-bS?ks$vGn4IR9=r7|385P z*Z%uzrY0f(?PZluM?Uxt-i7kwLMT{=>qS;yY=ogdRvbx3v-8DaGeY)bBc>mW#b9Fp zjG*?wOTtC@{`;s~#Tj|w4sZL^3tu_myji$!7F_aCmRypcZ^kXp3>w&*B@wiSi6!&t zZFZp~-lt?D`b{rn{-xuSFYQy5t2)^Tl{70|SHI*PhD24bGXh`-+q#TP3i2~w&&B6urwHTPKaW`CF))dv0D}$>pIV=75>#zk)3+pFk%wYxx@g4tQPkwJneVQTG|U zRvuct10=0DCxT7{mbaxNz@`M8U7P=}VTJRw8I{6A{8F7b1m{3xV?7_LiA{R{Ek1hrn{DCJUuyR{F#yTu7aokpvdVWjSHc&n*<0;st!ELMH ziLg7XfI*wQGGEhxk!tc?wo`riZw%}W@;(}4{Ls->tGkx znkGDfgRVMFPK(3BMVf_7AKtNvvqGBiCf8X~#k6scZ-P59Cy>W2ypS2FH+t*isCB_kUhERX`Yt~i~Ha-VpfKPYFeR1+A1Y?5 z`kZA{1+}dEE~vWa3q|>807eB6=``?2*MMdWx)J$7j|}-A6Ut9}WJ4aj4Oj-`1nL5+ z2WkX54Ak!7aoswgOi&fLumTGU2*JZb;hWgjU)s6`zbbf*3PFW71nJHs;;p@aheI)3D{Fk$dM*OE&#r=mXHwO z5$k|nJ>Ok82T%jZ5f1=?pK6uqbuS3w zB@d4{?BNju*1HczGJS2;B104n)as4KDh7g;8is3ehjn#y#fIW!KK$s!Ks4awS PYGxgpze+yu-}n1JOK$92