Thanks; that made it worse, though, and it doesn't build:

.\apps\s_cb.c(731) : error C2027: use of undefined type 'in6_addr'
        .\apps\s_cb.c(731) : see declaration of 'in6_addr'
(which somehow reminds me of a bug fixed a couple versions ago)

But I do think you are on to the underlying problem.  I guess
opensslconf.h is modified (and others?!), as part of the configure
operation, but those changes are not effectively reflected in the
include/openssl because those are copies on windows, rather than
symlinks as on unix.  Maybe a postconfig step should be added to update
those header files in that platform's config script.

-dave

> -----Original Message-----
> From: Richard Levitte - VMS Whacker via RT [mailto:r...@openssl.org] 
> Sent: Wednesday, May 18, 2011 6:48 AM
> To: d...@ziggurat29.com
> Cc: openssl-dev@openssl.org
> Subject: Re: [openssl.org #2519] crash when using 
> newly-defined ASN1_SEQUENCE macros in Windows with elements 
> that are also newly-defined SEQUENCEs... 
> 
> 
> I suggest you remove all files in include/openssl/, then rebuild.
> 
> The reason for your problem is that the distribution contains a bunch
> of symlinks, like this:
> 
>   lrwxrwxrwx openssl/openssl      0 2011-02-08 18:13 
> openssl-1.0.0d/include/openssl/opensslconf.h -> 
> ../../crypto/opensslconf.h
> 
> On Unix, that works with no problems.  On environments that don't
> implement symlinks in a similar way, there may be problems, because
> it's not certain they will be recreated.  Removing include/openssl/*.h
> makes sure these will be.
> 
> Cheers,
> Richard
> 
> In message 
> <rt-3.4.5-52058-1305706213-1353.2519-2...@openssl.org> on 
> Wed, 18 May 2011 10:10:13 +0200 (CEST), "dave via RT" 
> <r...@openssl.org> said:
> 
> > configuration:
> > *  openssl 1.0.0.d
> > *  Win32, VC6
> > *  static library
> >  
> > (I don't know if the problem is confined to that 
> configuration, but it's
> > what I'm using).
> >  
> > There appear to be two versions of opensslconf.h that are 
> generated from
> > the Configure script.  One is placed in ./include/openssl, 
> and one is
> > placed in ./crypto.  However, they are different; in particular with
> > respect to the definition of OPENSSL_EXPORT_VAR_AS_FUNCTION.  In the
> > 'public' one placed in ./include/openssl, this is #undef'ed 
> at line 79.
> > In the 'internal' one placed in ./crypto, this is #undef'ed but then
> > immediately #defined'ed at lines 84..85
> >  
> > The result is that, if the caller defines their own 
> ASN1_SEQUENCE, and
> > uses that as a member of another ASN1_SEQUENCE, then the 
> resulting code
> > for the _new() method will crash in tasn_new.c:51.
> >  
> > The reason is that the internal 'item' member of the template record
> > points to the template structure of the member sequence 
> directly, rather
> > than to a function which returns the template of that 
> member sequence.
> >  
> > Example of failing code:
> >  
> > //begin failing code=============
> >  
> > //defs==========
> >  
> > typedef struct {
> >  ASN1_OBJECT* type;
> > } INSIDE_SEQ;
> >  
> > ASN1_SEQUENCE(INSIDE_SEQ) = {
> >  ASN1_SIMPLE(INSIDE_SEQ, type, ASN1_OBJECT),
> > } ASN1_SEQUENCE_END(INSIDE_SEQ)
> > DECLARE_ASN1_FUNCTIONS(INSIDE_SEQ)
> > IMPLEMENT_ASN1_FUNCTIONS(INSIDE_SEQ)
> >  
> > 
> > typedef struct {
> >  ASN1_OBJECT* type;
> >  INSIDE_SEQ* member;
> > } OUTSIDE_SEQ;
> >  
> > ASN1_SEQUENCE(OUTSIDE_SEQ) = {
> >     ASN1_SIMPLE(OUTSIDE_SEQ, type, ASN1_OBJECT),
> >     ASN1_SIMPLE(OUTSIDE_SEQ, member, INSIDE_SEQ)
> > } ASN1_SEQUENCE_END(OUTSIDE_SEQ)
> > DECLARE_ASN1_FUNCTIONS(OUTSIDE_SEQ)
> > IMPLEMENT_ASN1_FUNCTIONS(OUTSIDE_SEQ)
> > 
> >  
> > //code==========
> > ....
> > OUTSIDE_SEQ* pos = OUTSIDE_SEQ_new();    //crashes with 
> access vioation
> > ...
> >  
> >  
> > //end failing code====================
> >  
> >  
> > Complications:
> > *  since opensslconf.h #undef's the controlling constant, it isn't
> > possible to modify the behaviour with compiler defs, etc.
> > *  I didn't want to tamper with the generated opensslconf.h 
> in case that
> > made things worse in an unexpected way.
> >  
> > I have made example code work by 'fixing up' the template record
> > definition manually, first by defining a function:
> >  
> > const ASN1_ITEM* INSIDE_SEQ_it_haquery(void)
> > {
> > return &INSIDE_SEQ_it;
> > } 
> >  
> > and then changing the 'const' data segment (where the 
> template defs are
> > placed) to be writeable,
> >  
> > and then fixing up the template record this way:
> >  
> >  {
> >  ASN1_TEMPLATE* p = (ASN1_TEMPLATE*)&OUTSIDE_SEQ_seq_tt[1];
> >  p->item = (void*) INSIDE_SEQ_it_haquery;
> >  }
> > 
> > After dong that, then the call to:
> >  
> > OUTSIDE_SEQ* pos = OUTSIDE_SEQ_new();
> >  
> > will work as expected.  Of course, this is not really a good general
> > solution.
> >  
> >  
> > -dave
> > 
> 
> 
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to