off by one will be my epitaph the last one (char mon[12] => mon[13]) was caught in may the rest are fixed for the next release thanks
-- Glenn Fowler -- AT&T Research, Florham Park NJ -- On Sun, 7 Dec 2008 18:02:22 -0700 (MST) bugmail-sender at sun.com wrote: > *Synopsis*: Array overruns in libast > CR 6765756 changed on Dec 8 2008 by <User 1-7MTUEB> > === Field ============ === New Value ============= === Old Value ============= > Hook 6 <email address omitted> > SubCategory korn93 korn > ====================== =========================== =========================== > > *Change Request ID*: 6765756 > *Synopsis*: Array overruns in libast > Product: solaris > Category: shell > Subcategory: korn93 > Type: Defect > Subtype: > Status: 1-Dispatched > Substatus: > Priority: 3-Medium > Introduced In Release: > Introduced In Build: > Responsible Engineer: > Keywords: parfait > === *Description* ============================================================ > usr/src/lib/libast/common/sfio/sfvscanf.c > 0153: for(c = 0; c <= SF_MAXCHAR; ++c) > 0154: ac->ok[c] = !ac->yes; > 0155: > 0156: if(*form == ']' || *form == '-') /* special first char */ > 0157: { ac->ok[*form] = ac->yes; > 0158: form += 1; > 0159: } > Array ac->ok has size of SF_MAXCHAR (255), and last loop iteration accesses > ac->ok[SF_MAXCHAR]. > usr/src/lib/libast/common/comp/setlocale.c > 0800: for (i = 1; i < n; i++) > 0801: single(i, NiL); > 0802: return -1; > 0803: } > 0804: } > 0805: else if (!categories[n].prev) > 0806: categories[n].prev = p; > 0807: } > 0808: return n; > 0809: } > In this case, the loop bounds are correct (<AST_LC_COUNT), but n is used after > incrementing and not tested, effectively looping from 1 to 14 inclusive. > usr/src/lib/libast/common/path/pathkey.c > 0159: break; > 0160: usr[c++] = k; > 0161: while (*k && *k != ':' && *k != ' ') > 0162: k++; > 0163: } > 0164: usr[c] = 0; > 0165: ver[0] = (char*)lang; > 0166: ver[1] = k = (s = strrchr(path, '/')) ? s + 1 : path; > If the PROBE_ATTRIBUTES or VERSION_ENVIRONMENT environment variables contain > 16 or more colon-separated items, c will be 16, leading to an overrun on line > 164. > usr/src/lib/libast/common/tm/tmxdate.c > 0350: if (k) > 0351: flags |= MONTH; > 0352: else > 0353: for (i = 1; i <= 12; i++) > 0354: mon[i] = 1; > The for loop runs from 1 to 12 instead of 0 to 11 on a char[12] array. > This bug was found using the Parfait source code analysis tool. > See http://research.sun.com/projects/parfait > *** (#1 of 1): 2008-10-30 18:56:58 GMT+00:00 <User 1-5Q-544> > === *Public Comments* ======================================================== > === *Workaround* ============================================================= > === *Additional Details* ===================================================== > Targeted Release: > Commit To Fix In Build: > Fixed In Build: > Integrated In Build: > Verified In Build: > See Also: > Duplicate of: > Hooks: > Hook1: > Hook2: > Hook3: > Hook4: > Hook5: > Hook6: <email address omitted> > Program Management: > Root Cause: > Fix Affects Documentation: No > Fix Affects Localization: No > === *History* ================================================================ > Date Submitted: 2008-10-30 18:56:58 GMT+00:00 > Submitted By: <User 1-5Q-544> > Status Changed Date Updated Updated By > === *Service Request* ======================================================== > Impact: Significant > Functionality: Secondary > Severity: 3 > Product Name: solaris > Product Release: solaris_nevada > Product Build: > Operating System: solaris_nevada > Hardware: generic > Submitted Date: 2008-10-30 18:56:58 GMT+00:00 > === *Multiple Release (MR) Cluster* - 0 ======================================