On Thursday, July 28, 2011 12:51:47 am Nick Wagner wrote:
> The SLPDPredicateTreeNode structure does seem to have a problem.  If we left
> the larger-sized array, guards should still be added to ensure that neither
> strncpy will step off the end of the member 'storage'.  Others may have
> differing opinions, but I'd change storage to be a char* and alloc it to the
> right size (tag_len + value_len + terminating nulls), as long as we make
> sure that it's freed appropriately.  We're allocating all the nodes in the
> tree anyway.
> 
> --Nick
> 
I think we can do that.  If all are ok with it, can we make this change?

- Varun

> 
> On Wed, Jul 27, 2011 at 1:27 AM, Varun Chandramohan <
> var...@linux.vnet.ibm.com> wrote:
> 
> > **
> >
> > Hi Folks,
> >
> >  The test team reported a bug. Iam pasting the bug analysis. They seem to
> > have found the problem as well with a temporary fix. However i they want our
> > opinion on the fix. Please advice.
> >
> > Using the following command:
> >
> > slptool findsrvs service:test$ID "(foo=value1)"
> >
> >  this will generat the overflow in createPredicateParseTree doing an 
> > strncpy -
> >
> > line 1656 slpd_predicate.c
> >
> >  When reading the comments around "operator" it appears it is using the 
> > operator
> >
> > 2 characters as a place to copy the attribute name.  The attribute name can 
> > be
> >
> > very large.  This is the code:
> >
> >        /* Finished with "operator" now - just use as temporary pointer to 
> > assist
> >
> > with copying the
> >
> >        * attribute name (lhs) and required value (rhs) into the node
> >
> >        */
> >
> >       operator = (*ppNode)->nodeBody.comparison.storage;
> >
> >       strncpy(operator, lhs, lhs_len);
> >
> >       operator[lhs_len] = '\0';
> >
> >  operator is now the pointer of "storage" in:
> >
> >  slpd_predicate.h
> >
> >  typedef struct __SLPDPredicateTreeNode
> >
> > {
> >
> >    SLPDPredicateTreeNodeType nodeType;
> >
> >    struct __SLPDPredicateTreeNode *next;     /* next node in a combination 
> > */
> >
> >    union {
> >
> >       struct __SLPDPredicateLogicalBody
> >
> >       {
> >
> >          struct __SLPDPredicateTreeNode *first;
> >
> >       } logical;
> >
> >       struct __SLPDPredicateComparisonBody
> >
> >       {
> >
> >          size_t tag_len;
> >
> >          char *tag_str;
> >
> >          size_t value_len;
> >
> >          char *value_str;
> >
> >          char storage[2];
> >
> >       } comparison;
> >
> >    } nodeBody;
> >
> > } SLPDPredicateTreeNode;
> >
> >  Copying of attributes onto 2char array fails though doesn't fail in older
> >
> > builds so I am not sure if build options or strictness has changed.
> >
> >  Since there were no cleanup routines if the pointer was malloced, I just
> >
> > increased --> storage[200] and the testcase runs without fail and the area 
> > will
> >
> > get freed with the structure.
> >
> >  Is this the best way out?
> >
> >  Regards,
> >
> > Varun
> >
> >
> >
> > ------------------------------------------------------------------------------
> > Got Input?   Slashdot Needs You.
> > Take our quick survey online.  Come on, we don't ask for help often.
> > Plus, you'll get a chance to win $100 to spend on ThinkGeek.
> > http://p.sf.net/sfu/slashdot-survey
> > _______________________________________________
> > Openslp-devel mailing list
> > Openslp-devel@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/openslp-devel
> >
> >
> 

------------------------------------------------------------------------------
Got Input?   Slashdot Needs You.
Take our quick survey online.  Come on, we don't ask for help often.
Plus, you'll get a chance to win $100 to spend on ThinkGeek.
http://p.sf.net/sfu/slashdot-survey
_______________________________________________
Openslp-devel mailing list
Openslp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openslp-devel

Reply via email to