[Git][NTPsec/ntpsec][master] ntpd/refclock_jjy.c: Don't allow iTimeStampCount to overflow.
Gary E. Miller (@garyedmundsmiller)
gitlab at mg.gitlab.com
Wed Sep 30 00:02:14 UTC 2026
Gary E. Miller pushed to branch master at NTPsec / ntpsec
Commits:
62a454f6 by Gary E. Miller at 2026-09-29T17:00:36-07:00
ntpd/refclock_jjy.c: Don't allow iTimeStampCount to overflow.
By making it unsigned, and checking for MAX_TIMESTAMP.
- - - - -
1 changed file:
- ntpd/refclock_jjy.c
Changes:
=====================================
ntpd/refclock_jjy.c
=====================================
@@ -159,7 +159,7 @@ struct jjyunit {
int iLineCount ;
int year, month, day, hour, minute, second, msecond ;
int leapsecond ;
- int iTimestampCount ; // TS-JJY01, TS-GPS01, Telephone-JJY
+ unsigned iTimestampCount ; // TS-JJY01, TS-GPS01, Telephone-JJY
int iTimestamp [ MAX_TIMESTAMP ] ; // Serial second ( 0 - 86399 )
// LDISC_RAW only
char sRawBuf [ MAX_RAWBUF ] ;
@@ -363,24 +363,24 @@ struct refclock refclock_jjy = {
// Local constants definition for the clockstats messages
-#define JJY_CLOCKSTATS_MESSAGE_ECHOBACK "* Echoback"
-#define JJY_CLOCKSTATS_MESSAGE_IGNORE_REPLY "* Ignore replay : [%s]"
-#define JJY_CLOCKSTATS_MESSAGE_OVER_MIDNIGHT_2 "* Over midnight : timestamp=%d, %d"
+#define JJY_CLOCKSTATS_MESSAGE_ECHOBACK "* Echoback"
+#define JJY_CLOCKSTATS_MESSAGE_IGNORE_REPLY "* Ignore replay : [%s]"
+#define JJY_CLOCKSTATS_MESSAGE_OVER_MIDNIGHT_2 "* Over midnight : timestamp=%d, %d"
/* UNUSED
* #define JJY_CLOCKSTATS_MESSAGE_OVER_MIDNIGHT_3 "* Over midnight : timestamp=%d, %d, %d"
*/
-#define JJY_CLOCKSTATS_MESSAGE_TIMESTAMP_UNSURE "* Unsure timestamp : %s"
-#define JJY_CLOCKSTATS_MESSAGE_LOOPBACK_DELAY "* Loopback delay : %d.%03d mSec."
-#define JJY_CLOCKSTATS_MESSAGE_DELAY_ADJUST "* Delay adjustment : %d mSec. ( valid=%hd/%d )"
-#define JJY_CLOCKSTATS_MESSAGE_DELAY_UNADJUST "* Delay adjustment : None ( valid=%hd/%d )"
-
-#define JJY_CLOCKSTATS_MESSAGE_UNEXPECTED_REPLY "# Unexpected reply : [%s]"
-#define JJY_CLOCKSTATS_MESSAGE_INVALID_LENGTH "# Invalid length : length=%d"
-#define JJY_CLOCKSTATS_MESSAGE_TOO_MANY_REPLY "# Too many reply : count=%d"
-#define JJY_CLOCKSTATS_MESSAGE_INVALID_REPLY "# Invalid reply : [%s]"
-#define JJY_CLOCKSTATS_MESSAGE_SLOW_REPLY_2 "# Slow reply : timestamp=%d, %d"
+#define JJY_CLOCKSTATS_MESSAGE_TIMESTAMP_UNSURE "* Unsure timestamp : %s"
+#define JJY_CLOCKSTATS_MESSAGE_LOOPBACK_DELAY "* Loopback delay : %d.%03d mSec."
+#define JJY_CLOCKSTATS_MESSAGE_DELAY_ADJUST "* Delay adjustment : %d mSec. ( valid=%hd/%d )"
+#define JJY_CLOCKSTATS_MESSAGE_DELAY_UNADJUST "* Delay adjustment : None ( valid=%hd/%d )"
+
+#define JJY_CLOCKSTATS_MESSAGE_UNEXPECTED_REPLY "# Unexpected reply : [%s]"
+#define JJY_CLOCKSTATS_MESSAGE_INVALID_LENGTH "# Invalid length : length=%d"
+#define JJY_CLOCKSTATS_MESSAGE_TOO_MANY_REPLY "# Too many reply : count=%u"
+#define JJY_CLOCKSTATS_MESSAGE_INVALID_REPLY "# Invalid reply : [%s]"
+#define JJY_CLOCKSTATS_MESSAGE_SLOW_REPLY_2 "# Slow reply : timestamp=%d, %d"
/* UNUSED
- * #define JJY_CLOCKSTATS_MESSAGE_SLOW_REPLY_3 "# Slow reply : timestamp=%d, %d, %d"
+ * #define JJY_CLOCKSTATS_MESSAGE_SLOW_REPLY_3 "# Slow reply : timestamp=%d, %d, %d"
*/
#define JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_DATE "# Invalid date : rc=%d year=%d month=%d day=%d"
#define JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME "# Invalid time : rc=%d hour=%d minute=%d second=%d"
@@ -393,7 +393,11 @@ struct refclock refclock_jjy = {
// Debug print macro
#ifdef DEBUG
-#define DEBUG_PRINTF_JJY_RECEIVE(sFunc,iLen) { if ( debug ) { printf ( "refclock_jjy.c : %s : iProcessState=%d bLineError=%d iCommandSeq=%d iLineCount=%d iTimestampCount=%d iLen=%d\n", sFunc, up->iProcessState, up->bLineError, up->iCommandSeq, up->iLineCount, up->iTimestampCount, iLen ) ; } }
+#define DEBUG_PRINTF_JJY_RECEIVE(sFunc,iLen) { if ( debug ) { \
+ printf("refclock_jjy.c : %s : iProcessState=%d bLineError=%d " \
+ "iCommandSeq=%d iLineCount=%d iTimestampCount=%u iLen=%d\n", \
+ sFunc, up->iProcessState, up->bLineError, up->iCommandSeq, \
+ up->iLineCount, up->iTimestampCount, iLen); } }
#else
#define DEBUG_PRINTF_JJY_RECEIVE(sFunc,iLen)
#endif
@@ -426,7 +430,7 @@ jjy_start ( int unit, struct peer *peer )
up->bReceiveFlag = false ;
up->iCommandSeq = 0 ;
up->iLineCount = 0 ;
- up->iTimestampCount = 0 ;
+ up->iTimestampCount = 0;
up->bWaitBreakString = false ;
up->iRawBufLen = up->iLineBufLen = up->iTextBufLen = 0 ;
up->bSkipCntrlCharOnly = true ;
@@ -1173,35 +1177,40 @@ jjy_receive_tristate_jjy01 ( struct recvbuf *rbufp )
case TS_JJY01_COMMAND_NUMBER_TIME : // HH:MM:SS
case TS_JJY01_COMMAND_NUMBER_STIM : // HH:MM:SS
- if ( up->iTimestampCount >= 2 ) {
+ if (up->iTimestampCount >= 2) {
// Too many time reply
snprintf( sLog, sizeof(sLog),
JJY_CLOCKSTATS_MESSAGE_TOO_MANY_REPLY,
- up->iTimestampCount ) ;
+ up->iTimestampCount) ;
jjy_write_clockstats( peer, JJY_CLOCKSTATS_MARK_ERROR, sLog ) ;
up->bLineError = true ;
return JJY_RECEIVE_ERROR ;
}
- rc = sscanf ( pBuf, "%2d:%2d:%2d",
- &up->hour, &up->minute, &up->second ) ;
+ rc = sscanf (pBuf, "%2d:%2d:%2d",
+ &up->hour, &up->minute, &up->second ) ;
- if ( rc != 3 || up->hour > 23 || up->minute > 59 ||
- up->second > 60 ) {
+ if (rc != 3 ||
+ up->hour > 23 ||
+ up->minute > 59 ||
+ up->second > 60) {
// Invalid time
- snprintf( sLog, sizeof(sLog),
- JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME,
- rc, up->hour, up->minute, up->second ) ;
- jjy_write_clockstats( peer, JJY_CLOCKSTATS_MARK_ERROR, sLog ) ;
- up->bLineError = true ;
- return JJY_RECEIVE_ERROR ;
+ snprintf(sLog, sizeof(sLog),
+ JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME,
+ rc, up->hour, up->minute, up->second);
+ jjy_write_clockstats(peer, JJY_CLOCKSTATS_MARK_ERROR,
+ sLog);
+ up->bLineError = true;
+ return JJY_RECEIVE_ERROR;
}
+ if (up->iTimestampCount < MAX_TIMESTAMP) {
+ up->iTimestamp[up->iTimestampCount] =
+ up->hour * 3600 + up->minute * 60 + up->second;
- up->iTimestamp[up->iTimestampCount] = ( up->hour * 60 + up->minute ) * 60 + up->second ;
-
- up->iTimestampCount++ ;
+ up->iTimestampCount++;
+ }
- up->msecond = 0 ;
+ up->msecond = 0;
break ;
@@ -1252,7 +1261,7 @@ jjy_receive_tristate_jjy01 ( struct recvbuf *rbufp )
}
- if ( up->iTimestampCount == 2 ) {
+ if (up->iTimestampCount == 2) {
// Process date and time
if ( up->iTimestamp[1] - 2 <= up->iTimestamp[0]
@@ -1323,7 +1332,7 @@ jjy_poll_tristate_jjy01 ( int unit, struct peer *peer )
up = pp->unitptr ;
up->bLineError = false ;
- up->iTimestampCount = 0 ;
+ up->iTimestampCount = 0;
if ( ( pp->sloppyclockflag & CLK_FLAG1 ) == 0 ) {
// Skip "dcst" and "stus" commands
@@ -2090,12 +2099,13 @@ jjy_receive_tristate_gpsclock01 ( struct recvbuf *rbufp )
case TS_GPS01_COMMAND_NUMBER_TIME : // HH:MM:SS
- if ( up->iTimestampCount >= 2 ) {
+ if (up->iTimestampCount >= 2) {
// Too many time reply
- snprintf( sLog, sizeof(sLog),
- JJY_CLOCKSTATS_MESSAGE_TOO_MANY_REPLY,
- up->iTimestampCount ) ;
- jjy_write_clockstats( peer, JJY_CLOCKSTATS_MARK_ERROR, sLog ) ;
+ snprintf(sLog, sizeof(sLog),
+ JJY_CLOCKSTATS_MESSAGE_TOO_MANY_REPLY,
+ up->iTimestampCount);
+ jjy_write_clockstats(peer, JJY_CLOCKSTATS_MARK_ERROR,
+ sLog);
up->bLineError = true ;
return JJY_RECEIVE_ERROR ;
}
@@ -2106,17 +2116,21 @@ jjy_receive_tristate_gpsclock01 ( struct recvbuf *rbufp )
if ( rc != 3
|| up->hour > 23 || up->minute > 59 || up->second > 60 ) {
// Invalid time
- snprintf( sLog, sizeof(sLog),
- JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME,
- rc, up->hour, up->minute, up->second ) ;
- jjy_write_clockstats( peer, JJY_CLOCKSTATS_MARK_ERROR, sLog ) ;
- up->bLineError = true ;
- return JJY_RECEIVE_ERROR ;
+ snprintf(sLog, sizeof(sLog),
+ JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME,
+ rc, up->hour, up->minute, up->second ) ;
+ jjy_write_clockstats(peer, JJY_CLOCKSTATS_MARK_ERROR,
+ sLog ) ;
+ up->bLineError = true;
+ return JJY_RECEIVE_ERROR;
}
- up->iTimestamp[up->iTimestampCount] = ( up->hour * 60 + up->minute ) * 60 + up->second ;
+ if (up->iTimestampCount < MAX_TIMESTAMP) {
+ up->iTimestamp[up->iTimestampCount] =
+ up->hour * 3600 + up->minute * 60 + up->second;
- up->iTimestampCount++ ;
+ up->iTimestampCount++;
+ }
up->msecond = 0 ;
@@ -2124,16 +2138,21 @@ jjy_receive_tristate_gpsclock01 ( struct recvbuf *rbufp )
case TS_GPS01_COMMAND_NUMBER_STUS :
- if ( strncmp( pBuf, TS_GPS01_REPLY_STUS_RTC, TS_GPS01_REPLY_LENGTH_STUS ) == 0
- || strncmp( pBuf, TS_GPS01_REPLY_STUS_GPS, TS_GPS01_REPLY_LENGTH_STUS ) == 0
- || strncmp( pBuf, TS_GPS01_REPLY_STUS_UTC, TS_GPS01_REPLY_LENGTH_STUS ) == 0
- || strncmp( pBuf, TS_GPS01_REPLY_STUS_PPS, TS_GPS01_REPLY_LENGTH_STUS ) == 0 ) {
+ if (strncmp(pBuf, TS_GPS01_REPLY_STUS_RTC,
+ TS_GPS01_REPLY_LENGTH_STUS ) == 0 ||
+ strncmp(pBuf, TS_GPS01_REPLY_STUS_GPS,
+ TS_GPS01_REPLY_LENGTH_STUS ) == 0 ||
+ strncmp(pBuf, TS_GPS01_REPLY_STUS_UTC,
+ TS_GPS01_REPLY_LENGTH_STUS ) == 0 ||
+ strncmp(pBuf, TS_GPS01_REPLY_STUS_PPS,
+ TS_GPS01_REPLY_LENGTH_STUS ) == 0 ) {
// Good
} else {
- snprintf( sLog, sizeof(sLog),
+ snprintf(sLog, sizeof(sLog),
JJY_CLOCKSTATS_MESSAGE_INVALID_REPLY,
pBuf ) ;
- jjy_write_clockstats( peer, JJY_CLOCKSTATS_MARK_ERROR, sLog ) ;
+ jjy_write_clockstats(peer, JJY_CLOCKSTATS_MARK_ERROR,
+ sLog);
up->bLineError = true ;
return JJY_RECEIVE_ERROR ;
}
@@ -2151,12 +2170,13 @@ jjy_receive_tristate_gpsclock01 ( struct recvbuf *rbufp )
}
- if ( up->iTimestampCount == 2 ) {
+ if (up->iTimestampCount == 2) {
// Process date and time
if ( up->iTimestamp[1] - 2 <= up->iTimestamp[0]
&& up->iTimestamp[0] <= up->iTimestamp[1] ) {
- // 3 commands (time,date,stim) was executed in two seconds
+ /* 3 commands (time,date,stim) was executed
+ & in two seconds */
jjy_synctime( peer, pp, up ) ;
return JJY_RECEIVE_DONE ;
} else if ( up->iTimestamp[0] > up->iTimestamp[1] ) {
@@ -2228,7 +2248,7 @@ jjy_poll_tristate_gpsclock01 ( int unit, struct peer *peer )
pp = peer->procptr ;
up = pp->unitptr ;
- up->iTimestampCount = 0 ;
+ up->iTimestampCount = 0;
if ( ( pp->sloppyclockflag & CLK_FLAG1 ) == 0 ) {
// Skip "stus" command
@@ -2988,7 +3008,7 @@ teljjy_control ( struct peer *peer, struct refclockproc *pp, struct jjyunit *up
up->iTeljjyStateTimer = 0 ;
up->bLineError = false ;
up->iClockCommandSeq = 0 ;
- up->iTimestampCount = 0 ;
+ up->iTimestampCount = 0;
up->iLoopbackCount = 0 ;
for ( i = 0 ; i < MAX_LOOPBACK ; i ++ ) {
up->bLoopbackTimeout[i] = false ;
@@ -3250,7 +3270,7 @@ teljjy_login_conn ( struct peer *peer, struct refclockproc *pp, struct jjyunit *
up->bLineError = false ;
up->iClockCommandSeq = 0 ;
- up->iTimestampCount = 0 ;
+ up->iTimestampCount = 0;
up->iLoopbackCount = 0 ;
for ( i = 0 ; i < MAX_LOOPBACK ; i ++ ) {
up->bLoopbackTimeout[i] = false ;
@@ -3520,37 +3540,50 @@ teljjy_conn_data ( struct peer *peer, struct refclockproc *pp, struct jjyunit *u
&& teljjy_command_sequence[up->iClockCommandSeq].iExpectedReplyType == TELJJY_REPLY_TIME ) {
// TIME<CR> -> HHMMSS<CR> ( 3 times on second )
- rc = sscanf ( pBuf, "%2d%2d%2d", &up->hour, &up->minute, &up->second ) ;
+ rc = sscanf (pBuf, "%2d%2d%2d",
+ &up->hour, &up->minute, &up->second);
- if ( rc != 3 || up->hour > 23 || up->minute > 59 || up->second > 60 ) {
+ if (rc != 3 ||
+ up->hour > 23 ||
+ up->minute > 59 ||
+ up->second > 60 ) {
// Invalid time
- snprintf( sLog, sizeof(sLog),
- JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME,
- rc, up->hour, up->minute, up->second ) ;
- jjy_write_clockstats( peer, JJY_CLOCKSTATS_MARK_ERROR, sLog ) ;
+ snprintf(sLog, sizeof(sLog),
+ JJY_CLOCKSTATS_MESSAGE_SSCANF_INVALID_TIME,
+ rc, up->hour, up->minute, up->second);
+ jjy_write_clockstats(peer,
+ JJY_CLOCKSTATS_MARK_ERROR, sLog);
up->bLineError = true ;
}
- up->iTimestamp[up->iTimestampCount] = ( up->hour * 60 + up->minute ) * 60 + up->second ;
- up->iTimestampCount++ ;
+ if (MAX_TIMESTAMP <= up->iTimestampCount) {
+ up->bLineError = true;
+ } else {
+ up->iTimestamp[up->iTimestampCount] =
+ up->hour * 3600 + up->minute * 60 + up->second;
+ up->iTimestampCount++;
+ }
- if ( up->iTimestampCount == 6 && ! up->bLineError ) {
+ if (MAX_TIMESTAMP == up->iTimestampCount &&
+ !up->bLineError) {
#ifdef DEBUG
- printf( "refclock_jjy.c : teljjy_conn_data : bLineError=%d iTimestamp=%d, %d, %d\n",
+ printf("refclock_jjy.c : teljjy_conn_data : "
+ " bLineError=%d iTimestamp=%d, %d, %d\n",
up->bLineError,
- up->iTimestamp[3], up->iTimestamp[4], up->iTimestamp[5] ) ;
+ up->iTimestamp[3], up->iTimestamp[4],
+ up->iTimestamp[5] ) ;
#endif
bAdjustment = true ;
- if ( peer->cfg.mode == 100 ) {
+ if (peer->cfg.mode == 100) {
// subtype=100
up->msecond = 0 ;
} else {
// subtype=101 to 110
- up->msecond = teljjy_getDelay( peer, up ) ;
- if (up->msecond < 0 ) {
- up->msecond = 0 ;
- bAdjustment = false ;
+ up->msecond = teljjy_getDelay(peer, up);
+ if (up->msecond < 0) {
+ up->msecond = 0;
+ bAdjustment = false;
}
}
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/-/commit/62a454f6fcb6f2dcc8d5866f6558905ebdb7dd69
--
View it on GitLab: https://gitlab.com/NTPsec/ntpsec/-/commit/62a454f6fcb6f2dcc8d5866f6558905ebdb7dd69
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.ntpsec.org/pipermail/vc/attachments/20260930/0830667e/attachment-0001.htm>
More information about the vc
mailing list