Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Sep 1999 15:29:45 -0400 (EDT)
From:      scott@chronis.pobox.com
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/13901: strptime breaks when handling some numerical fields
Message-ID:  <19990922192945.7BF689B46@chronis.pobox.com>

next in thread | raw e-mail | index | archive | help

>Number:         13901
>Category:       bin
>Synopsis:       strptime breaks when handling some numerical fields
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 22 12:30:01 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator:     scott
>Release:        FreeBSD 3.3-STABLE i386
>Organization:
IC Group, Inc.
>Environment:

	

>Description:

    Whenever a numeric data is expected by strptime() in it's `buf' argument,
    it will allocate too many digits to any field which is followed by a
    digit or string of digits in `buf'.

>How-To-Repeat:
    #include <time.h>
    struct tm t;
    strptime("19990823", "%Y%m%d", &t); /* fails */
    strptime("199911", "%Y11", &t);  /* fails */
    strptime("0711", "%m%d", &t); /* fails */
    
>Fix:
	

170c170,171
< 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
---
> 			len = 0;
> 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf) && len < 3; buf++) {
172a174
> 				len++;
187,188c189,190
< 
< 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
---
> 			len = 0;
> 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf) && len < 2; buf++) {
190a193
> 				len++;
211,212c214,215
< 
< 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
---
> 			len = 0;
> 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf) && len < 2; buf++) {
214a218
> 				len++;
278,279c282,283
< 
< 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
---
> 			len = 0;
> 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf) && len < 2; buf++) {
281a286
> 				len++;
319,320c324,325
< 
< 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
---
> 			len = 0;
> 			for (i = 0; *buf != 0 && isdigit((unsigned char)*buf) && len < 2; buf++) {
322a328
> 				len++;
341a348
> 			len = 0;
344a352,356
> 				if ((c == 'y' && len >= 1) || (c == 'Y' && len >= 3)) {
> 					buf++;
> 					break;
> 				}
> 				len++;

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990922192945.7BF689B46>