Fix bug where iso8601_print() could overrun...
If a date with a timezone offset of 0 had a length exactly matching the buffer size, we would write past the end of the buffer.
This commit is contained in:
parent
69628be83e
commit
1f43445813
6
README
6
README
|
@ -14,4 +14,10 @@ You might want to edit 'config' first. You might also want to set
|
|||
'INSTALL_PREFIX', which is prepended onto the destination of any
|
||||
installed file.
|
||||
|
||||
Thanks
|
||||
------
|
||||
|
||||
Robert Dunlop, <rjd@xyzzy.org.uk>
|
||||
* found null terminating bug with iso8601_print()
|
||||
|
||||
@TODO@
|
||||
|
|
|
@ -130,15 +130,11 @@ char* iso8601_print(char* str, int amt, const struct iso8601_date* date,
|
|||
break;
|
||||
}
|
||||
|
||||
if(ret < 1 || ret >= amt) return str_orig;
|
||||
if(ret < 1 || (ret + 1) >= amt) return str_orig;
|
||||
str += ret;
|
||||
amt -= ret;
|
||||
|
||||
if(details->tz_sec) {
|
||||
if(!--amt) {
|
||||
*str = 0;
|
||||
return str_orig;
|
||||
}
|
||||
if(details->tz_sec < 0) {
|
||||
*str++ = '-';
|
||||
ret = -details->tz_sec;
|
||||
|
@ -146,6 +142,7 @@ char* iso8601_print(char* str, int amt, const struct iso8601_date* date,
|
|||
*str++ = '+';
|
||||
ret = details->tz_sec;
|
||||
}
|
||||
--amt;
|
||||
|
||||
y = ret / 3600;
|
||||
ret -= y * 3600;
|
||||
|
@ -158,7 +155,6 @@ char* iso8601_print(char* str, int amt, const struct iso8601_date* date,
|
|||
else snprintf(str, amt, "%02d", y);
|
||||
} else {
|
||||
*str++ = 'Z';
|
||||
if(amt > 1) *str = 0;
|
||||
}
|
||||
|
||||
return str_orig;
|
||||
|
|
Loading…
Reference in New Issue