New upstream version 1.9.8

This commit is contained in:
Ludovic Rousseau 2022-06-11 10:55:30 +02:00
parent ab1a953831
commit fd719fbb94
15 changed files with 411 additions and 69 deletions

View File

@ -1,3 +1,13 @@
1.9.8: Ludovic Rousseau
11 June 2022
- Install install_spy.sh & uninstall_spy.sh scripts in docdir
- SCardTransmit(): do not fail if receive buffer is "too large"
- SCardControl(): do not fail if receive buffer is "too large"
- fix some memory leaks on shutdown
- use a better random number generator
- Some other minor improvements
1.9.7: Ludovic Rousseau
13 May 2022
- disable strict compilation by default

View File

@ -1,4 +1,259 @@
commit 5c45145d34b5e7382e0223477ff22de67ef97c77 (HEAD -> master)
commit 41dc5a51321bc3198af36574f73dc007cab72a7d (HEAD -> master, tag: 1.9.8)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Sat Jun 11 10:49:34 2022 +0200
Release 1.9.8
Signed-off-by: Ludovic Rousseau <ludovic.rousseau@free.fr>
ChangeLog | 10 ++++++++++
configure.ac | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
commit f7f80db5fae5f15c0d0ce2e6cd81a5c11c0a7510 (zotac/master, origin/master, origin/HEAD, github/master)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Fri Jun 10 09:58:46 2022 +0200
Install install_spy.sh uninstall_spy.sh scripts
They are installed in docdir i.e. ${datarootdir}/doc/${PACKAGE} where
datarootdir is ${prefix}/share
On a Debian system with --prefix=/usr that is /usr/share/doc/pcsc-lite/
The idea is to have the scripts included in the -dev package so that
they are easily available on user's computer.
src/spy/Makefile.am | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
commit c94aeb5ed933dbbe09af611a4829999860a0b293
Author: Petr Mikhalicin <mkh199740@mail.ru>
Date: Thu May 26 18:03:38 2022 +0300
Add destructor library function
Resolve: https://salsa.debian.org/rousseau/PCSC/-/issues/1
src/winscard_clnt.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
commit b312b45dd6a8d6c18ee09a411e7b3df6a0ab831f
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Wed Jun 1 17:56:55 2022 +0200
SCardControl(): do not fail if receive buffer is "too large"
SCardControl() should not fail if the receive buffer is "too large"
i.e. larger than MAX_BUFFER_SIZE_EXTENDED.
src/winscard_clnt.c | 3 +--
src/winscard_svc.c | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
commit 6218f7bc878ba183a788de5f7441247f20d1adaf
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Wed Jun 1 17:50:23 2022 +0200
Test the check of SCardControl(..., cbRecvLength,..)
SCardControl() should not fail if the receive buffer is "too large"
i.e. larger than MAX_BUFFER_SIZE_EXTENDED.
UnitaryTests/BufferOverflow_SCardControl.c | 9 +++++++++
1 file changed, 9 insertions(+)
commit 967e6e5495685bdedafb55d937fbef8a036f2c60
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Wed Jun 1 17:41:58 2022 +0200
SCardTransmit(): do not fail if receive buffer is "too large"
SCardTransmit() should not fail if the receive buffer is "too large"
i.e. larger than MAX_BUFFER_SIZE_EXTENDED.
Thanks to Frank Morgner for the bug report.
" Too strict checking on limits for SCardTransmit #137 "
https://github.com/LudovicRousseau/PCSC/issues/137
src/winscard_clnt.c | 3 +--
src/winscard_svc.c | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
commit 540026cdb77f42a91d1da5cdc7f607bbbbaffa70
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Wed Jun 1 17:39:59 2022 +0200
Test the check of SCardTransmit(..., pbRecvBuffer)
SCardTransmit() should not fail if the receive buffer is "too large"
i.e. larger than MAX_BUFFER_SIZE_EXTENDED.
UnitaryTests/BufferOverflow_SCardTransmit.c | 11 +++++++++++
1 file changed, 11 insertions(+)
commit 210efa525f50e99821a10d91b8c861825e470d8b
Author: Maksim Ivanov <emaxx@google.com>
Date: Sun May 29 16:31:19 2022 +0200
Fix leak of fullName on shutdown (#134)
Free _readerTracker::fullName strings on shutdown in hotplug_libusb.
src/hotplug_libusb.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
commit 652cbffa4cad54bbd93ad538c27ad6b169bc869f
Author: Maksim Ivanov <emaxx@google.com>
Date: Sun May 29 16:27:47 2022 +0200
gitignore configure~, config.h.in~ (#136)
Add the "configure~" and "config.h.in~" files to .gitignore. These files
are produced after running "bootstrap" more than once, and don't need to
be committed.
.gitignore | 2 ++
1 file changed, 2 insertions(+)
commit 9879d1c2b78caafc757b883b0fe8ccc8e7c4548f
Author: Maksim Ivanov <emaxx@google.com>
Date: Sun May 29 16:24:39 2022 +0200
Make sure AraKiriHotPlug false on libusb startup (#135)
Reset the AraKiriHotPlug flag to false when starting libusb hotplug
search.
This is not needed on the initial process startup, because the flag is
initialized to false, but allows to implement unit tests that need to
restart the previously stopped threads within the memory of the same
process.
src/hotplug_libusb.c | 1 +
1 file changed, 1 insertion(+)
commit accaa9738ad6091603ead68e85d2217944624cee
Author: Maksim Ivanov <emaxx@google.com>
Date: Fri May 27 17:19:21 2022 +0200
Fix double-free of CFBundleName on shutdown (#132)
Fix the double-free of the _driverTracker::CFBundleName field in
HPRescanUsbBus() in hotplug_libusb on the shutdown path. The root cause
was reusing the same string pointer for multiple entries in the
driverTracker array.
src/hotplug_libusb.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
commit 1ab596a91032f0f4ce8d73454c33cae9129ab358
Author: Maksim Ivanov <emaxx@google.com>
Date: Fri May 27 17:17:37 2022 +0200
Fix libusb_device list leak on shutdown (#133)
Call libusb_free_device_list() before exiting the hotplug thread in
hotplug_libusb.c.
src/hotplug_libusb.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
commit 7ca49799838cafcb403f63cce66624ff9fec15c8
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Sun May 22 13:23:03 2022 +0200
Revert change from SYS_RandomInt() SYS_RandomLong()
The communication between pcscd and libpcsclite uses 32-bits variables
in the exchanged structures:
uint32_t hContext;
int32_t hCard;
If we want to use 64-bits variables we need to also change the
pcscd-libpcsclite communication protocol and upgrade
PROTOCOL_VERSION_MAJOR.
This would break many working configurations using flatpak for example.
https://ludovicrousseau.blogspot.com/2022/02/accessing-smart-cards-from-inside.html
src/readerfactory.c | 4 ++--
src/sys_generic.h | 2 +-
src/sys_unix.c | 16 ++++++++--------
src/winscard.c | 2 +-
4 files changed, 12 insertions(+), 12 deletions(-)
commit 8d60ec131318e97fe8fb2e8dec4bf1d8286e3407
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Sun May 22 13:01:53 2022 +0200
Handle getrandom() return value
Fix:
sys_unix.c:110:15: error: ignoring return value of 'getrandom' declared with attribute 'warn_unused_result' [-Werror=unused-result]
110 | (void)getrandom(c, sizeof c, 0);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
src/sys_unix.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
commit 2c3d3bfd3793334aa688d565343e9fab1796229e
Author: Nikolaos Chatzikonstantinou <nchatz314@gmail.com>
Date: Mon May 16 11:01:55 2022 +0900
Change random number generator
Four fixes are applied in this patch:
1) The `SYS_RandomInt()` function is renamed to `SYS_RandomLong()`,
and its return type is now `long`. It no longer takes a range as
parameters for its random number generation; it always uses the full
range.
2) The `getrandom()` syscall is added to configure.ac as a requested
function.
3) The generator for `SYS_RandomLong()` is changed. The previous
generator was from the `rand()` function, but now it uses
`getrandom()` when available and otherwise `lrand48()`, from the POSIX
API.
4) The seeding of the generator is via `SYS_InitRandom()`. It is
modified accordingly to seed the new generator.
Addresses Ref #9
"Improve SYS_RandomInt()"
https://salsa.debian.org/rousseau/PCSC/-/issues/9
configure.ac | 2 +-
src/readerfactory.c | 4 ++--
src/sys_generic.h | 2 +-
src/sys_unix.c | 46 ++++++++++++++++++++++++++++++++--------------
src/winscard.c | 2 +-
5 files changed, 37 insertions(+), 19 deletions(-)
commit 615160ff2f1e6f0f0ee324f7442b0068552d0068
Author: Maksim Ivanov <emaxx@chromium.org>
Date: Wed May 18 21:38:13 2022 +0200
Fix shutdown memory leak of sReadersContexts
RFCleanupReaders() should always free memory of sReadersContexts
(allocated in RFAllocateReaderSpace()), not only when the reader was
active.
This was only a minor, shutdown-only, issue.
src/readerfactory.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
commit e1a0103c0e1e643dd8680610c33da5849c76ce4c (debug/master)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Fri May 13 13:45:44 2022 +0200
github actions: use --enable-strict
.github/workflows/build.yml | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
commit 5c45145d34b5e7382e0223477ff22de67ef97c77 (tag: 1.9.7)
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Fri May 13 13:10:29 2022 +0200
@ -19,7 +274,7 @@ Date: Fri May 13 13:08:31 2022 +0200
c.sh | 1 +
1 file changed, 1 insertion(+)
commit b3f795550713121eb12d0c5e5ee5c9ac7be37b13 (debug/master)
commit b3f795550713121eb12d0c5e5ee5c9ac7be37b13
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Fri May 13 12:53:52 2022 +0200
@ -31,7 +286,7 @@ Date: Fri May 13 12:53:52 2022 +0200
configure.ac | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
commit c2ca47deab2cc802b09dd509aca118f73f63b169 (zotac/master, origin/master, origin/HEAD, github/master)
commit c2ca47deab2cc802b09dd509aca118f73f63b169
Author: Ludovic Rousseau <ludovic.rousseau@free.fr>
Date: Thu May 12 21:43:10 2022 +0200

View File

@ -160,7 +160,7 @@ DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/src/PCSC/pcsclite.h.in AUTHORS COPYING ChangeLog \
INSTALL NEWS README TODO ar-lib compile config.guess \
config.sub depcomp install-sh ltmain.sh missing ylwrap
config.sub install-sh ltmain.sh missing ylwrap
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)

View File

@ -40,6 +40,9 @@
/* Define to 1 if you have the `getopt_long' function. */
#undef HAVE_GETOPT_LONG
/* Define to 1 if you have the `getrandom' function. */
#undef HAVE_GETRANDOM
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H

26
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.71 for pcsc-lite 1.9.7.
# Generated by GNU Autoconf 2.71 for pcsc-lite 1.9.8.
#
#
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
@ -618,8 +618,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='pcsc-lite'
PACKAGE_TARNAME='pcsc-lite'
PACKAGE_VERSION='1.9.7'
PACKAGE_STRING='pcsc-lite 1.9.7'
PACKAGE_VERSION='1.9.8'
PACKAGE_STRING='pcsc-lite 1.9.8'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
@ -1424,7 +1424,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures pcsc-lite 1.9.7 to adapt to many kinds of systems.
\`configure' configures pcsc-lite 1.9.8 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1495,7 +1495,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of pcsc-lite 1.9.7:";;
short | recursive ) echo "Configuration of pcsc-lite 1.9.8:";;
esac
cat <<\_ACEOF
@ -1649,7 +1649,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
pcsc-lite configure 1.9.7
pcsc-lite configure 1.9.8
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@ -2065,7 +2065,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by pcsc-lite $as_me 1.9.7, which was
It was created by pcsc-lite $as_me 1.9.8, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@ -3336,7 +3336,7 @@ fi
# Define the identity of the package.
PACKAGE='pcsc-lite'
VERSION='1.9.7'
VERSION='1.9.8'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@ -15395,6 +15395,12 @@ if test "x$ac_cv_func_vsnprintf" = xyes
then :
printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
fi
ac_fn_c_check_func "$LINENO" "getrandom" "ac_cv_func_getrandom"
if test "x$ac_cv_func_getrandom" = xyes
then :
printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h
fi
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
@ -17236,7 +17242,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by pcsc-lite $as_me 1.9.7, which was
This file was extended by pcsc-lite $as_me 1.9.8, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@ -17304,7 +17310,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
pcsc-lite config.status 1.9.7
pcsc-lite config.status 1.9.8
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"

View File

@ -3,7 +3,7 @@
AC_PREREQ([2.69])
AC_INIT([pcsc-lite],[1.9.7])
AC_INIT([pcsc-lite],[1.9.8])
AC_CONFIG_SRCDIR(src/pcscdaemon.c)
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)
AC_CONFIG_HEADERS([config.h])
@ -109,7 +109,7 @@ AC_STRUCT_DIRENT_D_TYPE
AC_FUNC_ERROR_AT_LINE
AC_FUNC_STAT
AC_FUNC_VPRINTF
AC_CHECK_FUNCS(getopt_long nanosleep strerror vsnprintf)
AC_CHECK_FUNCS(getopt_long nanosleep strerror vsnprintf getrandom)
AC_FUNC_ALLOCA
# C Compiler features

View File

@ -129,6 +129,7 @@ static LONG HPAddHotPluggable(struct libusb_device *dev,
struct _driverTracker *driver,
struct _driverTracker *classdriver);
static LONG HPRemoveHotPluggable(int reader_index);
static void HPCleanupHotPluggable(int reader_index);
static LONG HPReadBundleValues(void)
{
@ -212,7 +213,7 @@ static LONG HPReadBundleValues(void)
if (rv)
CFBundleName = NULL;
else
CFBundleName = strdup(list_get_at(values, 0));
CFBundleName = list_get_at(values, 0);
/* while we find a nth ifdVendorID in Info.plist */
for (alias=0; alias<list_size(manuIDs); alias++)
@ -232,7 +233,8 @@ static LONG HPReadBundleValues(void)
driverTracker[listCount].bundleName = strdup(currFP->d_name);
driverTracker[listCount].libraryPath = strdup(fullLibPath);
driverTracker[listCount].ifdCapabilities = ifdCapabilities;
driverTracker[listCount].CFBundleName = CFBundleName;
driverTracker[listCount].CFBundleName =
CFBundleName ? strdup(CFBundleName) : NULL;
#ifdef DEBUG_HOTPLUG
Log2(PCSC_LOG_INFO, "Found driver for: %s",
@ -443,10 +445,19 @@ static void HPRescanUsbBus(void)
HPRemoveHotPluggable(i);
}
/* free the libusb allocated list & devices */
libusb_free_device_list(devs, 1);
if (AraKiriHotPlug)
{
int retval;
for (i=0; i<PCSCLITE_MAX_READERS_CONTEXTS; i++)
{
if (readerTracker[i].fullName != NULL)
HPCleanupHotPluggable(i);
}
for (i=0; i<driverSize; i++)
{
/* free strings allocated by strdup() */
@ -460,9 +471,6 @@ static void HPRescanUsbBus(void)
Log1(PCSC_LOG_INFO, "Hotplug stopped");
pthread_exit(&retval);
}
/* free the libusb allocated list & devices */
libusb_free_device_list(devs, 1);
}
static void * HPEstablishUSBNotifications(int pipefd[2])
@ -549,6 +557,7 @@ LONG HPSearchHotPluggables(void)
{
int i;
AraKiriHotPlug = FALSE;
for (i=0; i<PCSCLITE_MAX_READERS_CONTEXTS; i++)
{
readerTracker[i].status = READER_ABSENT;
@ -769,16 +778,21 @@ static LONG HPRemoveHotPluggable(int reader_index)
RFRemoveReader(readerTracker[reader_index].fullName,
PCSCLITE_HP_BASE_PORT + reader_index, REMOVE_READER_FLAG_REMOVED);
free(readerTracker[reader_index].fullName);
readerTracker[reader_index].status = READER_ABSENT;
readerTracker[reader_index].bus_device[0] = '\0';
readerTracker[reader_index].fullName = NULL;
HPCleanupHotPluggable(reader_index);
pthread_mutex_unlock(&usbNotifierMutex);
return 1;
} /* End of function */
static void HPCleanupHotPluggable(int reader_index)
{
free(readerTracker[reader_index].fullName);
readerTracker[reader_index].status = READER_ABSENT;
readerTracker[reader_index].bus_device[0] = '\0';
readerTracker[reader_index].fullName = NULL;
} /* End of function */
/**
* Sets up callbacks for device hotplug events.
*/

View File

@ -1186,7 +1186,7 @@ SCARDHANDLE RFCreateReaderHandle(READER_CONTEXT * rContext)
/* FIXME: THIS IS NOT STRONG ENOUGH: A 128-bit token should be
* generated. The client and server would associate token and hCard
* for authentication. */
randHandle = SYS_RandomInt(0, -1);
randHandle = SYS_RandomInt();
/* do we already use this hCard somewhere? */
ret = RFReaderInfoById(randHandle, &dummy_reader);
@ -1396,11 +1396,10 @@ void RFCleanupReaders(void)
if (rv != SCARD_S_SUCCESS)
Log2(PCSC_LOG_ERROR, "RFRemoveReader error: 0x%08lX", rv);
free(sReadersContexts[i]);
sReadersContexts[i] = NULL;
}
free(sReadersContexts[i]);
sReadersContexts[i] = NULL;
}
#ifdef USE_SERIAL

View File

@ -2,6 +2,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/src/PCSC -I$(top_builddir)/src/PCSC
lib_LTLIBRARIES = libpcscspy.la
dist_bin_SCRIPTS = pcsc-spy
dist_doc_DATA = install_spy.sh uninstall_spy.sh
libpcscspy_la_SOURCES = \
libpcscspy.c
@ -16,5 +17,5 @@ pcsc-spy.1: pcsc-spy.pod
$(srcdir)/pcsc-spy.pod > $@
endif
EXTRA_DIST = install_spy.sh uninstall_spy.sh pcsc-spy.pod
EXTRA_DIST = pcsc-spy.pod
CLEANFILES = pcsc-spy.1

View File

@ -15,6 +15,7 @@
@SET_MAKE@
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
@ -98,7 +99,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
DIST_COMMON = $(srcdir)/Makefile.am $(dist_bin_SCRIPTS) \
$(am__DIST_COMMON)
$(dist_doc_DATA) $(am__DIST_COMMON)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
@ -131,7 +132,7 @@ am__uninstall_files_from_dir = { \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(man1dir)"
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"
LTLIBRARIES = $(lib_LTLIBRARIES)
libpcscspy_la_LIBADD =
am_libpcscspy_la_OBJECTS = libpcscspy.lo
@ -186,6 +187,7 @@ am__can_run_installinfo = \
man1dir = $(mandir)/man1
NROFF = nroff
MANS = $(man_MANS)
DATA = $(dist_doc_DATA)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
@ -362,11 +364,12 @@ usbdropdir = @usbdropdir@
AM_CPPFLAGS = -I$(top_srcdir)/src/PCSC -I$(top_builddir)/src/PCSC
lib_LTLIBRARIES = libpcscspy.la
dist_bin_SCRIPTS = pcsc-spy
dist_doc_DATA = install_spy.sh uninstall_spy.sh
libpcscspy_la_SOURCES = \
libpcscspy.c
@ENABLE_DOC_TRUE@man_MANS = pcsc-spy.1
EXTRA_DIST = install_spy.sh uninstall_spy.sh pcsc-spy.pod
EXTRA_DIST = pcsc-spy.pod
CLEANFILES = pcsc-spy.1
all: all-am
@ -558,6 +561,27 @@ uninstall-man1:
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
install-dist_docDATA: $(dist_doc_DATA)
@$(NORMAL_INSTALL)
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
$(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
done | $(am__base_list) | \
while read files; do \
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
done
uninstall-dist_docDATA:
@$(NORMAL_UNINSTALL)
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
ID: $(am__tagged_files)
$(am__define_uniq_tagged_files); mkid -fID $$unique
@ -645,9 +669,9 @@ distdir-am: $(DISTFILES)
done
check-am: all-am
check: check-am
all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(MANS)
all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(MANS) $(DATA)
installdirs:
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
@ -704,7 +728,7 @@ info: info-am
info-am:
install-data-am: install-man
install-data-am: install-dist_docDATA install-man
install-dvi: install-dvi-am
@ -750,8 +774,8 @@ ps: ps-am
ps-am:
uninstall-am: uninstall-dist_binSCRIPTS uninstall-libLTLIBRARIES \
uninstall-man
uninstall-am: uninstall-dist_binSCRIPTS uninstall-dist_docDATA \
uninstall-libLTLIBRARIES uninstall-man
uninstall-man: uninstall-man1
@ -762,16 +786,17 @@ uninstall-man: uninstall-man1
ctags ctags-am distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-dist_binSCRIPTS install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am \
install-data-am install-dist_binSCRIPTS install-dist_docDATA \
install-dvi install-dvi-am install-exec install-exec-am \
install-html install-html-am install-info install-info-am \
install-libLTLIBRARIES install-man install-man1 install-pdf \
install-pdf-am install-ps install-ps-am install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags tags-am uninstall uninstall-am uninstall-dist_binSCRIPTS \
uninstall-libLTLIBRARIES uninstall-man uninstall-man1
uninstall-dist_docDATA uninstall-libLTLIBRARIES uninstall-man \
uninstall-man1
.PRECIOUS: Makefile

View File

@ -45,7 +45,7 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
int SYS_USleep(int);
int SYS_RandomInt(int, int);
int SYS_RandomInt(void);
void SYS_InitRandom(void);

View File

@ -39,11 +39,18 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "config.h"
#include <sys/time.h>
#include <limits.h>
#include <stdlib.h>
#include <time.h>
#ifdef HAVE_GETRANDOM
#include <sys/random.h>
#endif /* HAVE_GETRANDOM */
#include <errno.h>
#include <string.h>
#include "misc.h"
#include "sys_generic.h"
#include "PCSC/debuglog.h"
/**
* @brief Makes the current process sleep for some seconds.
@ -87,22 +94,40 @@ INTERNAL int SYS_USleep(int iTimeVal)
/**
* Generate a pseudo random number
*
* @param[in] fStart minimal value
* @param[in] fEnd maximal value or -1 for a full range
* @return a non-negative random number
*
* @return a random number between fStart and fEnd
* @remark the range is at least up to `2^31`.
* @remark this is a CSPRNG when `getrandom()` is available, LCG otherwise.
* @warning SYS_InitRandom() should be called (once) before using this function.
* @warning not thread safe when system lacks `getrandom()` syscall.
* @warning not cryptographically secure when system lacks `getrandom()` syscall.
* @warning if interrupted by a signal, this function may return 0.
*/
INTERNAL int SYS_RandomInt(int fStart, int fEnd)
INTERNAL int SYS_RandomInt(void)
{
int iRandNum = 0;
#ifdef HAVE_GETRANDOM
unsigned int ui = 0;
unsigned char c[sizeof ui] = {0};
size_t i;
ssize_t ret;
if (-1 == fEnd)
/* full int range */
iRandNum = rand();
else
iRandNum = ((rand()+0.0)/RAND_MAX * (fEnd - fStart)) + fStart;
return iRandNum;
ret = getrandom(c, sizeof c, 0);
if (-1 == ret)
{
Log2(PCSC_LOG_ERROR, "getrandom() failed: %s", strerror(errno));
return lrand48();
}
// this loop avoids trap representations that may occur in the naive solution
for(i = 0; i < sizeof ui; i++) {
ui <<= CHAR_BIT;
ui |= c[i];
}
// the casts are for the sake of clarity
return (int)(ui & (unsigned int)INT_MAX);
#else
int r = lrand48(); // this is not thread-safe
return r;
#endif /* HAVE_GETRANDOM */
}
/**
@ -110,6 +135,7 @@ INTERNAL int SYS_RandomInt(int fStart, int fEnd)
*/
INTERNAL void SYS_InitRandom(void)
{
#ifndef HAVE_GETRANDOM
struct timeval tv;
struct timezone tz;
long myseed = 0;
@ -124,6 +150,7 @@ INTERNAL void SYS_InitRandom(void)
myseed = (long) time(NULL);
}
srand(myseed);
srand48(myseed);
#endif /* HAVE_GETRANDOM */
}

View File

@ -210,7 +210,7 @@ LONG SCardEstablishContext(DWORD dwScope, /*@unused@*/ LPCVOID pvReserved1,
* identified by clients and distinguished from others
*/
*phContext = SYS_RandomInt(0, -1);
*phContext = SYS_RandomInt();
Log2(PCSC_LOG_DEBUG, "Establishing Context: 0x%lX", *phContext);

View File

@ -498,6 +498,13 @@ end:
return rv;
}
#ifdef DESTRUCTOR
DESTRUCTOR static void destructor(void)
{
list_destroy(&contextMapList);
}
#endif
/**
* @brief Creates a communication context to the PC/SC Resource
* Manager.
@ -547,9 +554,8 @@ static LONG SCardEstablishContextTH(DWORD dwScope,
{
int lrv;
/* NOTE: The list will never be freed (No API call exists to
* "close all contexts".
* Applications which load and unload the library will leak
/* NOTE: The list will be freed only if DESTRUCTOR is defined.
* Applications which load and unload the library may leak
* the list's internal structures. */
lrv = list_init(&contextMapList);
if (lrv < 0)
@ -2233,8 +2239,7 @@ LONG SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer,
return SCARD_E_INVALID_HANDLE;
}
if ((cbSendLength > MAX_BUFFER_SIZE_EXTENDED)
|| (cbRecvLength > MAX_BUFFER_SIZE_EXTENDED))
if (cbSendLength > MAX_BUFFER_SIZE_EXTENDED)
{
rv = SCARD_E_INSUFFICIENT_BUFFER;
goto end;
@ -2689,8 +2694,7 @@ retry:
return SCARD_E_INVALID_HANDLE;
}
if ((cbSendLength > MAX_BUFFER_SIZE_EXTENDED)
|| (*pcbRecvLength > MAX_BUFFER_SIZE_EXTENDED))
if (cbSendLength > MAX_BUFFER_SIZE_EXTENDED)
{
rv = SCARD_E_INSUFFICIENT_BUFFER;
goto end;

View File

@ -658,8 +658,7 @@ static void * ContextThread(LPVOID newContext)
goto exit;
/* avoids buffer overflow */
if ((trStr.pcbRecvLength > sizeof(pbRecvBuffer))
|| (trStr.cbSendLength > sizeof(pbSendBuffer)))
if (trStr.cbSendLength > sizeof(pbSendBuffer))
goto buffer_overflow;
/* read sent buffer */
@ -713,8 +712,7 @@ static void * ContextThread(LPVOID newContext)
goto exit;
/* avoids buffer overflow */
if ((ctStr.cbRecvLength > sizeof(pbRecvBuffer))
|| (ctStr.cbSendLength > sizeof(pbSendBuffer)))
if (ctStr.cbSendLength > sizeof(pbSendBuffer))
{
goto buffer_overflow;
}