From: Alon Levy <alevy@redhat.com>
To: Jes Sorensen <Jes.Sorensen@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 4/7] libcacard: initial commit
Date: Thu, 17 Mar 2011 15:36:07 +0200 [thread overview]
Message-ID: <20110317133607.GV7413@playa.tlv.redhat.com> (raw)
In-Reply-To: <4D7E3236.8050507@redhat.com>
On Mon, Mar 14, 2011 at 04:20:22PM +0100, Jes Sorensen wrote:
> On 02/23/11 12:20, Alon Levy wrote:
> > +/* private data for PKI applets */
> > +typedef struct CACPKIAppletDataStruct {
> > + unsigned char *cert;
> > + int cert_len;
> > + unsigned char *cert_buffer;
> > + int cert_buffer_len;
> > + unsigned char *sign_buffer;
> > + int sign_buffer_len;
> > + VCardKey *key;
> > +} CACPKIAppletData;
>
> Grouping the ints together would allow for better struct padding.
>
> > +/*
> > + * resest the inter call state between applet selects
> > + */
>
> I presume it meant to say 'resets' ?
>
> > diff --git a/libcacard/event.c b/libcacard/event.c
> > new file mode 100644
> > index 0000000..20276a0
> > --- /dev/null
> > +++ b/libcacard/event.c
> > @@ -0,0 +1,112 @@
> > +/*
> > + *
> > + */
>
> This comment is really spot on :)
>
> > diff --git a/libcacard/mutex.h b/libcacard/mutex.h
> > new file mode 100644
> > index 0000000..cb46aa7
> > --- /dev/null
> > +++ b/libcacard/mutex.h
>
> UH OH!
>
> > +/*
> > + * This header file provides a way of mapping windows and linux thread calls
> > + * to a set of macros. Ideally this would be shared by whatever subsystem we
> > + * link with.
> > + */
> > +
> > +#ifndef _H_MUTEX
> > +#define _H_MUTEX
> > +#ifdef _WIN32
> > +#include <windows.h>
> > +typedef CRITICAL_SECTION mutex_t;
> > +#define MUTEX_INIT(mutex) InitializeCriticalSection(&mutex)
> > +#define MUTEX_LOCK(mutex) EnterCriticalSection(&mutex)
> > +#define MUTEX_UNLOCK(mutex) LeaveCriticalSection(&mutex)
> > +typedef CONDITION_VARIABLE condition_t;
> > +#define CONDITION_INIT(cond) InitializeConditionVariable(&cond)
> > +#define CONDITION_WAIT(cond, mutex) \
> > + SleepConditionVariableCS(&cond, &mutex, INFINTE)
> > +#define CONDITION_NOTIFY(cond) WakeConditionVariable(&cond)
> > +typedef uint32_t thread_t;
> > +typedef HANDLE thread_status_t;
> > +#define THREAD_CREATE(tid, func, arg) \
> > + CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, &tid)
> > +#define THREAD_SUCCESS(status) ((status) != NULL)
> > +#else
> > +#include <pthread.h>
> > +typedef pthread_mutex_t mutex_t;
> > +#define MUTEX_INIT(mutex) pthread_mutex_init(&mutex, NULL)
> > +#define MUTEX_LOCK(mutex) pthread_mutex_lock(&mutex)
> > +#define MUTEX_UNLOCK(mutex) pthread_mutex_unlock(&mutex)
> > +typedef pthread_cond_t condition_t;
> > +#define CONDITION_INIT(cond) pthread_cond_init(&cond, NULL)
> > +#define CONDITION_WAIT(cond, mutex) pthread_cond_wait(&cond, &mutex)
> > +#define CONDITION_NOTIFY(cond) pthread_cond_signal(&cond)
> > +typedef pthread_t thread_t;
> > +typedef int thread_status_t;
> > +#define THREAD_CREATE(tid, func, arg) pthread_create(&tid, NULL, func, arg)
> > +#define THREAD_SUCCESS(status) ((status) == 0)
> > +#endif
>
> NACK! This is no good, the code needs to be fixed to use QemuMutex from
> qemu-thread.h
>
> In addition, a thing like a mutex feature should be in a separate patch,
> not part of the code that uses it. However QEMU already has a mutex set
> so this part needs to go.
>
> > +static VCardAppletPrivate *
> > +passthru_new_applet_private(VReader *reader)
> > +{
> > + VCardAppletPrivate *applet_private = NULL;
> > + LONG rv;
> > +
> > + applet_private = (VCardAppletPrivate *)malloc(sizeof(VCardAppletPrivate));
>
> qemu_malloc()
>
> > + if (applet_private == NULL) {
> > + goto fail;
> > + }
>
> and it never fails.
>
> > + if (new_reader_list_len != reader_list_len) {
> > + /* update the list */
> > + new_reader_list = (char *)malloc(new_reader_list_len);
>
> qemu_malloc() again.
>
> Please grep through the full patch set and make sure you do not have any
> direct calls to malloc() or free().
>
> > + /* try resetting the pcsc_lite subsystem */
> > + SCardReleaseContext(global_context);
> > + global_context = 0; /* should close it */
> > + printf("***** SCard failure %x\n", rv);
>
> error_report()
>
> > diff --git a/libcacard/vcard_emul_nss.c b/libcacard/vcard_emul_nss.c
> > new file mode 100644
> > index 0000000..e4f0b73
> > --- /dev/null
> > +++ b/libcacard/vcard_emul_nss.c
> [snip]
> > +struct VReaderEmulStruct {
> > + PK11SlotInfo *slot;
> > + VCardEmulType default_type;
> > + char *type_params;
> > + PRBool present;
>
> What is PRBool and where does it come from?
>
> > +void
> > +vcard_emul_reset(VCard *card, VCardPower power)
> > +{
> > + PK11SlotInfo *slot;
> > +
> > + if (!nss_emul_init) {
> > + return;
> > + }
> > +
> > + /* if we reset the card (either power on or power off), we loose our login
> > + * state */
> > + /* TODO: we may also need to send insertion/removal events? */
> > + slot = vcard_emul_card_get_slot(card);
> > + (void)PK11_Logout(slot);
>
> We don't (void) cast calls like that in QEMU.
>
> > +/*
> > + * NSS needs the app to supply a password prompt. In our case the only time
> > + * the password is supplied is as part of the Login APDU. The actual password
> > + * is passed in the pw_arg in that case. In all other cases pw_arg should be
> > + * NULL.
> > + */
> > +static char *
> > +vcard_emul_get_password(PK11SlotInfo *slot, PRBool retries, void *pw_arg)
> > +{
> > + /* if it didn't work the first time, don't keep trying */
> > + if (retries) {
> > + return NULL;
> > + }
> > + /* we are looking up a password when we don't have one in hand */
> > + if (pw_arg == NULL) {
> > + return NULL;
> > + }
> > + /* TODO: we really should verify that were are using the right slot */
> > + return PORT_Strdup(pw_arg);
>
> PORT_Strdup???
>
> > +static const char *
> > +find_token(const char *str, char token, char token_end)
> > +{
> > + /* just do the blind simple thing */
> > + for (; *str; str++) {
> > + if ((*str == token) || (*str == token_end)) {
> > + break;
> > + }
> > + }
> > + return str;
> > +}
>
> What is wrong with strpbrk(3) ?
>
> > +static const char *
> > +strip(const char *str)
> > +{
> > + for (; *str; str++) {
> > + if ((*str != ' ') && (*str != '\n') &&
> > + (*str != '\t') && (*str != '\r')) {
> > + break;
>
> !isspace() ?
>
> > +static const char *
> > +find_blank(const char *str)
> > +{
> > + for (; *str; str++) {
> > + if ((*str == ' ') || (*str == '\n') ||
> > + (*str == '\t') || (*str == '\r')) {
> > +
> > + break;
> > + }
> > + }
> > + return str;
> > +}
>
> strpbrk(3) ?
>
> > diff --git a/libcacard/vcardt.h b/libcacard/vcardt.h
> > new file mode 100644
> > index 0000000..8bca16e
> > --- /dev/null
> > +++ b/libcacard/vcardt.h
> > @@ -0,0 +1,66 @@
> > +/*
> > + *
> > + */
> > +#ifndef VCARDT_H
> > +#define VCARDT_H 1
> > +
> > +/*
> > + * these should come from some common spice header file
> > + */
> > +#include <assert.h>
> > +#ifndef ASSERT
> > +#define ASSERT assert
> > +#endif
> > +#ifndef MIN
> > +#define MIN(x, y) ((x) > (y) ? (y) : (x))
> > +#define MAX(x, y) ((x) > (y) ? (x) : (y))
> > +#endif
>
> QEMU uses assert(), not ASSERT(). Please fix.
>
> > diff --git a/libcacard/vreader.c b/libcacard/vreader.c
> > new file mode 100644
> > index 0000000..f4a0c60
> > --- /dev/null
> > +++ b/libcacard/vreader.c
> > @@ -0,0 +1,526 @@
> > +/*
> > + * emulate the reader
> > + */
>
> What is the license of this file?
>
> > +#include "vcard.h"
> > +#include "vcard_emul.h"
> > +#include "card_7816.h"
> > +#include "vreader.h"
> > +#include "vevent.h"
> > +
> > +/*
> > + * System includes
> > + */
> > +#include <stdlib.h>
> > +#include <string.h>
> > +
> > +/*
> > + * spice includes
> > + */
> > +#include "mutex.h"
>
> No no no
>
> > diff --git a/libcacard/vreadert.h b/libcacard/vreadert.h
> > new file mode 100644
> > index 0000000..51670a3
> > --- /dev/null
> > +++ b/libcacard/vreadert.h
> > @@ -0,0 +1,23 @@
> > +/*
> > + *
> > + */
>
> Spot on!
>
> General comment, this patch is *way* too big. It really should be a
> series of patches adding features one after another. The testing for
> cards ought to be separate for example.
>
I've got everything done except the split. Is there any value in sending
it without doing the split? could you give me some hints. As I mentioned
off line, this code was not written by me, which makes this harder (but
not impossible)
Alon
> Jes
>
next prev parent reply other threads:[~2011-03-17 13:36 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-23 11:20 [Qemu-devel] [PATCH v20 0/7] usb-ccid Alon Levy
2011-02-23 11:20 ` [Qemu-devel] [PATCH 1/7] usb-ccid: add CCID bus Alon Levy
2011-03-14 13:54 ` Jes Sorensen
2011-03-14 14:07 ` Daniel P. Berrange
2011-03-14 14:12 ` Anthony Liguori
2011-03-16 9:15 ` Alon Levy
2011-03-16 9:26 ` Jes Sorensen
2011-02-23 11:20 ` [Qemu-devel] [PATCH 2/7] introduce libcacard/vscard_common.h Alon Levy
2011-03-14 14:01 ` Jes Sorensen
2011-03-14 14:51 ` Alon Levy
2011-03-14 14:52 ` Alon Levy
2011-03-14 15:50 ` Jes Sorensen
2011-03-14 16:31 ` Alon Levy
2011-02-23 11:20 ` [Qemu-devel] [PATCH 3/7] ccid: add passthru card device Alon Levy
2011-03-14 14:04 ` Jes Sorensen
2011-03-14 14:53 ` Alon Levy
2011-03-14 15:51 ` Jes Sorensen
2011-02-23 11:20 ` [Qemu-devel] [PATCH 4/7] libcacard: initial commit Alon Levy
2011-03-14 15:20 ` Jes Sorensen
2011-03-14 16:40 ` Alon Levy
2011-03-15 12:42 ` Jes Sorensen
2011-03-15 13:14 ` Alon Levy
2011-03-15 13:40 ` Jes Sorensen
2011-03-15 14:09 ` Alon Levy
2011-03-15 13:45 ` Anthony Liguori
2011-03-15 14:23 ` Alon Levy
2011-03-16 8:23 ` Jes Sorensen
2011-03-16 8:40 ` Alon Levy
2011-03-16 8:42 ` Jes Sorensen
2011-03-15 13:44 ` Anthony Liguori
2011-03-15 14:25 ` Alon Levy
2011-03-15 14:51 ` Jes Sorensen
2011-03-15 14:56 ` Anthony Liguori
2011-03-15 14:59 ` Jes Sorensen
2011-03-15 15:14 ` Alon Levy
2011-03-16 8:26 ` Jes Sorensen
2011-03-15 14:55 ` Anthony Liguori
2011-03-17 13:36 ` Alon Levy [this message]
2011-02-23 11:20 ` [Qemu-devel] [PATCH 5/7] ccid: add ccid-card-emulated device Alon Levy
2011-03-14 15:41 ` Jes Sorensen
2011-03-14 16:44 ` Alon Levy
2011-03-14 17:11 ` Jes Sorensen
2011-03-17 10:54 ` Alon Levy
2011-03-17 10:59 ` Alon Levy
2011-03-17 14:25 ` Jes Sorensen
2011-02-23 11:20 ` [Qemu-devel] [PATCH 6/7] ccid: add docs Alon Levy
2011-03-14 15:41 ` Jes Sorensen
2011-02-23 11:20 ` [Qemu-devel] [PATCH 7/7] ccid: configure: improve --enable-smartcard flags Alon Levy
2011-03-14 15:44 ` Jes Sorensen
2011-03-06 10:50 ` [Qemu-devel] [PATCH v20 0/7] usb-ccid Alon Levy
-- strict thread matches above, loose matches on Subject: below --
2011-02-07 16:34 [Qemu-devel] [PATCH 0/7] usb-ccid (v19) Alon Levy
2011-02-07 16:35 ` [Qemu-devel] [PATCH 4/7] libcacard: initial commit Alon Levy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110317133607.GV7413@playa.tlv.redhat.com \
--to=alevy@redhat.com \
--cc=Jes.Sorensen@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).