From aa915b8522501836ead88987d522dc986f5186ca Mon Sep 17 00:00:00 2001 From: Ugo Cirmignani Date: Tue, 25 Dec 2018 11:35:04 +0100 Subject: [PATCH] Xmass patch --- build/modules/connection.o | Bin 21480 -> 22064 bytes build/modules/fileManagement.o | Bin 13800 -> 14848 bytes build/modules/ftpCommandElaborate.o | Bin 35720 -> 35880 bytes build/modules/ftpData.o | Bin 17480 -> 17528 bytes build/modules/ftpServer.o | Bin 33608 -> 33624 bytes build/uFTP | Bin 105328 -> 105512 bytes ftpCommandElaborate.c | 7 +- ftpData.c | 12 ++-- ftpServer.c | 8 ++- library/connection.c | 96 ++++++++++++++++++++++++---- library/fileManagement.c | 64 +++++++++++++++++-- library/fileManagement.h | 2 + uftpd.cfg | 4 +- 13 files changed, 163 insertions(+), 30 deletions(-) diff --git a/build/modules/connection.o b/build/modules/connection.o index 2e929eb739751c6f2d738fd95123ffca4f58836e..ce51d493e4390dd871958cd5990cb61b87404d51 100644 GIT binary patch delta 4574 zcmb7GeNa@_6+dr55d?O@bf5UOkKJV_MmL4&kc?w7NxRWM(AF^}877IAPDyBnaVF`9CBd+vL8?pIoDR69}Rh&8-g+>z-T=$p2CGbU`?wm({<0U&0+xo4nn z#_rXbDV$-M)6w`G001Y=SA;C{ZL7Z`4PdZNW7c=1J!;PU4@W$l9l#%D1@4Jhz#^W{ zIvpwH5iA$e`$K53lE-5M$CER$%$fP!mN|Vv1AwIH|G!d-W#ZB7QHN8*GG|bm!Ka-s zuJp+yWc(RkiJ548EZz0bC2NgPv~MojI~zCeup~p4ITx}{xY7VDa~9q1b<62|yW8Cv zHSbuvXBqKz<`JC=$-KW9Wkd@G>umNT>JroEC!fn;zv4`RMf!qLG5gpBcWBw#mzMIx zhE$-a85`(}+0G*=O98Oow+6R+a&ge-#HT!Kv>5hzO0+ZhYmb40zAXH+=RW@YmuH5gp_v4_?g=dW%Erydu5C?tPXdA1w7_QFW z#zkB5nYa^=CHKd&SF=%fvrC|yvNa_3XcS-Yv1HHreC{*aymn&19Mu>@H1;-g z6z6A*+8`DnMxPiILFY?yI5bRHALi2l~eC@Z)il_dC`W7=`0^?Up%y!Ev|CEpt5K zIDuGDJT_S{;@HvK*=BTghmCJ`bhQ};ZASZn16|!lrBToZkYViTR`$-0o^X3tGK2qN zb5U=A{mN)P(B2YmuWk)@9BgmwZr$G=HU!jW^zbRp6#2(KFZ!vY_9Q!i)!DA2jvZM` zQ;unwY0F>@01OLFICPKw+X?%5Y3Bzx;r|-WuYcD0H)d0q<0kGex$fSWMlf?ACB>hX znYIjb0;|TJ*)XkXC$VPJIqfglvQf|b7yxoXgHu@|2+sikKIc}aCagJ5VdWVBfETMD z(6tgi2HDuMO){^rEd+pdY#RXJ%M$-2SIno`8Uf%@iU0mSF`tllt;GA>0_W=kfG2sZ zHa>>gn0G`n+jPMU%ZMkq^=HyLohPgd;sNKm^`f-KR|)tB()u2^E=cR+s|CC{MLcga zYmMd*H5phZ&?lwu3W>ij@fwK-C0^(e0N)(|sKfeFUHcjzTlx4cKKAi(fQ|TJ>1V;# z&hDOe5WNVZwdz`WdJ^ph&CR@ln>)K(Tf!aPUAXYz-m$Ni1+=llo6j!M`Y~9p=e?9E zqNf4?E7%?O4YO_gZEPvm^R7uNE8!9VXp*&@#*^i`_HWKfl^vouha@K*Z&c`-2XB?@ zHCrWzMPbELQT7p>b-co#B{=0D$NUOC?{~!dCF1pWtgp}`E3@yeXeF`wB(CyQYbhdp z))Xp-8iG@uJxMxhyLx<0uT+3Oe7REBEUd27^G*>CtGVKw#+*t$?=@nj zWr{O};B{$L3p+12-~-}CH5Zs>aJf9XY)f)T#0rTkwOOh5DAsS+gH6P1Iq~WyI6I*# z|6_QoN{{?FNz*M4&M@)HCtj};oNn;tB%Ly;bA|A!&R+$dn^;VfbXZ`EiRkj3#7aPS z*eh{W0@W#ngikj(L~yFpn53gRWuL$!|J5m7M953(@m!M7QMruo5k6h_3k0Xf=gd7i z5r7dX^c&(pTjdhLX_LGv-_EQ;D@dXf^6ktjT1fC2f+rG6wQc(|ys=%6ESIlp=5{}E zdsyOXBi@zi?j(GgZetSvQ_26vBK(5_k0b)*vJ3#=yTpMO_7cI@lSHpdTqWw4I`0ua zP4txf`Y?WgZG<{6ZxI76>@N91V!9hh;Q2-HZLG=wPz(T@2)|8!gqTiH;g8w2{T*VU zI}P&d#4;^a4z_LooZt@<+>5uW^~j5c2+zW>5~$^!lQ>iJ6MQ8rG63gqA$S+TA0qgW z#8thUWxanPaB;F|!Otc+gr&m-2|)SrB>srx|8WuiVRl>rWJ3D^-joi$} zI9*w$j|u@?kveXPvnfrq8eiU_M~)|XeIUJlvWV9&2~OMT+9LQ~wpnt29ww`JOW=q&SqyHxbtqr@8Y?UFLrPx2x2S delta 3978 zcmaJ@du&uy8voAilhV>@3v-$Bnnzno%WHt5EbSoBD+7qqmro2fU0jGP6^hS5rii)> zL*2rsMk9$BHB?1y)4Q9o64Oewh}!68HT{F#lq`S1b`?ojfqkT#bMAMhA2*AW^qX^k zzu)&b-~HzFbe|9xj*HH6W9!DAify_0X6~u!(S&t6(O#Ve(6Lb@tl{|g@xcoK0CDRq zp3GZ^-brs~W+be$qkjBxl9?`-*q2v^oAM8)j{yK)%JUxa_|m_U>k*F^7ki$`E{b;4 z$RNF6d#+~SlA==l$(xTwQ;K60J+a|RG+|xqQ<;XMzlcg<0y;L1$wl1bJU-X|RE}H? z$_S9KuEam5oJk3&EjY>>2+R*=_P${*&aUjt1Sxn$=Z;(U{=N2C{Y) zNUmi5M7K_}Ixt7r_}hRC{X!rtZ0rw|3mY#6mfhg~%^e->Z>8K*Rn`Wj;}&I~SN3>t znXvJkS{or5a7k#fuyJc>uCVc?P*B*I3`K;ES3?WRd4-=wTLz->XNKzm2CZ({(b1NK z)xF%Zci)YdXHCaT!9ro<-ja~_gcuc_`>k#vcjJuGGOHW^SmG}@vFCADC(Z?n(h`r^ z_}>y)*)65Ag8NHlWrs?q7Y=~#NorGlrB(As_Y7KH9^w-1+35h$j;5|?$A)jB@uAeb zCim}6j_t0+*=7Ecypj#)iHeN0(?(LpGEW{d&FZ?ikUS+_uODmwsNBmBWh z4z98Sz(ni`n_`Nx#nLthg%e?-Y$X89lwARUIfTzCbe@N0-2kwFa533=P7;1A;U7(L zaJ44@s8zW(DBGZHi?qHr(!cC=^t&l{uM_(_V!u%AUx{rm zcHpWs=lh~$*ZxH8A7(h{1LSKMP9Hoo9bhfte!}k~T)h_nSb>KZo8oq5>y_Q4>~>{$ zDf^VP=wI?roK`gr*HkrSv}|u}+tT}5)okI}ym`y6T{~JgZ*OgB-o34LNAJMW4>QE0 zxU<^yb>uqP(*eK)fd7m+pCrCfZTe0TD?63}0Gp_Fr}5irQ(RP{rhGYbkTammZDBZX^bW#x zVm(Z4OwU{YBEzS`g7E~ey8`Kndy6^vFz+@K&#uUA{>-KJQ~76@n(z0#OJ7a;ADNzS zHv@ZCnrnY3a=I-yCzrYzKhPm1=ckn61#}omyo}+q@!U#N)L_9XGq#;Hx?wx1lE;}Z zujDzG{t)SZe-nL|OaCtE-*@m;syN=7f3rXptY|}?8~~|8Pg0;<6syhHpd12XOPJTs z4CgJ|LuajQ&0MCRL8q)6e}r&Z(R`+V**SM(%3&cR-lYRs2I9ZkMRf4WeutU}I7fs`5M&PP@bYRicFaE>ZYg8W5U$7IDs}hIOwY$)#HG)b z`vic$-$Z}i!3$Ffs>vY@_tly{JK(tM^bZg_fOWOz+R1Vs)B|30gmCTk8}f=WJukWq z3oNsFz~%J>d3|{kukRSnM)H3{2!Y4C) z0()V1GhF`H{G9YH4(^3I_kdBXgkfh;84*>DWtECmWO zhvh8sQijW8PoHKM!{t)rcQKrwW~~fQ{nC2(u6c8USdW1^)2DBZBTnI}LRsZRtgAD9 z`bOxdo1bLlpTK=}W=!Az9&)kzp4aZe^$qWs3)gqMeiyE9b?03;-RCMHUDiS+$)&!~ zmALTxX5y;)p}eQ58R~;QjYYVyVQNlil>>C;V|~L?qpuV%mwEA6L%Cj#G?Y*1C)Y|W zXuQR^)xvd+5o5Fh4>m>&Z>91WX)HIUR$@+5#MpW#u4{@I_s+wEO%dbTB0SR+nE)G| LJP+gHhFSju7k2l{ diff --git a/build/modules/fileManagement.o b/build/modules/fileManagement.o index 8bd8ca6982b3fb77376199eb382ebc16a6407138..5971bab25dea7f6d334040bc6bdeb17c4a0f5ac5 100644 GIT binary patch delta 4840 zcmZ{o4{Vh68ONXBwH2-{_78*i-n*8&La&szAZPyxh@qpEw}O9WhQfxEqt}*7`6E3R zHegqaoxPky^od(AC2DY)WEexbDT_F(Zgd*6!lvR9N~jr02{^@=jV)c?<$2%dw?4c} zFX`{@KF|00^Zwr7`@7%MiEX{f!VLqtZ7Y4| zof!ZyL9BoHM*-_ly=z`cZ%zisW@Y*}kpAEedrzJ<;(UQ@fRTQSBVIWI0GWQvZn5q3 zh~t#*UuWC)!MAC&lRvZ$J-^wuZPHNYPg#}e-)q};6utsj3Bv$;LZrYi^XCMvR^Mb? z1+d3tqp^rCMICg4DUR88R@b@gy@I~`oMg>TDD$wDX}OWGYTfBb<~Rj@@IJuMi*pOr z+Gx-6NLzfz=e?8lXXuo}ci0%3I;4+O&M z0v-*7)g-

VJDUJT4vt5BI?wHeFIuj8uu5Pw7*aao~pzv!B7sBV&Row zIIuN~Dg}6i)|Di;=YnSDS$MM4PII_5hI zTyQU6{e$>yiD7PF>**rbI>ufdj&&znj}*K33|srin#!>C(b+EkE?Zw=KE!;0`6=cr zzU6{9nU6C6nt6ix81skbxL_IcZ+rlS0QmEgBJyJi_qA*D9fFh;9S>O z%bI%T_j-5}^Iqo86951YJ2B%lVrAK51s#djo`>SyT?y!D+mY-Zdb%v(!+$JDMDK20 z*YarF*7mk-P2Jt@HgI<{bhamVyPHQxPcojwACzxVNAcZq!~823MC+06!z68uwrv;S z^>Ra5SQa(Z9{QYmk(WIwsXDFvt>A{>e-K>i#|4*qn>no!Q^c9=E*e}@QIw*EMlY%% zC^Rbsm$}vpE_1~Nm-+*OOMTkq#ZKaoNc@G>I9e3 z64UVgf-ewpP;fbur(K@tBcG*p^-J5$MI^T zb$l9Yl%%|=%4e&Fxt_@^-k=+>sm3rL_gF8uL13R_JuYI>Leh)i3w*i8i1qV1ftCUl zrLEuRa{_U>_J4-wY7FxYVU<5syD`4lh`qt52=bK~Ck2;YVZ6TBNVW1R_hwu#c&Vsx zui$bIK*8ywzM@gVW%kQ1uW}Mohoc<|_~7C#D1;}M7^%C2Ri@u4xJ>`N;4=Mdf=m6V z;PM8Hx!nEzlZOA`_!1*k%BLqPTK*n%3NF1y1(*BpoqUp_ICQi1q&y(FEO)QVzvnot z5Dvc*4%9g6Kz|YZF2S?t5WtUsjI#vK-DafX!YaLfE%>)Zw0D^62Pc;woHHJt$Na2_ zL(h$_Hk*zhz*{vvGTKn(8l1~sE%;jII&lRjSTFQ4!CsI44%YYGq+c_Y_>{+C4LiJd zlf#t$yx_$+c3Yb|hD}QiQ#WDsF9CW{!SuHeA75&ubb|#PU0Zd774dN0R5g3JZjTZk zuG^z0J)9e(6ujaw=sxK89X-9cNPgx;W?KkC60 zgm?{y`l(r4Jq^Bzo~=_dGKB~VAu?esXv25GARMa+!l78&U`wb``qpVLvCtz#7DPk2 zas#x^RMsm(h#VosA7t;O&$k`xezLYnjh`m#5wyx79HZZm=3CNyNSaH;pQnTyiC=Sk z|8nC0O`0!BljGD^h&<@Gm9(9)*cmIFvBnu|ow3mwTb%JB9HYymzLv8S^;8FG#%GCd z%+TN}@g3-8?ILSurpDoP{W;)7{=^x-z_DYPlskM{v6A9kCVrjx55y;WbUr7hYJj!I zmreYEY5MnKy82qPHlYSm?9JASpY(@l{a?{Wisy2)={PB#GK!83q*$1%O-o3zllU9N zdx*bF+<%t_M~Ht;e1v#A@snnz&>2!xPuHgTr1-@stgED0OA2T6I-6A%D4C68iGPBw z)=kpPr6@(j%VuaW7q%624^Asw?n&=lwRZg)SX0zN3wt-z7c0mrZc2Pc&bXhj%D4a3 zuWO8FF_rX^ESu8)2d71@F?S4{{-U}n_xSPg;jJHv+}gwXPkT8fcz4b%$%TC z07ZCPn52Wm@nY~8GrWcI5aY=de30>(On+MQ`gTNpU^zwq?OMMo5%s@nay|~^hcC+n1$n8?gYqE6&+!| zc!ZhS-(sBCG7A!=%8Jt|i!<^9C7`!d$t{lN1JdB-;aBqvI0D0^D)}pmz}GyNZfA_l zi`bBYFJqk7WF6zYCVMqc-f;(hOb#Ypa|a$}f%sPco^ig_udq0H%9?_v(IZBe?4EH$ z4KoxmhsPM_6P$vJWlCPfF?y3UCg~2nZ-w-ZZ{QLZvjDowl~vBHe9ar6zg$_1Q&_uT zq+BJtCyhtuzQc@%*^C!b@I_O`<3yN#Iph4QyETWdifn5m)9@TVh29F)Je0zkhElqz z3)qa4iJKZupd)uWj8!P>L6`Ns4kFqdYY&Ub9}%aZb&g85)3YC!9FsCzVF5k+-Fy5Q z#`#^fn{oa?Yo!hW)9@06AQ4r~acWyI6CQaz<2>?q#<_j~MkwIwzc- zd(|;s3t!J&Wto2geYC^ze!zDd)X!5%)8SumSxtv8SObGzrmHV>anqkSy141j+g+SG z^N85uGMGkupNn4yS*?<$?H+YmP1~J`Ino8YhkQfS*9y4qjm*F_%4IinzO#gX(gQ(ycExcx>(+%6@?n~ zOoo-Q8qYg3AR3whhhky#^?EGq?IYKzkROkE1{Ac#7kYkFS{e^~FJQkQglK|`@tAiM n&ln-Z!;n8e<_+WRi7!atFMRe2A*!H%e#~1}rGF)$KW6_2m8|kr diff --git a/build/modules/ftpCommandElaborate.o b/build/modules/ftpCommandElaborate.o index 0a9acd61a0ee4f0f459beebe7bed69090ddacccf..7fa09caed3d0a585027c2fa5b476880c227f6ae5 100644 GIT binary patch delta 6092 zcmZ`-3v86f5&rjZco>5@0v?uz;={aCurGy}w>c^dM=9a(O9mQz#1O#7_W6Oq7|v&6 z{3uko1EEl&0ISMtDo)cXNTkLcGt|AX=%wXm2TY{EGbMb zDXmPds46QfEw9{AI3(U$xhQM3^;}w7vU*6a*ie~VS(qy*>t51kLIg77xNwZ4JyyBNpKKB&R!zJ!yRRca6bJmr{9wp$_AHr9=2qk66esH1L7L`b5ci-9^(iT zT+ZjXevZM!vG}8$Owox~b5dO?Q!zd_Q!KXlbh^-qyuB04lt6z~-4th3%zsO)$5L;#7U4+*f_zlWvGe$OoeAi&FkyRH) zH-hN4HBZs3DN2n(YZB1+G6;z$UIzKSJ~Y|3CTMF8^`SXtYuas1{LsfU_K4ycfx%7S zT~BPBWmyv~%X;*c^A|F#X7+Qu>{M3b3VJtz>@hSikmiok$eKjQVyb0XlbPp6Y~2L% z7_mA71!Q{)J2yf2ePUHqqnPc;VULfcmaIlIJf7*-GF;_3Li){wEC0_j{U;7S_3N;Z z4DK?6Z!rTOMm9tEh}#KExtqk;X|&|b6wD!9>8CLL3xu0V$!Gd+GW`w*N7&-_il<{S z@QF+$T>JbfjVK9EYypviq6nnV(7Z{SrM4!=)>IgpF4EN4nnqi5)6o2rG`G=P1TuZZ z4Wq>%=R(X@r9m&GM(izy@Xr}Lld%s8*RwN= zBDbsFvTU3ev{$VL%lf|v*AlM%EFeD{9UQB-x@D`O$sx^8Ftin9yTKL{+hMbbGS;t` z#qUQ^0`hIfsvSv>y$8J|Al;*5w%=y#_c2%kvYoLr7~74lB`|-?Hym3%t~!cp9K(5j zvItkQH2hBq;G>cR|ECO{#rjBkCKef=(WMOM5g)`rDfq85mPb60&P&xdpW`)z>oGLY z7z!|23bK`1@tV7by`><>sj{W{<`HJ2yA0%U#`2oGi@q|DBgV#Tc{~9Om4R4qw-u_D zCrPOzY@rBGV|N+I&zT=S_e)TOKpeK)6byzyJd3R%5O3Jezp$TgsaB2}7mH*r%YQz0 zhCuAK+jICJ1afjpOvx+h9rTn#_#R`qpQQ0It9i`-GQ#z^^ueBO;0I~EYYbc;?3)}M z-!6BHHta12@v&-y1132AYX2SN$8F#r5kAVmwf_l(E15b|_4=8Op$fp`6=|YQJ&9Jk zJ*irGp4q6St8M;^q7vjOb*xa`EMV+q^j3oWkXRk}KPbMd7_0>UXUvvIGg2L6QDE0$k%WJV?plyT)Zxr_s%MBD zfxcSsdWbbEVMZTTbCs1`+K1Iz4Ap|ap0T{z-!pvrD3VJI=NbFA@+ST2n)8JE38UBr z@@I_YRn((c?+|qfB3sTT6RziOIYlxFJ9mMYfu7wUml&FTq*-BW*4UboJ~UOfrry^4 z+0dLNKQ}S38{`Oe{h020Hz9*qV#B=8uL(`?+Ro?kJ5&M^Oi2o!vH}w+_Ug z?6wGlbrAkU4U96t?^Ox29bAt>@7_rUK9-^yW8ixCo=Uh`;a41d_17KDCr2MMgDjTT zxH+*vvl%{_;W-Rnh=B;mLdNDXwihE2kV4%RY4DuQ#ApQMmOj`6*c$;EWvqI!qf4h5 z-Sr?&+U+0ER}W$rhU!7It5&|J?p)L(U!3EyyB@@RyUn%RODOh$xT@N)@WrfnU$Y3; zleCa>xQyx5eL%<7Wau+Vf3y$%ZyX#C?{WLDG7VqM0~W<%Qxe_RM24?s_;>KZ9+3IO z>d2QH-l8e3`ftNP1NiUK+qB~btKWNGH1Jw_BX-@uyD-`S z@&kIWl&m_Se$-x|+MYv_KgY>bd)+if$6CDiW z4g56>HiC>xchrRjyBJ#=!TTz$jy8k!s?xD6tINPIO1Eg9lIo@mJsW!T%2;To2Y<9@JU SP+gPbEQp?!PveEAg#Q6Hy-_3p delta 6056 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 diff --git a/build/modules/ftpData.o b/build/modules/ftpData.o index 9ad70bb2b78a319956b80b45aef4e6bf30296038..1160b8d7e87567a6cacc4946f4c556e5263056f3 100644 GIT binary patch delta 1793 zcmZ{kU1*b67{|{^(>3*@Y5mCQ5pi$2#?+)(qs%0&X}%1+x!Q`zrrtDK#aASLRRnRZ zQ7nz|!t#LVo!!mY&7h>R4MD0nx*<$Eofjg~%BIySRCh6vXylytyyl_Oi~Ixs-}9X3 z|GZzn57IY-^n42qjjZ{*u3OXd-%acJqm$#Q5+Q`BznP7CAvLWRNMUP9-}RS%{c)8} z@8|`h=WpnR)TExjujj|7MaP-3qt%5}X=eH9REdhNLd+3Pl}=pyrCctTi+N|%VgHv9 z0$mMDVK3wGlfr9fnO@^SRx^%h*#o^= zCaW1)qu0pnH;zl-){2jsTsEg662$B32W-j3pV@k#%5%s$P>sB*T=BH$jGY=#>+@0# z0zSt5PSHikdAs?4%0|c%LdjLg_*iY{2N8BGgWNT z15;rZxPp3JsCOFqB87EkH8iv{+9Wk1b-UDKQUQkB8U0P_|580bI~d&}G~L6@oK}*X zYP+oR#q)#j@&)7vP=;#|=wQ6Dv9k3BME60agY{1$`X!<>%C|DSP#I=X{YF&(7WqNs zdwFGg2>I(x-}iAqD>Vy)r~wa%!}Si9exay{)rO9Hhq~}>*t4QCz8%${gWM*T{uxoc z{0-$>%lE2m!)K=3BuRJbzlW4Iynjw&IK`7Zm Z_d+HawK-P9_sLE=22;r>y#wye-Vef#5-$J% delta 1720 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 Zn!I3>>ram<=PUnn?!Wg3TKOiI|36Zh{L}yd literal 33608 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 CSou-_ diff --git a/build/uFTP b/build/uFTP index 56af0a52d7e26cc68b0fd47c45fc8182ac034db3..26cbc3c8d6ade6a29b8985266f72f194e036fbb7 100755 GIT binary patch delta 33814 zcmbrn2Urxx|3CiTr3!Zx;W#=6iUkotv7sm;r>CNVy$g!i5fzLL4@K1TJWEEi##qpp z#25=kV~Yh##2PV)B}O9}O%7Ysn8X;v{Ga!1VKMo9pa1jx_IY6U^)9b@&+P2%%$%R`i<6 z�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 V>4LKv%{gC8hH(E)pE!k49sn&j$-Mvo delta 32532 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�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[socketId].ssl, SSL_SENT_SHUTDOWN); data->clients[socketId].tlsIsEnabled = 0; @@ -388,7 +390,7 @@ int parseCommandCcc(ftpDataType * data, int socketId) return FTP_COMMAND_PROCESSED_WRITE_ERROR; #endif - #ifdef OPENSSL_ENABLED + #ifndef OPENSSL_ENABLED returnCode = socketPrintf(data, socketId, "s", "500 command not supported\r\n"); if (returnCode <= 0) @@ -532,7 +534,6 @@ int parseCommandAbor(ftpDataType * data, int socketId) int returnCode; if (data->clients[socketId].workerData.threadIsAlive == 1) { - void *pReturn; if (data->clients[socketId].workerData.threadIsAlive == 1) { pthread_cancel(data->clients[socketId].workerData.workerThread); diff --git a/ftpData.c b/ftpData.c index f4df1eb..f05c609 100644 --- a/ftpData.c +++ b/ftpData.c @@ -405,10 +405,7 @@ int searchInLoginFailsVector(void * loginFailsVector, void *element) return i; } } - void cleanup_openssl() - { - EVP_cleanup(); - } + return -1; } @@ -584,12 +581,16 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) /* wait main for action */ if (isInitialization != 1) { + + printf("\n Operation is not an initialization! "); + pthread_mutex_destroy(&data->clients[clientId].workerData.conditionMutex); pthread_cond_destroy(&data->clients[clientId].workerData.conditionVariable); if (data->clients[clientId].workerData.theStorFile != NULL) { - fclose(data->clients[clientId].workerData.theStorFile); + int returnCode = 0; + returnCode = fclose(data->clients[clientId].workerData.theStorFile); data->clients[clientId].workerData.theStorFile = NULL; } @@ -639,7 +640,6 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) if (isInitialization != 1) { - void *pReturn; if (data->clients[clientId].workerData.threadIsAlive == 1) pthread_cancel(data->clients[clientId].workerData.workerThread); diff --git a/ftpServer.c b/ftpServer.c index d6ec03b..47530c0 100644 --- a/ftpServer.c +++ b/ftpServer.c @@ -108,8 +108,8 @@ void workerCleanup(void *socketId) shutdown(ftpData.clients[theSocketId].workerData.socketConnection, SHUT_RDWR); shutdown(ftpData.clients[theSocketId].workerData.passiveListeningSocket, SHUT_RDWR); - close(ftpData.clients[theSocketId].workerData.socketConnection); - close(ftpData.clients[theSocketId].workerData.passiveListeningSocket); + returnCode = close(ftpData.clients[theSocketId].workerData.socketConnection); + returnCode = close(ftpData.clients[theSocketId].workerData.passiveListeningSocket); resetWorkerData(&ftpData, theSocketId, 0); printf("\nWorker cleaned!"); } @@ -339,7 +339,9 @@ void *connectionWorkerHandle(void * socketId) break; } } - fclose(ftpData.clients[theSocketId].workerData.theStorFile); + + int theReturnCode; + theReturnCode = fclose(ftpData.clients[theSocketId].workerData.theStorFile); ftpData.clients[theSocketId].workerData.theStorFile = NULL; if (ftpData.clients[theSocketId].login.ownerShip.ownerShipSet == 1) diff --git a/library/connection.c b/library/connection.c index 3c4103d..14f45e0 100644 --- a/library/connection.c +++ b/library/connection.c @@ -22,7 +22,6 @@ * THE SOFTWARE. */ - #include #include #include @@ -36,12 +35,9 @@ #include #include - #include "../ftpData.h" #include "connection.h" - - int socketPrintf(ftpDataType * ftpData, int clientId, const char *__restrict __fmt, ...) { #define COMMAND_BUFFER 9600 @@ -291,6 +287,10 @@ int createSocket(ftpDataType * ftpData) //Socket creation sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return -1; + } temp.sin_family = AF_INET; temp.sin_addr.s_addr = INADDR_ANY; temp.sin_port = htons(ftpData->ftpParameters.port); @@ -311,9 +311,25 @@ int createSocket(ftpDataType * ftpData) #endif //Bind socket errorCode = bind(sock,(struct sockaddr*) &temp,sizeof(temp)); + if (errorCode == -1) + { + if (sock != -1) + { + close(sock); + } + return -1; + } //Number of client allowed errorCode = listen(sock, ftpData->ftpParameters.maxClients + 1); + if (errorCode == -1) + { + if (sock != -1) + { + close(sock); + } + return -1; + } return sock; } @@ -325,6 +341,11 @@ int createPassiveSocket(int port) //Socket creation sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return -1; + } + temp.sin_family = AF_INET; temp.sin_addr.s_addr = INADDR_ANY; temp.sin_port = htons(port); @@ -345,13 +366,28 @@ int createPassiveSocket(int port) returnCode = bind(sock,(struct sockaddr*) &temp,sizeof(temp)); if (returnCode == -1) - return returnCode; + { + printf("\n Could not bind %d errno = %d", sock, errno); + + if (sock != -1) + { + close(sock); + } + return returnCode; + } //Number of client allowed returnCode = listen(sock, 1); if (returnCode == -1) - return returnCode; + { + printf("\n Could not listen %d errno = %d", sock, errno); + if (sock != -1) + { + close(sock); + } + return returnCode; + } return sock; } @@ -379,7 +415,7 @@ int createActiveSocket(int port, char *ipAddress) } else { - printf("\n sockfd = %d \n", sockfd); + printf("\ncreateActiveSocket created socket = %d \n", sockfd); } @@ -398,6 +434,12 @@ int createActiveSocket(int port, char *ipAddress) if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\n3 Error : Connect Failed \n"); + + if (sockfd != -1) + { + close(sockfd); + } + return -1; } @@ -437,9 +479,41 @@ void fdRemove(ftpDataType * ftpData, int index) void closeSocket(ftpDataType * ftpData, int processingSocket) { + int theReturnCode = 0; + +#ifdef OPENSSL_ENABLED + /* + if (ftpData->clients[processingSocket].dataChannelIsTls == 1) + { + if(ftpData->clients[processingSocket].workerData.passiveModeOn == 1) + { + + printf("\nSSL worker Shutdown 1"); + returnCode = SSL_shutdown(ftpData->clients[processingSocket].ssl); + printf("\nnSSL worker Shutdown 1 return code : %d", returnCode); + + if (returnCode < 0) + { + printf("SSL_shutdown failed return code %d", returnCode); + } + else if (returnCode == 0) + { + printf("\nSSL worker Shutdown 2"); + returnCode = SSL_shutdown(ftpData->clients[processingSocket].ssl); + printf("\nnSSL worker Shutdown 2 return code : %d", returnCode); + + if (returnCode <= 0) + { + printf("SSL_shutdown (2nd time) failed"); + } + } + } + }*/ +#endif + //Close the socket shutdown(ftpData->clients[processingSocket].socketDescriptor, SHUT_RDWR); - close(ftpData->clients[processingSocket].socketDescriptor); + theReturnCode = close(ftpData->clients[processingSocket].socketDescriptor); resetClientData(ftpData, processingSocket, 0); resetWorkerData(ftpData, processingSocket, 0); @@ -462,9 +536,7 @@ void closeClient(ftpDataType * ftpData, int processingSocket) if (ftpData->clients[processingSocket].workerData.threadIsAlive == 1) { - void *pReturn; pthread_cancel(ftpData->clients[processingSocket].workerData.workerThread); - //pthread_join(ftpData->clients[processingSocket].workerData.workerThread, &pReturn); printf("\nQuit command received the Pasv Thread has been cancelled."); } @@ -522,7 +594,6 @@ int selectWait(ftpDataType * ftpData) struct timeval selectMaximumLockTime; selectMaximumLockTime.tv_sec = 10; selectMaximumLockTime.tv_usec = 0; - ftpData->connectionData.rset = ftpData->connectionData.rsetAll; ftpData->connectionData.wset = ftpData->connectionData.wsetAll; ftpData->connectionData.eset = ftpData->connectionData.esetAll; @@ -640,10 +711,11 @@ int evaluateClientSocketConnection(ftpDataType * ftpData) struct sockaddr_in socketRefuse_sockaddr_in; if ((socketRefuseFd = accept(ftpData->connectionData.theMainSocket, (struct sockaddr *)&socketRefuse_sockaddr_in, (socklen_t*)&socketRefuse_in_size))!=-1) { + int theReturnCode = 0; char *messageToWrite = "10068 Server reached the maximum number of connection, please try later.\r\n"; write(socketRefuseFd, messageToWrite, strlen(messageToWrite)); shutdown(socketRefuseFd, SHUT_RDWR); - close(socketRefuseFd); + theReturnCode = close(socketRefuseFd); } return 0; diff --git a/library/fileManagement.c b/library/fileManagement.c index c9fb21a..093b66a 100644 --- a/library/fileManagement.c +++ b/library/fileManagement.c @@ -22,10 +22,6 @@ * THE SOFTWARE. */ - - - - #include #include #include @@ -37,6 +33,7 @@ #include #include #include +#include #include "fileManagement.h" #include "dynamicVectors.h" @@ -58,6 +55,11 @@ static int FILE_CompareStringParameter(const void * a, const void * b) return strcmp(typeA->Name, typeB->Name); } +int FILE_fdIsValid(int fd) +{ + return fcntl(fd, F_GETFD); +} + /* Check if inode is a directory */ int FILE_IsDirectory(char *DirectoryPath) { @@ -718,3 +720,57 @@ gid_t FILE_getGID(const char *group_name) return grp->gr_gid; } + + +void FILE_checkAllOpenedFD(void) +{ + int openedFd = 0, i,ret; + + struct rlimit rl; + if (getrlimit(RLIMIT_NOFILE, &rl) < 0) + printf("%s: can’t get file limit", ""); + + if (rl.rlim_max == RLIM_INFINITY) + rl.rlim_max = 1024; + + for (i = 0; i < rl.rlim_max; i++) + { + ret = FILE_fdIsValid(i); + //printf("\nret = %d", ret); + if (ret != -1) + { + struct stat statbuf; + fstat(i, &statbuf); + if (S_ISSOCK(statbuf.st_mode)) + { + printf("\n fd %d is socket", i); + } + else if (S_ISDIR(statbuf.st_mode)) + { + printf("\n fd %d is dir", i); + } + + /* + else if (S_ISSOCK(statbuf.st_mode)) + { + printf("\n fd %d is socket", fd); + } + else if (S_ISSOCK(statbuf.st_mode)) + { + printf("\n fd %d is socket", fd); + } + else if (S_ISSOCK(statbuf.st_mode)) + { + printf("\n fd %d is socket", fd); + } + else if (S_ISSOCK(statbuf.st_mode)) + { + printf("\n fd %d is socket", fd); + } + */ + + openedFd++; + } + } + printf("\n\nOpened fd : %d", openedFd); +} diff --git a/library/fileManagement.h b/library/fileManagement.h index 9724dcb..c836c92 100644 --- a/library/fileManagement.h +++ b/library/fileManagement.h @@ -71,5 +71,7 @@ int FILE_doChownFromUidGid(const char *file_path, uid_t uid, gid_t gid); uid_t FILE_getUID(const char *user_name); gid_t FILE_getGID(const char *group_name); + void FILE_checkAllOpenedFD(void); + int fd_is_valid(int fd); #define GEN_FILE_MANAGEMENT_TYPES #endif diff --git a/uftpd.cfg b/uftpd.cfg index 480467e..6046aeb 100644 --- a/uftpd.cfg +++ b/uftpd.cfg @@ -10,10 +10,10 @@ MAXIMUM_ALLOWED_FTP_CONNECTION = 30 FTP_PORT = 21 #TCP/IP PORT SETTINGS (DEFAULT 21) -SINGLE_INSTANCE = true +SINGLE_INSTANCE = false #Allow only one server instance (true or false) -DAEMON_MODE = true +DAEMON_MODE = false #Run in background, daemon mode ok IDLE_MAX_TIMEOUT = 3600