From 0bb7fd0cab2d53cd0d44b21301b23edfe817e66b Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 21 Nov 2017 11:52:54 +0900 Subject: [PATCH 1/3] scd: Enable card removal check after select_application. * scd/apdu.c (open_ccid_reader): Fix error handling of ccid_get_atr. * scd/app.c (select_application): Always kick the loop if new APP. * scd/ccid-driver.c (ccid_open_usb_reader): Don't setup at open. (ccid_slot_status): Setup interrupt transfer when !ON_WIRE. -- We can use the interrupt transfer to be notified about card status change. In this case, we don't need to issue PC_to_RDR_GetSlotStatus command. This change improve the setup the notification; it should be done after registration of APP. When the setup is done just after opening the USB connection (before issuing PC_to_RDR_IccPowerOn), a reader might notifies about no card availability (because of not yet powered on), even though the card is ready to be powered on. GnuPG-bug-id: 3508 Signed-off-by: NIIBE Yutaka --- scd/apdu.c | 9 +++++++-- scd/app.c | 10 ++++------ scd/ccid-driver.c | 10 ++++++---- scd/scdaemon.c | 1 + 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/scd/apdu.c b/scd/apdu.c index 97624ebad..c50afbde2 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -1497,8 +1497,13 @@ open_ccid_reader (struct dev_list *dl) err = ccid_open_reader (dl->portstr, dl->idx, dl->ccid_table, &slotp->ccid.handle, &slotp->rdrname); if (!err) - err = ccid_get_atr (slotp->ccid.handle, - slotp->atr, sizeof slotp->atr, &slotp->atrlen); + { + err = ccid_get_atr (slotp->ccid.handle, + slotp->atr, sizeof slotp->atr, &slotp->atrlen); + if (err) + ccid_close_reader (slotp->ccid.handle); + } + if (err) { slotp->used = 0; diff --git a/scd/app.c b/scd/app.c index ec04b404f..f3f1205f8 100644 --- a/scd/app.c +++ b/scd/app.c @@ -323,7 +323,7 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, if (scan || !app_top) { struct dev_list *l; - int periodical_check_needed = 0; + int new_app = 0; /* Scan the devices to find new device(s). */ err = apdu_dev_list_start (opt.reader_port, &l); @@ -349,8 +349,7 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, { err = app_new_register (slot, ctrl, name, periodical_check_needed_this); - if (periodical_check_needed_this) - periodical_check_needed = 1; + new_app++; } if (err) @@ -359,9 +358,8 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, apdu_dev_list_finish (l); - /* If periodical check is needed for new device(s), kick the - scdaemon loop. */ - if (periodical_check_needed) + /* If new device(s), kick the scdaemon loop. */ + if (new_app) scd_kick_the_loop (); } diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index 9c22f5188..4f4a32dfc 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -1661,9 +1661,6 @@ ccid_open_usb_reader (const char *spec_reader_name, } } - if ((*handle)->ep_intr >= 0) - ccid_setup_intr (*handle); - rc = ccid_vendor_specific_init (*handle); leave: @@ -2311,6 +2308,11 @@ ccid_slot_status (ccid_driver_t handle, int *statusbits, int on_wire) no need to send on wire. */ if (!on_wire && !ccid_require_get_status (handle)) { + /* Setup interrupt transfer at the initial call of slot_status + with ON_WIRE == 0 */ + if (handle->transfer == NULL && handle->ep_intr >= 0) + ccid_setup_intr (handle); + *statusbits = 0; return 0; } @@ -3748,7 +3750,7 @@ main (int argc, char **argv) if (!no_poll) ccid_poll (ccid); fputs ("getting slot status ...\n", stderr); - rc = ccid_slot_status (ccid, &slotstat); + rc = ccid_slot_status (ccid, &slotstat, 1); if (rc) { print_error (rc); diff --git a/scd/scdaemon.c b/scd/scdaemon.c index 60d539ddd..0bedb8de2 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -1003,6 +1003,7 @@ handle_signal (int signo) case SIGCONT: /* Nothing. */ + log_debug ("SIGCONT received - breaking select\n"); break; case SIGTERM: From ea28ea18f3ee6c9f5e69986f39848398b58e242e Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 22 Nov 2017 20:54:07 +0100 Subject: [PATCH 2/3] gpg: Fix memory leaking for long inputs via --command-fd. * g10/cpr.c (do_get_from_fd): Free the old buffer. -- If the received input is longer than 200 characters we used to leak the previous allocated buffer. GnuPG-bug-id: 3528 Signed-off-by: Werner Koch --- g10/cpr.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/g10/cpr.c b/g10/cpr.c index 154872013..a7fd1aaba 100644 --- a/g10/cpr.c +++ b/g10/cpr.c @@ -425,11 +425,17 @@ do_get_from_fd ( const char *keyword, int hidden, int getbool ) { if (i >= len-1 ) { + /* On the first iteration allocate a new buffer. If that + * buffer is too short at further iterations do a poor man's + * realloc. */ char *save = string; len += 100; string = hidden? xmalloc_secure ( len ) : xmalloc ( len ); if (save) - memcpy (string, save, i ); + { + memcpy (string, save, i); + xfree (save); + } else i = 0; } From 531182b7f84f3cc75268a645728cb862dd20acee Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 22 Nov 2017 20:54:39 +0100 Subject: [PATCH 3/3] build: Update distsigkey.gpg -- --- g10/distsigkey.gpg | Bin 3452 -> 3267 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/g10/distsigkey.gpg b/g10/distsigkey.gpg index 17de53f8a417c7cb705a9f22a46285bf7ca70234..219b7edbb007b6ba3e503c29150947f26a6d9905 100644 GIT binary patch delta 1649 zcmV-%29Ejs8p9c|X#%qk2Z#c*WCIKV0Vb1i1SSuO0X_s10RjLh1p-)~dNPx~1TKHY z2?zc+HWrz#^sm$a$414*T91L-|(jJ8x(w zxO*&wIm)t9a+!^oO@)ql+#F%&uhoAVp-vG&T7dREhY?$TX&cJD0W&huWk`u9>ab0D zPDdUds2&+}kkt?N5ivyYXs(A=5Pd7`O@jC%k(PvgWN*YPiq!a7Db{CIO51jsqhA}8 zF=$vUc|TYA10D~#Er#Am{@popgp2=IO36s#9-lZX%b6kgwDhyc+0^}tO1Xa|b9~Ho z*_i>21X#Ohw=vD|NWTF5 zIszz?$Vlft51dVZ4ubN=C1~WcLHd~XUI$zMkZhTR6urJ~c+wreGHF#eY3+z2xlNIt zNos0!*s8k6)n1ECMw56Q;>w|zcti=@XeQYg^uA!Xjrv0uV~IBwt95=f*Xs9$3AS z000UJ5WMexDN6}1C^iZU|4)k75;5?VyDm;l>9zvA&^UeBM00-x2v3C~bdgN+l( z1z3TfdArA@8AQ00;B*+|5-WVTuqY*UGzA$7OuF+-U#bm3JN0Mr{U5ZP=n3tkGLZwK z& z%}R1Y$P2_inM8LEHbbZxLj*(Kfq5$N@q0&W;Sq|8zJS?QC2S>a;~{+U6H zM*Ig>8b6?G%3siM3+6QBpPgK)EMmwWxWR zJO!M+88bCf-q6(zu1^l8#}X2`=l(=k7&v&=z`8|QnraKrF%cPiqxiFkL`g>9`S)@h zwYbjr2d7%ysd#`e%^oMuvg$LYMNQN|5jmW7E7(RDHbUPaP)<7uv?M`pWO8L7NM&hm zWn*h)ASjcu3KlKY1QP)W06rEW1Y3Z`bwZf%%T?IzYP|1$DN6}1C!`!wuWpXg>z&~yAC>tyl5v* z%LDLmi=2Q52s`ILw@F)jjJU9!O01^c$mI}-kTS-G%LyfaGDt`a39MutSt5~lo%xM= zL|qA245p?0j0`9REztIDlqWq)crc3;E6W#2+sR4le;t$c^+T`5Y{1Er08zcx=PiC1 z$~edmx5Xhy@s{Jx7O;yDf=150|B8OhCDGyT%LV?VpaJESKlEin=}0)m`rU|<^lLIx zK6~Raj!9ykzc18OM$TbBkS84-qx|#eunTMyDCTVz&N3hp&PiubliN!^WPG`34Q6Jo zM4XMhf9A1wp&KiB-*QID7+EG>G5#~#%&1yu0qhyypGB%VzEaM>T(Ar^OsAr5$gb3R zM*Abjq)oJ>7*IZ!W18IVzhkr5hOXhm00p_1Bw&wxB9YAqZC^{(wCr4pcJv!7Q`;9( vMMS6UP$if!s)L=ngrk_^yzvKQiLmM>A%%A`4-tucem5KSKEF%s4nMZ91sMLS delta 1857 zcmV-H2fp~j8T=ZsX##(URs;|c2ml5J0!=N&HvkF=5b~{stR6zMXDb8%-*Y~#Fh)-V0E?QlBc}4FptBUk9`F1PK8FK9l|hCNLm8WOHa?cR*@kVq#@-cW+~Bc`jpbZ9a(sJ_Hj1 z0strl0#s062Lc-d1qlhdcJ7lv0Udt?H*Y@Rg=txcp$Gmv>_S>VlZnJtmaQbZ%YTao z4%O%i^i_t}eID3~=f7z{Ws`r=E@Eym!eCl`f%71m)l(Om7G5-i125zwDG&q~6jvS+ z2$tP4(vo(>h(OHxKY;OG>9Im?{hGt9ZZ1=?+f>3jovpjJuz6?`w4q=hL!tK`cnKrF<@Ss=+7a#XG+dTll6uXsbr!=s={LUYbg& z3II9#7I0pj(m?0*v4L>UldQTzBSc*Xfgv4^gA*U7`;|Q>3j(O{0~CMKa$BO6NG2%< zJ2^IiN}<*aZssYa)fUo{VPS}9*m|QrIMgznCzl!x%Po+Q)#s>be!Xt?)<970Oo{d# zi{oUt?ienQ7=Pz!p2l(*qKK^et3!HtLi-D=dawCd7zO`R)Cv$()5-bA5O2_PAZV49>vm0Kxd0Xp^F;K8rB| zglV>teCsa=Xns_DXln{Deo|9ZD$egobK67PR*UmnADCA}7ZAk4z&rDQSTXw9#^ z9iCyXN2Z!@pg!_1gheQ)5VAQhCM%Vr2aNL}+=C_gDpry2Y4cCe-U}kfohjUhazD!6 zMmQ!%J0Xq7@IAsxpgH-BP5S7ELR*#kOon|!x zg;}DpC8jwl?OO*^u3yndEJ%!rx*#6zUyPC$1Wy;Pd+vGY@)ZtX{^j<6#lfHnX-s>M zY)5jwlu37=-SJLjjfDPouSgS&$lIu;icz8lCzG66D(`CtU#PX@#UCk#t$>tq#D5xG zX2YrWW@4>o5au@^8Uatxwii$7KbIeu94^PP>Ih% z)l`^+YC|0DN*++f1NOFm#SbCjBIOV$3j)b%Z!?Hi1P~Dj00spDR8xO*0162Z@~wre z9zwHc2rmHOrO5b@bUOdn_>--F)qjSrPtzw#a%Y|QptCWP0N+sckJ>c%co$ov00{M} z3(laO+huvKvXv26TbhXh90U*n2ml5J0#s9iQ~(MI5G0#9(oZFS2m1%FDbFx& zMUtRniHU&Vl~W08jCs1)2g!5zKPsM-ggeS6-$Jd}$mKmnWJbmN?xFM7ryWGQ_3a2~ zFw=VY9hh3VtC)Lk$PSP>Kk=yV<*K>#`hdV_W&ibXJ+hGoX%{Oq5TV~=;APIE$#E8! z%a5)=ZO-|)e@AD3h!_GxYLCEjQb_to+>z!v4>VJWv);$*#sW-P@}cdNCiGe58!vgF zm)G|$R?i>4@Yad?UaE*`4~`8azuYAbA`?j7TE;uMh^iEV(toR_qQ`ks=`Kw4AY1Gt v>U~h*!w3&3FGmoxk&o7sdz#{r_HdQ9gKjsCNotx7;g*L8dzLh>lL(>oqvuFi