mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix Y2038 issues with MyStartTime.
Several places treat MyStartTime as a "long", which is only 32 bits wide on some platforms. In reality, MyStartTime is a pg_time_t, i.e., a signed 64-bit integer. This will lead to interesting bugs on the aforementioned systems in 2038 when signed 32-bit integers are no longer sufficient to store Unix time (e.g., "pg_ctl start" hanging). To fix, ensure that MyStartTime is handled as a 64-bit value everywhere. (Of course, users will need to ensure that time_t is 64 bits wide on their system, too.) Co-authored-by: Max Johnson Discussion: https://postgr.es/m/CO1PR07MB905262E8AC270FAAACED66008D682%40CO1PR07MB9052.namprd07.prod.outlook.com Backpatch-through: 12
This commit is contained in:
		@@ -2455,12 +2455,12 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
 | 
				
			|||||||
				{
 | 
									{
 | 
				
			||||||
					char		strfbuf[128];
 | 
										char		strfbuf[128];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					snprintf(strfbuf, sizeof(strfbuf) - 1, "%lx.%x",
 | 
										snprintf(strfbuf, sizeof(strfbuf) - 1, "%" INT64_MODIFIER "x.%x",
 | 
				
			||||||
							 (long) (MyStartTime), MyProcPid);
 | 
												 MyStartTime, MyProcPid);
 | 
				
			||||||
					appendStringInfo(buf, "%*s", padding, strfbuf);
 | 
										appendStringInfo(buf, "%*s", padding, strfbuf);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
					appendStringInfo(buf, "%lx.%x", (long) (MyStartTime), MyProcPid);
 | 
										appendStringInfo(buf, "%" INT64_MODIFIER "x.%x", MyStartTime, MyProcPid);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'p':
 | 
								case 'p':
 | 
				
			||||||
				if (padding != 0)
 | 
									if (padding != 0)
 | 
				
			||||||
@@ -2734,7 +2734,7 @@ write_csvlog(ErrorData *edata)
 | 
				
			|||||||
	appendStringInfoChar(&buf, ',');
 | 
						appendStringInfoChar(&buf, ',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* session id */
 | 
						/* session id */
 | 
				
			||||||
	appendStringInfo(&buf, "%lx.%x", (long) MyStartTime, MyProcPid);
 | 
						appendStringInfo(&buf, "%" INT64_MODIFIER "x.%x", MyStartTime, MyProcPid);
 | 
				
			||||||
	appendStringInfoChar(&buf, ',');
 | 
						appendStringInfoChar(&buf, ',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Line number */
 | 
						/* Line number */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1175,10 +1175,10 @@ CreateLockFile(const char *filename, bool amPostmaster,
 | 
				
			|||||||
	 * both datadir and socket lockfiles; although more stuff may get added to
 | 
						 * both datadir and socket lockfiles; although more stuff may get added to
 | 
				
			||||||
	 * the datadir lockfile later.
 | 
						 * the datadir lockfile later.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	snprintf(buffer, sizeof(buffer), "%d\n%s\n%ld\n%d\n%s\n",
 | 
						snprintf(buffer, sizeof(buffer), "%d\n%s\n" INT64_FORMAT "\n%d\n%s\n",
 | 
				
			||||||
			 amPostmaster ? (int) my_pid : -((int) my_pid),
 | 
								 amPostmaster ? (int) my_pid : -((int) my_pid),
 | 
				
			||||||
			 DataDir,
 | 
								 DataDir,
 | 
				
			||||||
			 (long) MyStartTime,
 | 
								 MyStartTime,
 | 
				
			||||||
			 PostPortNumber,
 | 
								 PostPortNumber,
 | 
				
			||||||
			 socketDir);
 | 
								 socketDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -624,7 +624,7 @@ wait_for_postmaster_start(pgpid_t pm_pid, bool do_checkpoint)
 | 
				
			|||||||
			 * Allow 2 seconds slop for possible cross-process clock skew.
 | 
								 * Allow 2 seconds slop for possible cross-process clock skew.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]);
 | 
								pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]);
 | 
				
			||||||
			pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]);
 | 
								pmstart = atoll(optlines[LOCK_FILE_LINE_START_TIME - 1]);
 | 
				
			||||||
			if (pmstart >= start_time - 2 &&
 | 
								if (pmstart >= start_time - 2 &&
 | 
				
			||||||
#ifndef WIN32
 | 
					#ifndef WIN32
 | 
				
			||||||
				pmpid == pm_pid
 | 
									pmpid == pm_pid
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user