AH! I see.  Sorry for my mis-interpretation.

That definitely is something that should be audited.  I see that
OCResource.cpp uses MAX_ADDR_STR_SIZE (note the lack of _CA), which
won't match unless a similar #ifdef is happening too.

What you point out is definitely a pretty nasty gotcha that needs
looking into closely.

On Thu, 2015-11-05 at 18:24 +0000, Light, John J wrote:
> Erich,
> 
> You describe a problem that was fixed.  I was referring to something else.
> 
> OCDevAddr and CAEndpoint_t are both defined thusly:
> 
>     typedef struct
>     {
>         CATransportAdapter_t    adapter;    // adapter type
>         CATransportFlags_t      flags;      // transport modifiers
>         uint16_t                port;       // for IP
>         char                    addr[MAX_ADDR_STR_SIZE_CA]; // address for all
>         uint32_t                interface;  // usually zero for default 
> interface
>     #if defined (ROUTING_GATEWAY) || defined (ROUTING_EP)
>         char                    routeData[MAX_ADDR_STR_SIZE_CA]; /**< 
> GatewayId:ClientId of
>                                                                     
> destination. **/
>     #endif
>     } CAEndpoint_t;
> 
> Notice that both addr and routeData are defined as MAX_ADDR_STR_SIZE_CA.  
> Since 40 is not long enough for the routeData, the author set 
> MAX_ADDR_STR_SIZE_CA as follows:
> 
>     #ifdef RA_ADAPTER
>     #define MAX_ADDR_STR_SIZE_CA (256)
>     #else
>     #define MAX_ADDR_STR_SIZE_CA (40)
>     #endif
> 
> So when RA_ADAPTER is defined, the host length will be wrong, possibly 
> causing future problems.  Without examining the code, I'm concerned that 
> MAX_ADDR_STR_SIZE_CA is used elsewhere as a general string length.
> 
> John
> 
>  
> -----Original Message-----
> From: Keane, Erich 
> Sent: Thursday, November 05, 2015 9:18 AM
> To: Light, John J
> Cc: junghyun.oh at samsung.com; jihun.ha at samsung.com; iotivity-dev at 
> lists.iotivity.org
> Subject: Re: [dev] Pre-defined length for the Host Info. is not long enough
> 
> This was actually fixed this one a while ago.  I believe there to be no large 
> problem.
> 
> What ended up happening is we were testing the length of the host address in 
> C++ BEFORE pulling the address apart.  I changed it to validate after (right 
> before the copy), and it ended up fixing the problem, since (like you said), 
> the actual values ARE less than 40 bytes long.
> 
> the "coaps://[fe...]:36238" was NEVER put into a buffer defined by 
> MAX_ADDR_STR_SIZE, it was taken in the std::string 'host' parameter to 
> OCResource's ctor.
> 
> I believe the cause was at one point we fixed a different issue by making the 
> .host() call return the fully qualified string, rather than just the address. 
>  The result was the previous assumption (that the host was a valid, 
> address-only component that could be immediately copied in) was made false.
> 
> You can see here:
> https://gerrit.iotivity.org/gerrit/#/c/2481/6/resource/src/OCResource.cpp 
> exactly what I mean.
> 
> On Thu, 2015-11-05 at 16:00 +0000, Light, John J wrote:
> > Jay,
> > 
> >  
> > 
> > Please provide more information about your issue.  I originally wrote 
> > the data structures you are talking about, and I am concerned there 
> > might be a larger problem now.
> > 
> >  
> > 
> > The host address field should only contain the address string itself.
> > The longest of these is a full IPv6 address:
> > ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff, which is 39 bytes long, plus
> > one for a terminating null.   What other information are you seeing in
> > the string?
> > 
> > You report seeing ?coaps://[fe80::a00:27ff:feaf:f911]:36238?, but that 
> > should never be put in a buffer defined by MAX_ADDR_STR_SIZE.  Can you 
> > say where that happened?
> > 
> > The string MAX_ADDR_STR_SIZE should only be used or the host field of 
> > an OCDevAddr or CAEndpoint_t.  I see it is now used for other fields, 
> > and with other sizes than 40.
> > 
> >  
> > 
> > This misuse will lead to larger problems in future.  It is an addition 
> > to the considerable technical debt we have on this project.
> > 
> >  
> > 
> > John Light
> > 
> > Intel OTC OIC Development
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> > From: iotivity-dev-bounces at lists.iotivity.org
> > [mailto:iotivity-dev-bounces at lists.iotivity.org] On Behalf Of ???
> > Sent: Wednesday, November 04, 2015 5:39 PM
> > To: ???; 'iotivity'
> > Subject: Re: [dev] Pre-defined length for the Host Info. is not long 
> > enough
> > 
> > 
> >  
> > 
> > Hi. Jay,
> > 
> >  
> > 
> > I also encountered the situation you described below, but I found that 
> > this problem has been already resolved in the master branch with a 
> > patchset, https://gerrit.iotivity.org/gerrit/#/c/2481/. Please look 
> > into it.
> > 
> >  
> > 
> > However, I don't know why this patch had not been merged into 
> > 1.0.0-dev branch. In the 1.0.0-dev branch which is 1.0 release branch, 
> > there is still the above problem. May be someone missed merging the 
> > patchset into the branch.
> > 
> >  
> > 
> > Thank you.
> > 
> >  
> > 
> > BR, Jihun Ha
> > 
> >  
> > 
> > ------- Original Message -------
> > 
> > Sender : ???<junghyun.oh at samsung.com> S5(??)/??/IoT Lab(S/W?? )/????
> > 
> > Date : 2015-11-04 17:24 (GMT+09:00)
> > 
> > Title : [dev] Pre-defined length for the Host Info. is not long enough
> > 
> >  
> > 
> > Hi all,
> > 
> >  
> > 
> > Currently, I?m trying to port the ?Secure? version of the IoTivity 
> > into an embedded device.
> > 
> > While I was tried to create a resource object of a remote resource 
> > from the Resource Client
> > 
> > using an API ?constructResourceObject?, I found that the Stack doesn?t 
> > allow the host infor.
> > 
> > of which length exceeds 40 bytes.
> > 
> > Actually the target Resource server was supporting IPv6 and using 
> > secure version of IoTivity,
> > 
> > the length of the host infor exceeds 40 bytes.
> > 
> > Here is the error log & the actual string of the host infor of the 
> > Resource Server..
> > 
> > ? Error Log
> > 
> > terminate called after throwing an instance of 'std::length_error'
> > what(): host address is too long.
> > 
> >  
> > 
> > ? Host infor.
> > 
> > coaps://[fe80::a00:27ff:feaf:f911]:36238
> > 
> >  
> > 
> > As you can notice the length of the host infor. is 41 bytes.(including 
> > ?\0? at the end).
> > 
> > Since the variables defined for the MAX length of the host infor. are 
> > exists both in the RI layer & CA layer
> > 
> > & used by lots of locations inside the both layers, I think it will be 
> > better if the contributors of the both layers
> > 
> > take a look at this and fix if necessary.
> > 
> > (CA : cacommon.h  MAX_ADDR_STR_SIZE_CA 40  , RI : octypes.h 
> > MAX_ADDR_STR_SIZE 40)
> > 
> >  
> > 
> > I?ve created an issue on Jira
> > (https://jira.iotivity.org/browse/IOT-824)
> > 
> > I really will be appreciated if someone resolve this issue. J
> > 
> >  
> > 
> > Thank you.
> > 
> > Jay.
> > 
> >  
> > 
> >  
> > 
> > ?????.?????.
> > 
> >  
> > 
> > Best Regards,
> > 
> >  
> > 
> > Jihun Ha (???/???, Ph.D.)
> > 
> > IoT, IoTivity, OIC| IoT Solution Lab
> > 
> > Software R&D Center | Samsung Electronics Co., Ltd
> > 
> > Mobile +82 10 2533 7947
> > 
> > jihun.ha at samsung.com | jhha85 at gmail.com
> > 
> >  
> > 
> > 
> > 
> > 
> > 
> > 
> > 
> > 
> > _______________________________________________
> > iotivity-dev mailing list
> > iotivity-dev at lists.iotivity.org
> > https://lists.iotivity.org/mailman/listinfo/iotivity-dev
> 

Reply via email to