[patch] Fix BZ 18985 out of bounds access in strftime

Paul Eggert eggert@cs.ucla.edu
Sun Sep 20 18:39:00 GMT 2015


Paul Pluzhnikov wrote:
> ... but formats the other values, e.g. it can print something like
>
>    memset (tp, 0, sizeof (*tp));
>    tp->tm_hour = 1024;
>
>    strftime(..., "%H %I", tp);  // produces "1024 04"
>
> that doesn't seem very desirable.

That helps the programmer more than returning 0 would. I occasionally need to 
format hours outside the 00-23 range, e.g., the "26" in the POSIX-style TZ 
string "IST-2IDT,M3.4.4/26,M10.5.0" for Israel's current daylight-saving rules. 
And even if the 1024 is a bug, one can debug it more easily by seeing the 1024 
in the output than by puzzling over a 0 return code.

Although as Martin Sebor mentions we could pretend that strftime is generating 
an infinitely-long string and use this pretence to return 0, that would be less 
useful not to mention less compatible with existing practice.

> Anyway, I'll send a patch to eliminate just the crashes on OOB tm_mon
> and tm_wday.

Don't forget out-of-range tm_isdst: there's one place the code has undefined 
behavior if tm_isdst exceeds 1.



More information about the Libc-alpha mailing list