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 ======================================