fix loading and reloading of leapfile
Related: RHEL-21326
This commit is contained in:
		
							parent
							
								
									a6f33e97bc
								
							
						
					
					
						commit
						e3c5718b9f
					
				
							
								
								
									
										75
									
								
								linuxptp-lstab.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								linuxptp-lstab.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| commit bbfaa1e253b889aeea97702bbbc87e731e0caf87 | ||||
| Author: Miroslav Lichvar <mlichvar@redhat.com> | ||||
| Date:   Thu Feb 22 13:51:59 2024 +0100 | ||||
| 
 | ||||
|     lstab: Limit number of parsed leap seconds. | ||||
|      | ||||
|     The lstab structure has a fixed-size array for leap seconds | ||||
|     (currently 28 + 200). Don't read more leap seconds from the leapfile to | ||||
|     avoid corrupting memory. | ||||
|      | ||||
|     Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com> | ||||
| 
 | ||||
| diff --git a/lstab.c b/lstab.c
 | ||||
| index 24add26..8e35504 100644
 | ||||
| --- a/lstab.c
 | ||||
| +++ b/lstab.c
 | ||||
| @@ -137,7 +137,7 @@ static int lstab_read(struct lstab *lstab, const char *name)
 | ||||
|  		fprintf(stderr, "failed to open '%s' for reading: %m\n", name); | ||||
|  		return -1; | ||||
|  	} | ||||
| -	while (1) {
 | ||||
| +	while (index < N_LEAPS) {
 | ||||
|  		if (!fgets(buf, sizeof(buf), fp)) { | ||||
|  			break; | ||||
|  		} | ||||
| 
 | ||||
| commit 90ad2efc74b0f348fb6b417565b3ada7d161641b | ||||
| Author: Miroslav Lichvar <mlichvar@redhat.com> | ||||
| Date:   Thu Feb 22 13:56:53 2024 +0100 | ||||
| 
 | ||||
|     lstab: Don't free lstab on update. | ||||
|      | ||||
|     The modification timestamp of the leapfile is checked with every | ||||
|     call of lstab_utc2tai(). If the file is modified, the provided lstab | ||||
|     structure is freed and a new one is allocated from the updated leapfile. | ||||
|     But the new lstab is not returned to the caller as the function doesn't | ||||
|     accept a pointer to the pointer to lstab. This causes reading from the | ||||
|     freed memory and leak of the newly allocated memory. | ||||
|      | ||||
|     Modify update_leapsecond_table() to read the updated leapfile into the | ||||
|     existing lstab structure instead of the reallocation. | ||||
|      | ||||
|     Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com> | ||||
| 
 | ||||
| diff --git a/lstab.c b/lstab.c
 | ||||
| index 8e35504..357ed27 100644
 | ||||
| --- a/lstab.c
 | ||||
| +++ b/lstab.c
 | ||||
| @@ -195,7 +195,6 @@ struct lstab *lstab_create(const char *filename)
 | ||||
|   | ||||
|  int update_leapsecond_table(struct lstab *lstab) | ||||
|  { | ||||
| -	const char* leapfile;
 | ||||
|  	struct stat statbuf; | ||||
|  	int err; | ||||
|   | ||||
| @@ -212,14 +211,14 @@ int update_leapsecond_table(struct lstab *lstab)
 | ||||
|  		return 0; | ||||
|  	} | ||||
|  	printf("updating leap seconds file\n"); | ||||
| -	leapfile = lstab->leapfile;
 | ||||
| -	lstab_destroy(lstab);
 | ||||
|   | ||||
| -	lstab = lstab_create(leapfile);
 | ||||
| -	if (!lstab) {
 | ||||
| +	if (lstab_read(lstab, lstab->leapfile)) {
 | ||||
| +		lstab->length = 0;
 | ||||
|  		return -1; | ||||
|  	} | ||||
|   | ||||
| +	lstab->lsfile_mtime = statbuf.st_mtim.tv_sec;
 | ||||
| +
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| @ -31,6 +31,8 @@ Patch3:		linuxptp-ptpver.patch | ||||
| Patch4:		linuxptp-ucastrate.patch | ||||
| # fix ts2phc to handle large NMEA delay | ||||
| Patch5:		linuxptp-nmeadelay.patch | ||||
| # fix loading and reloading of leapfile | ||||
| Patch6:		linuxptp-lstab.patch | ||||
| 
 | ||||
| BuildRequires:	kernel-headers > 4.18.0-87 | ||||
| BuildRequires:	systemd | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user