| Index: UPDATING |
| =================================================================== |
| --- UPDATING (版本 333371) |
| +++ UPDATING (版本 335465) |
| @@ -16,6 +16,13 @@ |
| the tip of head, and then rebuild without this option. The bootstrap process |
| from older version of current across the gcc/clang cutover is a bit fragile. |
| |
| +20180621 p11 FreeBSD-SA-18:07.lazyfpu |
| + FreeBSD-EN-18:07.pmap |
| + |
| + Fix Lazy FPU information disclosure. [SA-18:07.lazyfpu] |
| + |
| + Fix TLB shootdown for Xen based guests. [EN-18:07.pmap] |
| + |
| 20180508 p10 FreeBSD-SA-18:06.debugreg |
| FreeBSD-EN-18:05.mem |
| FreeBSD-EN-18:06.tzdata |
| Index: sys/amd64/amd64/cpu_switch.S |
| =================================================================== |
| --- sys/amd64/amd64/cpu_switch.S (版本 333371) |
| +++ sys/amd64/amd64/cpu_switch.S (版本 335465) |
| @@ -105,10 +105,10 @@ |
| |
| /* have we used fp, and need a save? */ |
| cmpq %rdi,PCPU(FPCURTHREAD) |
| - jne 3f |
| + jne 2f |
| movq PCB_SAVEFPU(%r8),%r8 |
| clts |
| - cmpl $0,use_xsave |
| + cmpl $0,use_xsave(%rip) |
| jne 1f |
| fxsave (%r8) |
| jmp 2f |
| @@ -120,12 +120,7 @@ |
| /* This is patched to xsaveopt if supported, see fpuinit_bsp1() */ |
| xsave (%r8) |
| movq %rcx,%rdx |
| -2: smsw %ax |
| - orb $CR0_TS,%al |
| - lmsw %ax |
| - xorl %eax,%eax |
| - movq %rax,PCPU(FPCURTHREAD) |
| -3: |
| +2: |
| /* Save is done. Now fire up new thread. Leave old vmspace. */ |
| movq %rsi,%r12 |
| movq %rdi,%r13 |
| @@ -212,6 +207,8 @@ |
| movq PCB_RBX(%r8),%rbx |
| movq PCB_RIP(%r8),%rax |
| movq %rax,(%rsp) |
| + movq PCPU(CURTHREAD),%rdi |
| + call fpu_activate_sw |
| ret |
| |
| /* |
| Index: sys/amd64/amd64/fpu.c |
| =================================================================== |
| --- sys/amd64/amd64/fpu.c (版本 333371) |
| +++ sys/amd64/amd64/fpu.c (版本 335465) |
| @@ -139,6 +139,11 @@ |
| SYSCTL_INT(_hw, HW_FLOATINGPT, floatingpoint, CTLFLAG_RD, |
| SYSCTL_NULL_INT_PTR, 1, "Floating point instructions executed in hardware"); |
| |
| +int lazy_fpu_switch = 0; |
| +SYSCTL_INT(_hw, OID_AUTO, lazy_fpu_switch, CTLFLAG_RWTUN | CTLFLAG_NOFETCH, |
| + &lazy_fpu_switch, 0, |
| + "Lazily load FPU context after context switch"); |
| + |
| int use_xsave; /* non-static for cpu_switch.S */ |
| uint64_t xsave_mask; /* the same */ |
| static uma_zone_t fpu_save_area_zone; |
| @@ -204,6 +209,7 @@ |
| u_int cp[4]; |
| uint64_t xsave_mask_user; |
| |
| + TUNABLE_INT_FETCH("hw.lazy_fpu_switch", &lazy_fpu_switch); |
| if ((cpu_feature2 & CPUID2_XSAVE) != 0) { |
| use_xsave = 1; |
| TUNABLE_INT_FETCH("hw.use_xsave", &use_xsave); |
| @@ -611,6 +617,45 @@ |
| return (fpetable[(mxcsr & (~mxcsr >> 7)) & 0x3f]); |
| } |
| |
| +static void |
| +restore_fpu_curthread(struct thread *td) |
| +{ |
| + struct pcb *pcb; |
| + |
| + /* |
| + * Record new context early in case frstor causes a trap. |
| + */ |
| + PCPU_SET(fpcurthread, td); |
| + |
| + stop_emulating(); |
| + fpu_clean_state(); |
| + pcb = td->td_pcb; |
| + |
| + if ((pcb->pcb_flags & PCB_FPUINITDONE) == 0) { |
| + /* |
| + * This is the first time this thread has used the FPU or |
| + * the PCB doesn't contain a clean FPU state. Explicitly |
| + * load an initial state. |
| + * |
| + * We prefer to restore the state from the actual save |
| + * area in PCB instead of directly loading from |
| + * fpu_initialstate, to ignite the XSAVEOPT |
| + * tracking engine. |
| + */ |
| + bcopy(fpu_initialstate, pcb->pcb_save, |
| + cpu_max_ext_state_size); |
| + fpurestore(pcb->pcb_save); |
| + if (pcb->pcb_initial_fpucw != __INITIAL_FPUCW__) |
| + fldcw(pcb->pcb_initial_fpucw); |
| + if (PCB_USER_FPU(pcb)) |
| + set_pcb_flags(pcb, PCB_FPUINITDONE | |
| + PCB_USERFPUINITDONE); |
| + else |
| + set_pcb_flags(pcb, PCB_FPUINITDONE); |
| + } else |
| + fpurestore(pcb->pcb_save); |
| +} |
| + |
| /* |
| * Device Not Available (DNA, #NM) exception handler. |
| * |
| @@ -621,7 +666,9 @@ |
| void |
| fpudna(void) |
| { |
| + struct thread *td; |
| |
| + td = curthread; |
| /* |
| * This handler is entered with interrupts enabled, so context |
| * switches may occur before critical_enter() is executed. If |
| @@ -635,49 +682,38 @@ |
| |
| KASSERT((curpcb->pcb_flags & PCB_FPUNOSAVE) == 0, |
| ("fpudna while in fpu_kern_enter(FPU_KERN_NOCTX)")); |
| - if (PCPU_GET(fpcurthread) == curthread) { |
| - printf("fpudna: fpcurthread == curthread\n"); |
| + if (__predict_false(PCPU_GET(fpcurthread) == td)) { |
| + /* |
| + * Some virtual machines seems to set %cr0.TS at |
| + * arbitrary moments. Silently clear the TS bit |
| + * regardless of the eager/lazy FPU context switch |
| + * mode. |
| + */ |
| stop_emulating(); |
| - critical_exit(); |
| - return; |
| + } else { |
| + if (__predict_false(PCPU_GET(fpcurthread) != NULL)) { |
| + panic( |
| + "fpudna: fpcurthread = %p (%d), curthread = %p (%d)\n", |
| + PCPU_GET(fpcurthread), |
| + PCPU_GET(fpcurthread)->td_tid, td, td->td_tid); |
| + } |
| + restore_fpu_curthread(td); |
| } |
| - if (PCPU_GET(fpcurthread) != NULL) { |
| - panic("fpudna: fpcurthread = %p (%d), curthread = %p (%d)\n", |
| - PCPU_GET(fpcurthread), PCPU_GET(fpcurthread)->td_tid, |
| - curthread, curthread->td_tid); |
| - } |
| - stop_emulating(); |
| - /* |
| - * Record new context early in case frstor causes a trap. |
| - */ |
| - PCPU_SET(fpcurthread, curthread); |
| + critical_exit(); |
| +} |
| |
| - fpu_clean_state(); |
| +void fpu_activate_sw(struct thread *td); /* Called from the context switch */ |
| +void |
| +fpu_activate_sw(struct thread *td) |
| +{ |
| |
| - if ((curpcb->pcb_flags & PCB_FPUINITDONE) == 0) { |
| - /* |
| - * This is the first time this thread has used the FPU or |
| - * the PCB doesn't contain a clean FPU state. Explicitly |
| - * load an initial state. |
| - * |
| - * We prefer to restore the state from the actual save |
| - * area in PCB instead of directly loading from |
| - * fpu_initialstate, to ignite the XSAVEOPT |
| - * tracking engine. |
| - */ |
| - bcopy(fpu_initialstate, curpcb->pcb_save, |
| - cpu_max_ext_state_size); |
| - fpurestore(curpcb->pcb_save); |
| - if (curpcb->pcb_initial_fpucw != __INITIAL_FPUCW__) |
| - fldcw(curpcb->pcb_initial_fpucw); |
| - if (PCB_USER_FPU(curpcb)) |
| - set_pcb_flags(curpcb, |
| - PCB_FPUINITDONE | PCB_USERFPUINITDONE); |
| - else |
| - set_pcb_flags(curpcb, PCB_FPUINITDONE); |
| - } else |
| - fpurestore(curpcb->pcb_save); |
| - critical_exit(); |
| + if (lazy_fpu_switch || (td->td_pflags & TDP_KTHREAD) != 0 || |
| + !PCB_USER_FPU(td->td_pcb)) { |
| + PCPU_SET(fpcurthread, NULL); |
| + start_emulating(); |
| + } else if (PCPU_GET(fpcurthread) != td) { |
| + restore_fpu_curthread(td); |
| + } |
| } |
| |
| void |
| Index: sys/conf/newvers.sh |
| =================================================================== |
| --- sys/conf/newvers.sh (版本 333371) |
| +++ sys/conf/newvers.sh (版本 335465) |
| @@ -44,7 +44,7 @@ |
| |
| TYPE="FreeBSD" |
| REVISION="11.1" |
| -BRANCH="RELEASE-p10" |
| +BRANCH="RELEASE-p11" |
| if [ -n "${BRANCH_OVERRIDE}" ]; then |
| BRANCH=${BRANCH_OVERRIDE} |
| fi |
| Index: sys/i386/i386/swtch.s |
| =================================================================== |
| --- sys/i386/i386/swtch.s (版本 333371) |
| +++ sys/i386/i386/swtch.s (版本 335465) |
| @@ -293,6 +293,12 @@ |
| cpu_switch_load_gs: |
| mov PCB_GS(%edx),%gs |
| |
| + pushl %edx |
| + pushl PCPU(CURTHREAD) |
| + call npxswitch |
| + popl %edx |
| + popl %edx |
| + |
| /* Test if debug registers should be restored. */ |
| testl $PCB_DBREGS,PCB_FLAGS(%edx) |
| jz 1f |
| Index: sys/i386/isa/npx.c |
| =================================================================== |
| --- sys/i386/isa/npx.c (版本 333371) |
| +++ sys/i386/isa/npx.c (版本 335465) |
| @@ -191,6 +191,11 @@ |
| SYSCTL_INT(_hw, HW_FLOATINGPT, floatingpoint, CTLFLAG_RD, |
| &hw_float, 0, "Floating point instructions executed in hardware"); |
| |
| +int lazy_fpu_switch = 0; |
| +SYSCTL_INT(_hw, OID_AUTO, lazy_fpu_switch, CTLFLAG_RWTUN | CTLFLAG_NOFETCH, |
| + &lazy_fpu_switch, 0, |
| + "Lazily load FPU context after context switch"); |
| + |
| int use_xsave; |
| uint64_t xsave_mask; |
| static uma_zone_t fpu_save_area_zone; |
| @@ -327,6 +332,7 @@ |
| u_int cp[4]; |
| uint64_t xsave_mask_user; |
| |
| + TUNABLE_INT_FETCH("hw.lazy_fpu_switch", &lazy_fpu_switch); |
| if (cpu_fxsr && (cpu_feature2 & CPUID2_XSAVE) != 0) { |
| use_xsave = 1; |
| TUNABLE_INT_FETCH("hw.use_xsave", &use_xsave); |
| @@ -785,47 +791,20 @@ |
| return (fpetable[(mxcsr & (~mxcsr >> 7)) & 0x3f]); |
| } |
| |
| -/* |
| - * Implement device not available (DNA) exception |
| - * |
| - * It would be better to switch FP context here (if curthread != fpcurthread) |
| - * and not necessarily for every context switch, but it is too hard to |
| - * access foreign pcb's. |
| - */ |
| - |
| -static int err_count = 0; |
| - |
| -int |
| -npxdna(void) |
| +static void |
| +restore_npx_curthread(struct thread *td, struct pcb *pcb) |
| { |
| |
| - if (!hw_float) |
| - return (0); |
| - critical_enter(); |
| - if (PCPU_GET(fpcurthread) == curthread) { |
| - printf("npxdna: fpcurthread == curthread %d times\n", |
| - ++err_count); |
| - stop_emulating(); |
| - critical_exit(); |
| - return (1); |
| - } |
| - if (PCPU_GET(fpcurthread) != NULL) { |
| - printf("npxdna: fpcurthread = %p (%d), curthread = %p (%d)\n", |
| - PCPU_GET(fpcurthread), |
| - PCPU_GET(fpcurthread)->td_proc->p_pid, |
| - curthread, curthread->td_proc->p_pid); |
| - panic("npxdna"); |
| - } |
| - stop_emulating(); |
| /* |
| * Record new context early in case frstor causes a trap. |
| */ |
| - PCPU_SET(fpcurthread, curthread); |
| + PCPU_SET(fpcurthread, td); |
| |
| + stop_emulating(); |
| if (cpu_fxsr) |
| fpu_clean_state(); |
| |
| - if ((curpcb->pcb_flags & PCB_NPXINITDONE) == 0) { |
| + if ((pcb->pcb_flags & PCB_NPXINITDONE) == 0) { |
| /* |
| * This is the first time this thread has used the FPU or |
| * the PCB doesn't contain a clean FPU state. Explicitly |
| @@ -836,18 +815,54 @@ |
| * npx_initialstate, to ignite the XSAVEOPT |
| * tracking engine. |
| */ |
| - bcopy(npx_initialstate, curpcb->pcb_save, cpu_max_ext_state_size); |
| - fpurstor(curpcb->pcb_save); |
| - if (curpcb->pcb_initial_npxcw != __INITIAL_NPXCW__) |
| - fldcw(curpcb->pcb_initial_npxcw); |
| - curpcb->pcb_flags |= PCB_NPXINITDONE; |
| - if (PCB_USER_FPU(curpcb)) |
| - curpcb->pcb_flags |= PCB_NPXUSERINITDONE; |
| + bcopy(npx_initialstate, pcb->pcb_save, cpu_max_ext_state_size); |
| + fpurstor(pcb->pcb_save); |
| + if (pcb->pcb_initial_npxcw != __INITIAL_NPXCW__) |
| + fldcw(pcb->pcb_initial_npxcw); |
| + pcb->pcb_flags |= PCB_NPXINITDONE; |
| + if (PCB_USER_FPU(pcb)) |
| + pcb->pcb_flags |= PCB_NPXUSERINITDONE; |
| } else { |
| - fpurstor(curpcb->pcb_save); |
| + fpurstor(pcb->pcb_save); |
| } |
| +} |
| + |
| +/* |
| + * Implement device not available (DNA) exception |
| + * |
| + * It would be better to switch FP context here (if curthread != fpcurthread) |
| + * and not necessarily for every context switch, but it is too hard to |
| + * access foreign pcb's. |
| + */ |
| +int |
| +npxdna(void) |
| +{ |
| + struct thread *td; |
| + |
| + if (!hw_float) |
| + return (0); |
| + td = curthread; |
| + critical_enter(); |
| + if (__predict_false(PCPU_GET(fpcurthread) == td)) { |
| + /* |
| + * Some virtual machines seems to set %cr0.TS at |
| + * arbitrary moments. Silently clear the TS bit |
| + * regardless of the eager/lazy FPU context switch |
| + * mode. |
| + */ |
| + stop_emulating(); |
| + } else { |
| + if (__predict_false(PCPU_GET(fpcurthread) != NULL)) { |
| + printf( |
| + "npxdna: fpcurthread = %p (%d), curthread = %p (%d)\n", |
| + PCPU_GET(fpcurthread), |
| + PCPU_GET(fpcurthread)->td_proc->p_pid, |
| + td, td->td_proc->p_pid); |
| + panic("npxdna"); |
| + } |
| + restore_npx_curthread(td, td->td_pcb); |
| + } |
| critical_exit(); |
| - |
| return (1); |
| } |
| |
| @@ -869,10 +884,22 @@ |
| xsaveopt((char *)addr, xsave_mask); |
| else |
| fpusave(addr); |
| - start_emulating(); |
| - PCPU_SET(fpcurthread, NULL); |
| } |
| |
| +void npxswitch(struct thread *td, struct pcb *pcb); |
| +void |
| +npxswitch(struct thread *td, struct pcb *pcb) |
| +{ |
| + |
| + if (lazy_fpu_switch || (td->td_pflags & TDP_KTHREAD) != 0 || |
| + !PCB_USER_FPU(pcb)) { |
| + start_emulating(); |
| + PCPU_SET(fpcurthread, NULL); |
| + } else if (PCPU_GET(fpcurthread) != td) { |
| + restore_npx_curthread(td, pcb); |
| + } |
| +} |
| + |
| /* |
| * Unconditionally save the current co-processor state across suspend and |
| * resume. |
| Index: sys/compat/linux/linux_ioctl.c |
| =================================================================== |
| --- sys/compat/linux/linux_ioctl.c (版本 333371) |
| +++ sys/compat/linux/linux_ioctl.c (版本 335465) |
| @@ -253,6 +253,7 @@ |
| } else if ((args->cmd & 0xffff) == LINUX_HDIO_GET_GEO_BIG) { |
| struct linux_hd_big_geometry hdbg; |
| |
| + memset(&hdbg, 0, sizeof(hdbg)); |
| hdbg.cylinders = fwcylinders; |
| hdbg.heads = fwheads; |
| hdbg.sectors = fwsectors; |
| @@ -2477,6 +2478,7 @@ |
| printf("%s(): ioctl %d on %.*s\n", __func__, |
| args->cmd & 0xffff, LINUX_IFNAMSIZ, lifname); |
| #endif |
| + memset(ifname, 0, sizeof(ifname)); |
| ifp = ifname_linux_to_bsd(td, lifname, ifname); |
| if (ifp == NULL) |
| return (EINVAL); |
| Index: sys/compat/linux/linux_ipc.c |
| =================================================================== |
| --- sys/compat/linux/linux_ipc.c (版本 333371) |
| +++ sys/compat/linux/linux_ipc.c (版本 335465) |
| @@ -548,6 +548,9 @@ |
| register_t rval; |
| int cmd, error; |
| |
| + memset(&linux_seminfo, 0, sizeof(linux_seminfo)); |
| + memset(&linux_semid64, 0, sizeof(linux_semid64)); |
| + |
| switch (args->cmd & ~LINUX_IPC_64) { |
| case LINUX_IPC_RMID: |
| cmd = IPC_RMID; |
| @@ -702,6 +705,8 @@ |
| struct l_msqid64_ds linux_msqid64; |
| struct msqid_ds bsd_msqid; |
| |
| + memset(&linux_msqid64, 0, sizeof(linux_msqid64)); |
| + |
| bsd_cmd = args->cmd & ~LINUX_IPC_64; |
| switch (bsd_cmd) { |
| case LINUX_IPC_INFO: |
| @@ -708,6 +713,7 @@ |
| case LINUX_MSG_INFO: { |
| struct l_msginfo linux_msginfo; |
| |
| + memset(&linux_msginfo, 0, sizeof(linux_msginfo)); |
| /* |
| * XXX MSG_INFO uses the same data structure but returns different |
| * dynamic counters in msgpool, msgmap, and msgtql fields. |
| @@ -833,6 +839,10 @@ |
| struct shmid_ds bsd_shmid; |
| int error; |
| |
| + memset(&linux_shm_info, 0, sizeof(linux_shm_info)); |
| + memset(&linux_shmid64, 0, sizeof(linux_shmid64)); |
| + memset(&linux_shminfo64, 0, sizeof(linux_shminfo64)); |
| + |
| switch (args->cmd & ~LINUX_IPC_64) { |
| |
| case LINUX_IPC_INFO: { |
| Index: sys/dev/ath/if_ath_btcoex.c |
| =================================================================== |
| --- sys/dev/ath/if_ath_btcoex.c (版本 333371) |
| +++ sys/dev/ath/if_ath_btcoex.c (版本 335465) |
| @@ -457,7 +457,7 @@ |
| * pointer for us to use below in reclaiming the buffer; |
| * may want to be more defensive. |
| */ |
| - outdata = malloc(outsize, M_TEMP, M_NOWAIT); |
| + outdata = malloc(outsize, M_TEMP, M_NOWAIT | M_ZERO); |
| if (outdata == NULL) { |
| error = ENOMEM; |
| goto bad; |
| @@ -466,6 +466,7 @@ |
| switch (id) { |
| default: |
| error = EINVAL; |
| + goto bad; |
| } |
| if (outsize < ad->ad_out_size) |
| ad->ad_out_size = outsize; |
| Index: sys/dev/ath/if_ath_ioctl.c |
| =================================================================== |
| --- sys/dev/ath/if_ath_ioctl.c (版本 333371) |
| +++ sys/dev/ath/if_ath_ioctl.c (版本 335465) |
| @@ -197,7 +197,7 @@ |
| * pointer for us to use below in reclaiming the buffer; |
| * may want to be more defensive. |
| */ |
| - outdata = malloc(outsize, M_TEMP, M_NOWAIT); |
| + outdata = malloc(outsize, M_TEMP, M_NOWAIT | M_ZERO); |
| if (outdata == NULL) { |
| error = ENOMEM; |
| goto bad; |
| Index: sys/dev/ath/if_ath_lna_div.c |
| =================================================================== |
| --- sys/dev/ath/if_ath_lna_div.c (版本 333371) |
| +++ sys/dev/ath/if_ath_lna_div.c (版本 335465) |
| @@ -187,7 +187,7 @@ |
| * pointer for us to use below in reclaiming the buffer; |
| * may want to be more defensive. |
| */ |
| - outdata = malloc(outsize, M_TEMP, M_NOWAIT); |
| + outdata = malloc(outsize, M_TEMP, M_NOWAIT | M_ZERO); |
| if (outdata == NULL) { |
| error = ENOMEM; |
| goto bad; |
| @@ -196,6 +196,7 @@ |
| switch (id) { |
| default: |
| error = EINVAL; |
| + goto bad; |
| } |
| if (outsize < ad->ad_out_size) |
| ad->ad_out_size = outsize; |
| Index: sys/dev/ath/if_ath_spectral.c |
| =================================================================== |
| --- sys/dev/ath/if_ath_spectral.c (版本 333371) |
| +++ sys/dev/ath/if_ath_spectral.c (版本 335465) |
| @@ -212,7 +212,7 @@ |
| * pointer for us to use below in reclaiming the buffer; |
| * may want to be more defensive. |
| */ |
| - outdata = malloc(outsize, M_TEMP, M_NOWAIT); |
| + outdata = malloc(outsize, M_TEMP, M_NOWAIT | M_ZERO); |
| if (outdata == NULL) { |
| error = ENOMEM; |
| goto bad; |
| @@ -275,6 +275,7 @@ |
| break; |
| default: |
| error = EINVAL; |
| + goto bad; |
| } |
| if (outsize < ad->ad_out_size) |
| ad->ad_out_size = outsize; |
| Index: sys/netinet/tcp_usrreq.c |
| =================================================================== |
| --- sys/netinet/tcp_usrreq.c (版本 333371) |
| +++ sys/netinet/tcp_usrreq.c (版本 335465) |
| @@ -1495,7 +1495,9 @@ |
| return (error); |
| } else if ((sopt->sopt_dir == SOPT_GET) && |
| (sopt->sopt_name == TCP_FUNCTION_BLK)) { |
| - strcpy(fsn.function_set_name, tp->t_fb->tfb_tcp_block_name); |
| + strncpy(fsn.function_set_name, tp->t_fb->tfb_tcp_block_name, |
| + TCP_FUNCTION_NAME_LEN_MAX); |
| + fsn.function_set_name[TCP_FUNCTION_NAME_LEN_MAX - 1] = '\0'; |
| fsn.pcbcnt = tp->t_fb->tfb_refcnt; |
| INP_WUNLOCK(inp); |
| error = sooptcopyout(sopt, &fsn, sizeof fsn); |
| Index: contrib/tzdata/Makefile |
| =================================================================== |
| --- contrib/tzdata/Makefile (版本 333371) |
| +++ contrib/tzdata/Makefile (版本 335465) |
| @@ -21,7 +21,7 @@ |
| |
| # Change the line below for your time zone (after finding the zone you want in |
| # the time zone files, or adding it to a time zone file). |
| -# Alternately, if you discover you've got the wrong time zone, you can just |
| +# Alternatively, if you discover you've got the wrong time zone, you can just |
| # zic -l rightzone |
| # to correct things. |
| # Use the command |
| @@ -38,7 +38,7 @@ |
| # template file are used to determine "spring forward" and "fall back" days and |
| # times; the environment variable itself specifies UT offsets of standard and |
| # daylight saving time. |
| -# Alternately, if you discover you've got the wrong time zone, you can just |
| +# Alternatively, if you discover you've got the wrong time zone, you can just |
| # zic -p rightzone |
| # to correct things. |
| # Use the command |
| @@ -236,14 +236,16 @@ |
| $(GCC_INSTRUMENT) \ |
| -Wall -Wextra \ |
| -Walloc-size-larger-than=100000 -Warray-bounds=2 \ |
| - -Wbad-function-cast -Wcast-align -Wdate-time \ |
| + -Wbad-function-cast -Wcast-align=strict -Wdate-time \ |
| -Wdeclaration-after-statement -Wdouble-promotion \ |
| -Wformat=2 -Wformat-overflow=2 -Wformat-signedness -Wformat-truncation \ |
| -Winit-self -Wjump-misses-init -Wlogical-op \ |
| -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \ |
| -Wold-style-definition -Woverlength-strings -Wpointer-arith \ |
| - -Wshadow -Wshift-overflow=2 -Wstrict-prototypes -Wstringop-overflow=5 \ |
| + -Wshadow -Wshift-overflow=2 -Wstrict-prototypes -Wstringop-overflow=4 \ |
| + -Wstringop-truncation -Wsuggest-attribute=cold \ |
| -Wsuggest-attribute=const -Wsuggest-attribute=format \ |
| + -Wsuggest-attribute=malloc \ |
| -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure \ |
| -Wtrampolines -Wundef -Wuninitialized -Wunused \ |
| -Wvariadic-macros -Wvla -Wwrite-strings \ |
| @@ -514,6 +516,7 @@ |
| tzfile.5 tzfile.h tzselect.8 tzselect.ksh \ |
| workman.sh yearistype.sh \ |
| zdump.8 zdump.c zic.8 zic.c \ |
| + ziguard.awk zishrink.awk \ |
| zone.tab zone1970.tab zoneinfo2tdf.pl |
| |
| # And for the benefit of csh users on systems that assume the user |
| @@ -559,8 +562,8 @@ |
| |
| # These files can be tailored by setting BACKWARD, PACKRATDATA, etc. |
| vanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS) |
| - $(AWK) -v outfile='$@' -f ziguard.awk $(TDATA) $(PACKRATDATA) \ |
| - >$@.out |
| + $(AWK) -v DATAFORM=`expr $@ : '\(.*\).zi'` -f ziguard.awk \ |
| + $(TDATA) $(PACKRATDATA) >$@.out |
| mv $@.out $@ |
| tzdata.zi: $(DATAFORM).zi version |
| version=`sed 1q version` && \ |
| @@ -900,6 +903,13 @@ |
| done |
| rm -fr time_t.dir |
| |
| +TRADITIONAL_ASC = \ |
| + tzcode$(VERSION).tar.gz.asc \ |
| + tzdata$(VERSION).tar.gz.asc |
| +ALL_ASC = $(TRADITIONAL_ASC) \ |
| + tzdata$(VERSION)-rearguard.tar.gz.asc \ |
| + tzdb-$(VERSION).tar.lz.asc |
| + |
| tarballs traditional_tarballs signatures traditional_signatures: version |
| VERSION=`cat version` && \ |
| $(MAKE) VERSION="$$VERSION" $@_version |
| @@ -907,12 +917,13 @@ |
| # These *_version rules are intended for use if VERSION is set by some |
| # other means. Ordinarily these rules are used only by the above |
| # non-_version rules, which set VERSION on the 'make' command line. |
| -tarballs_version: traditional_tarballs_version tzdb-$(VERSION).tar.lz |
| +tarballs_version: traditional_tarballs_version \ |
| + tzdata$(VERSION)-rearguard.tar.gz \ |
| + tzdb-$(VERSION).tar.lz |
| traditional_tarballs_version: \ |
| tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz |
| -signatures_version: traditional_signatures_version tzdb-$(VERSION).tar.lz.asc |
| -traditional_signatures_version: \ |
| - tzcode$(VERSION).tar.gz.asc tzdata$(VERSION).tar.gz.asc \ |
| +signatures_version: $(ALL_ASC) |
| +traditional_signatures_version: $(TRADITIONAL_ASC) |
| |
| tzcode$(VERSION).tar.gz: set-timestamps.out |
| LC_ALL=C && export LC_ALL && \ |
| @@ -927,6 +938,26 @@ |
| gzip $(GZIPFLAGS) >$@.out |
| mv $@.out $@ |
| |
| +tzdata$(VERSION)-rearguard.tar.gz: rearguard.zi set-timestamps.out |
| + rm -fr tzdata$(VERSION)-rearguard.dir |
| + mkdir tzdata$(VERSION)-rearguard.dir |
| + ln $(COMMON) $(DATA) $(MISC) tzdata$(VERSION)-rearguard.dir |
| + cd tzdata$(VERSION)-rearguard.dir && \ |
| + rm -f $(TDATA) $(PACKRATDATA) version |
| + for f in $(TDATA) $(PACKRATDATA); do \ |
| + rearf=tzdata$(VERSION)-rearguard.dir/$$f; \ |
| + $(AWK) -v DATAFORM=rearguard -f ziguard.awk $$f >$$rearf && \ |
| + touch -cmr `ls -t ziguard.awk $$f` $$rearf || exit; \ |
| + done |
| + sed '1s/$$/-rearguard/' \ |
| + <version >tzdata$(VERSION)-rearguard.dir/version |
| + touch -cmr version tzdata$(VERSION)-rearguard.dir/version |
| + LC_ALL=C && export LC_ALL && \ |
| + (cd tzdata$(VERSION)-rearguard.dir && \ |
| + tar $(TARFLAGS) -cf - $(COMMON) $(DATA) $(MISC) | \ |
| + gzip $(GZIPFLAGS)) >$@.out |
| + mv $@.out $@ |
| + |
| tzdb-$(VERSION).tar.lz: set-timestamps.out |
| rm -fr tzdb-$(VERSION) |
| mkdir tzdb-$(VERSION) |
| @@ -937,12 +968,10 @@ |
| mv $@.out $@ |
| |
| tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz |
| - gpg --armor --detach-sign $? |
| - |
| tzdata$(VERSION).tar.gz.asc: tzdata$(VERSION).tar.gz |
| - gpg --armor --detach-sign $? |
| - |
| +tzdata$(VERSION)-rearguard.tar.gz.asc: tzdata$(VERSION)-rearguard.tar.gz |
| tzdb-$(VERSION).tar.lz.asc: tzdb-$(VERSION).tar.lz |
| +$(ALL_ASC): |
| gpg --armor --detach-sign $? |
| |
| typecheck: |
| Index: contrib/tzdata/NEWS |
| =================================================================== |
| --- contrib/tzdata/NEWS (版本 333371) |
| +++ contrib/tzdata/NEWS (版本 335465) |
| @@ -1,5 +1,69 @@ |
| News for the tz database |
| |
| +Release 2018e - 2018-05-01 23:42:51 -0700 |
| + |
| + Briefly: |
| + |
| + North Korea switches back to +09 on 2018-05-05. |
| + The main format uses negative DST again, for Ireland etc. |
| + 'make tarballs' now also builds a rearguard tarball. |
| + New 's' and 'd' suffixes in SAVE columns of Rule and Zone lines. |
| + |
| + Changes to past and future time stamps |
| + |
| + North Korea switches back from +0830 to +09 on 2018-05-05. |
| + (Thanks to Kang Seonghoon, Arthur David Olson, Seo Sanghyeon, |
| + and Tim Parenti.) |
| + |
| + Bring back the negative-DST changes of 2018a, except be more |
| + compatible with data parsers that do not support negative DST. |
| + Also, this now affects historical time stamps in Namibia and the |
| + former Czechoslovakia, not just Ireland. The main format now uses |
| + negative DST to model time stamps in Europe/Dublin (from 1971 on), |
| + Europe/Prague (1946/7), and Africa/Windhoek (1994/2017). This |
| + does not affect UT offsets, only time zone abbreviations and the |
| + tm_isdst flag. Also, this does not affect rearguard or vanguard |
| + formats; effectively the main format now uses vanguard instead of |
| + rearguard format. Data parsers that do not support negative DST |
| + can still use data from the rearguard tarball described below. |
| + |
| + Changes to build procedure |
| + |
| + The command 'make tarballs' now also builds the tarball |
| + tzdataVERSION-rearguard.tar.gz, which is like tzdataVERSION.tar.gz |
| + except that it uses rearguard format intended for trailing-edge |
| + data parsers. |
| + |
| + Changes to data format and to code |
| + |
| + The SAVE column of Rule and Zone lines can now have an 's' or 'd' |
| + suffix, which specifies whether the adjusted time is standard time |
| + or daylight saving time. If no suffix is given, daylight saving |
| + time is used if and only if the SAVE column is nonzero; this is |
| + the longstanding behavior. Although this new feature is not used |
| + in tzdata, it could be used to specify the legal time in Namibia |
| + 1994-2017, as opposed to the popular time (see below). |
| + |
| + Changes to past time stamps |
| + |
| + From 1994 through 2017 Namibia observed DST in winter, not summer. |
| + That is, it used negative DST, as Ireland still does. This change |
| + does not affect UTC offsets; it affects only the tm_isdst flag and |
| + the abbreviation used during summer, which is now CAT, not WAST. |
| + Although (as noted by Michael Deckers) summer and winter time were |
| + both simply called "standard time" in Namibian law, in common |
| + practice winter time was considered to be DST (as noted by Stephen |
| + Colebourne). The full effect of this change is only in vanguard |
| + format; in rearguard and main format, the tm_isdst flag is still |
| + zero in winter and nonzero in summer. |
| + |
| + In 1946/7 Czechoslovakia also observed negative DST in winter. |
| + The full effect of this change is only in vanguard format; in |
| + rearguard and main formats, it is modeled as plain GMT without |
| + daylight saving. Also, the dates of some 1944/5 DST transitions |
| + in Czechoslovakia have been changed. |
| + |
| + |
| Release 2018d - 2018-03-22 07:05:46 -0700 |
| |
| Briefly: |
| @@ -39,7 +103,7 @@ |
| Enderbury and Kiritimati skipped New Year's Eve 1994, not |
| New Year's Day 1995. (Thanks to Kerry Shetline.) |
| |
| - Fix the 1912-01-01 transition for Portugual and its colonies. |
| + Fix the 1912-01-01 transition for Portugal and its colonies. |
| This transition was at 00:00 according to the new UT offset, not |
| according to the old one. Also assume that Cape Verde switched on |
| the same date as the rest, not in 1907. This affects |
| Index: contrib/tzdata/africa |
| =================================================================== |
| --- contrib/tzdata/africa (版本 333371) |
| +++ contrib/tzdata/africa (版本 335465) |
| @@ -6,7 +6,7 @@ |
| # tz@iana.org for general use in the future). For more, please see |
| # the file CONTRIBUTING in the tz distribution. |
| |
| -# From Paul Eggert (2017-02-20): |
| +# From Paul Eggert (2017-04-09): |
| # |
| # Unless otherwise specified, the source for data through 1990 is: |
| # Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition), |
| @@ -52,7 +52,7 @@ |
| # cannot now come up with solid citations. |
| # |
| # I invented the following abbreviations; corrections are welcome! |
| -# +02 WAST West Africa Summer Time |
| +# +02 WAST West Africa Summer Time (no longer used) |
| # +03 CAST Central Africa Summer Time (no longer used) |
| # +03 SAST South Africa Summer Time (no longer used) |
| # +03 EAT East Africa Time |
| @@ -967,6 +967,10 @@ |
| # commence at OOhOO on Monday 21 March 1994 and shall end at 02h00 on |
| # Sunday 4 September 1994. |
| |
| +# From Michael Deckers (2017-04-06): |
| +# ... both summer and winter time are called "standard" |
| +# (which differs from the use in Ireland) ... |
| + |
| # From Petronella Sibeene (2007-03-30): |
| # http://allafrica.com/stories/200703300178.html |
| # While the entire country changes its time, Katima Mulilo and other |
| @@ -992,10 +996,26 @@ |
| # the same time they would normally start DST, the first Sunday in September: |
| # https://www.timeanddate.com/news/time/namibia-new-time-zone.html |
| |
| +# From Paul Eggert (2017-04-09): |
| +# Before the change, summer and winter time were both standard time legally. |
| +# However in common parlance, winter time was considered to be DST. See, e.g.: |
| +# http://www.nbc.na/news/namibias-winter-time-could-be-scrapped.2706 |
| +# https://zone.my.na/news/times-are-changing-in-namibia |
| +# https://www.newera.com.na/2017/02/23/namibias-winter-time-might-be-repealed/ |
| +# Use plain "WAT" and "CAT" for the time zone abbreviations, to be compatible |
| +# with Namibia's neighbors. |
| + |
| # RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S |
| -Rule Namibia 1994 only - Mar 21 0:00 0 - |
| -Rule Namibia 1994 2016 - Sep Sun>=1 2:00 1:00 S |
| -Rule Namibia 1995 2017 - Apr Sun>=1 2:00 0 - |
| +# Vanguard section, for zic and other parsers that support negative DST. |
| +Rule Namibia 1994 only - Mar 21 0:00 -1:00 WAT |
| +Rule Namibia 1994 2017 - Sep Sun>=1 2:00 0 CAT |
| +Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT |
| +# Rearguard section, for parsers that do not support negative DST. |
| +#Rule Namibia 1994 only - Mar 21 0:00 0 WAT |
| +#Rule Namibia 1994 2017 - Sep Sun>=1 2:00 1:00 CAT |
| +#Rule Namibia 1995 2017 - Apr Sun>=1 2:00 0 WAT |
| +# End of rearguard section. |
| + |
| # Zone NAME GMTOFF RULES FORMAT [UNTIL] |
| Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8 |
| 1:30 - +0130 1903 Mar |
| @@ -1002,9 +1022,16 @@ |
| 2:00 - SAST 1942 Sep 20 2:00 |
| 2:00 1:00 SAST 1943 Mar 21 2:00 |
| 2:00 - SAST 1990 Mar 21 # independence |
| - 2:00 - CAT 1994 Mar 21 0:00 |
| - 1:00 Namibia WA%sT 2017 Sep 3 2:00 |
| - 2:00 - CAT |
| +# Vanguard section, for zic and other parsers that support negative DST. |
| + 2:00 Namibia %s |
| +# Rearguard section, for parsers that do not support negative DST. |
| +# 2:00 - CAT 1994 Mar 21 0:00 |
| +# From Paul Eggert (2017-04-07): |
| +# The official date of the 2017 rule change was 2017-10-24. See: |
| +# http://www.lac.org.na/laws/annoSTAT/Namibian%20Time%20Act%209%20of%202017.pdf |
| +# 1:00 Namibia %s 2017 Oct 24 |
| +# 2:00 - CAT |
| +# End of rearguard section. |
| |
| # Niger |
| # See Africa/Lagos. |
| Index: contrib/tzdata/asia |
| =================================================================== |
| --- contrib/tzdata/asia (版本 333371) |
| +++ contrib/tzdata/asia (版本 335465) |
| @@ -1983,6 +1983,19 @@ |
| # There is no common English-language abbreviation for this time zone. |
| # Use KST, as that's what we already use for 1954-1961 in ROK. |
| |
| +# From Kang Seonghoon (2018-04-29): |
| +# North Korea will revert its time zone from UTC+8:30 (PYT; Pyongyang |
| +# Time) back to UTC+9 (KST; Korea Standard Time). |
| +# |
| +# From Seo Sanghyeon (2018-04-30): |
| +# Rodong Sinmun 2018-04-30 announced Pyongyang Time transition plan. |
| +# https://www.nknews.org/kcna/wp-content/uploads/sites/5/2018/04/rodong-2018-04-30.pdf |
| +# ... the transition date is 2018-05-05 ... Citation should be Decree |
| +# No. 2232 of April 30, 2018, of the Presidium of the Supreme People's |
| +# Assembly, as published in Rodong Sinmun. |
| +# From Tim Parenti (2018-04-29): |
| +# It appears to be the front page story at the top in the right-most column. |
| + |
| # Zone NAME GMTOFF RULES FORMAT [UNTIL] |
| Zone Asia/Seoul 8:27:52 - LMT 1908 Apr 1 |
| 8:30 - KST 1912 Jan 1 |
| @@ -1994,7 +2007,8 @@ |
| 8:30 - KST 1912 Jan 1 |
| 9:00 - JST 1945 Aug 24 |
| 9:00 - KST 2015 Aug 15 00:00 |
| - 8:30 - KST |
| + 8:30 - KST 2018 May 5 |
| + 9:00 - KST |
| |
| ############################################################################### |
| |
| @@ -2658,7 +2672,7 @@ |
| # From Sharef Mustafa (2018-03-16): |
| # Palestine summer time will start on Mar 24th 2018 by advancing the |
| # clock by 60 minutes as per Palestinian cabinet decision published on |
| -# the offical website, though the decree did not specify the exact |
| +# the official website, though the decree did not specify the exact |
| # time of the time shift. |
| # http://www.palestinecabinet.gov.ps/Website/AR/NDecrees/ViewFile.ashx?ID=e7a42ab7-ee23-435a-b9c8-a4f7e81f3817 |
| # |
| Index: contrib/tzdata/australasia |
| =================================================================== |
| --- contrib/tzdata/australasia (版本 333371) |
| +++ contrib/tzdata/australasia (版本 335465) |
| @@ -1085,6 +1085,15 @@ |
| # (1999-09-27) writes that Giles Meteorological Station uses |
| # South Australian time even though it's located in Western Australia. |
| |
| +# From Paul Eggert (2018-04-01): |
| +# The Guardian Express of Perth, Australia reported today that the |
| +# government decided to advance the clocks permanently on January 1, |
| +# 2019, from UT +08 to UT +09. The article noted that an exemption |
| +# would be made for people aged 61 and over, who "can apply in writing |
| +# to have the extra hour of sunshine removed from their area." See: |
| +# Daylight saving coming to WA in 2019. Guardian Express. 2018-04-01. |
| +# https://www.communitynews.com.au/guardian-express/news/exclusive-daylight-savings-coming-wa-summer-2018/ |
| + |
| # Queensland |
| |
| # From Paul Eggert (2018-02-26): |
| Index: contrib/tzdata/europe |
| =================================================================== |
| --- contrib/tzdata/europe (版本 333371) |
| +++ contrib/tzdata/europe (版本 335465) |
| @@ -528,13 +528,13 @@ |
| # summer and negative daylight saving time in winter. It is for when |
| # negative SAVE values are used. |
| # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S |
| -#Rule Eire 1971 only - Oct 31 2:00u -1:00 GMT |
| -#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 IST |
| -#Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 GMT |
| -#Rule Eire 1981 max - Mar lastSun 1:00u 0 IST |
| -#Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 GMT |
| -#Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 GMT |
| -#Rule Eire 1996 max - Oct lastSun 1:00u -1:00 GMT |
| +Rule Eire 1971 only - Oct 31 2:00u -1:00 - |
| +Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 - |
| +Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 - |
| +Rule Eire 1981 max - Mar lastSun 1:00u 0 - |
| +Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 - |
| +Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 - |
| +Rule Eire 1996 max - Oct lastSun 1:00u -1:00 - |
| |
| # Zone NAME GMTOFF RULES FORMAT [UNTIL] |
| Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2 |
| @@ -548,11 +548,11 @@ |
| 0:00 - GMT 1948 Apr 18 2:00s |
| 0:00 GB-Eire GMT/IST 1968 Oct 27 |
| # The next line is for when negative SAVE values are used. |
| -# 1:00 Eire IST/GMT |
| + 1:00 Eire IST/GMT |
| # These three lines are for when SAVE values are always nonnegative. |
| - 1:00 - IST 1971 Oct 31 2:00u |
| - 0:00 GB-Eire GMT/IST 1996 |
| - 0:00 EU GMT/IST |
| +# 1:00 - IST 1971 Oct 31 2:00u |
| +# 0:00 GB-Eire GMT/IST 1996 |
| +# 0:00 EU GMT/IST |
| |
| |
| ############################################################################### |
| @@ -970,18 +970,30 @@ |
| # Please see the 'asia' file for Asia/Nicosia. |
| |
| # Czech Republic / Czechia |
| +# |
| +# From Paul Eggert (2018-04-15): |
| +# The source for Czech data is: Kdy začíná a končí letní čas. 2018-04-15. |
| +# https://kalendar.beda.cz/kdy-zacina-a-konci-letni-cas |
| +# We know of no English-language name for historical Czech winter time; |
| +# abbreviate it as "GMT", as it happened to be GMT. |
| +# |
| # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S |
| -Rule Czech 1945 only - Apr 8 2:00s 1:00 S |
| -Rule Czech 1945 only - Nov 18 2:00s 0 - |
| +Rule Czech 1945 only - Apr Mon>=1 2:00s 1:00 S |
| +Rule Czech 1945 only - Oct 1 2:00s 0 - |
| Rule Czech 1946 only - May 6 2:00s 1:00 S |
| Rule Czech 1946 1949 - Oct Sun>=1 2:00s 0 - |
| -Rule Czech 1947 only - Apr 20 2:00s 1:00 S |
| -Rule Czech 1948 only - Apr 18 2:00s 1:00 S |
| +Rule Czech 1947 1948 - Apr Sun>=15 2:00s 1:00 S |
| Rule Czech 1949 only - Apr 9 2:00s 1:00 S |
| # Zone NAME GMTOFF RULES FORMAT [UNTIL] |
| Zone Europe/Prague 0:57:44 - LMT 1850 |
| 0:57:44 - PMT 1891 Oct # Prague Mean Time |
| - 1:00 C-Eur CE%sT 1944 Sep 17 2:00s |
| + 1:00 C-Eur CE%sT 1945 May 9 |
| + 1:00 Czech CE%sT 1946 Dec 1 3:00 |
| +# Vanguard section, for zic and other parsers that support negative DST. |
| + 1:00 -1:00 GMT 1947 Feb 23 2:00 |
| +# Rearguard section, for parsers that do not support negative DST. |
| +# 0:00 - GMT 1947 Feb 23 2:00 |
| +# End of rearguard section. |
| 1:00 Czech CE%sT 1979 |
| 1:00 EU CE%sT |
| # Use Europe/Prague also for Slovakia. |
| @@ -2016,7 +2028,7 @@ |
| Rule Neth 1945 only - Apr 2 2:00s 1:00 S |
| Rule Neth 1945 only - Sep 16 2:00s 0 - |
| # |
| -# Amsterdam Mean Time was +00:19:32.13 exactly, but the .13 is omitted |
| +# Amsterdam Mean Time was +00:19:32.13, but the .13 is omitted |
| # below because the current format requires GMTOFF to be an integer. |
| # Zone NAME GMTOFF RULES FORMAT [UNTIL] |
| Zone Europe/Amsterdam 0:19:32 - LMT 1835 |
| Index: contrib/tzdata/theory.html |
| =================================================================== |
| --- contrib/tzdata/theory.html (版本 333371) |
| +++ contrib/tzdata/theory.html (版本 335465) |
| @@ -32,7 +32,7 @@ |
| It organizes <a href="tz-link.html">time zone and daylight saving time |
| data</a> by partitioning the world into <a |
| href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones">regions</a> |
| -whose clocks all agree about timestamps that occur after the of the <a |
| +whose clocks all agree about timestamps that occur after the <a |
| href="https://en.wikipedia.org/wiki/Unix_time">POSIX Epoch</a> |
| (1970-01-01 00:00:00 <a |
| href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time"><abbr |
| @@ -53,7 +53,7 @@ |
| applications requiring accurate handling of all past times everywhere, |
| as it would take far too much effort and guesswork to record all |
| details of pre-1970 civil timekeeping. |
| -Athough some information outside the scope of the database is |
| +Although some information outside the scope of the database is |
| collected in a file <code>backzone</code> that is distributed along |
| with the database proper, this file is less reliable and does not |
| necessarily follow database guidelines. |
| @@ -68,7 +68,7 @@ |
| href="https://en.wikipedia.org/wiki/Unix">UNIX</a>-like systems. |
| As of this writing, the current edition of POSIX is: <a |
| href="http://pubs.opengroup.org/onlinepubs/9699919799/"> The Open |
| -Group Base Specifications Issue 7</a>, IEEE Std 1003.1-2008, 2016 |
| +Group Base Specifications Issue 7</a>, IEEE Std 1003.1-2017, 2018 |
| Edition. |
| Because the database's scope encompasses real-world changes to civil |
| timekeeping, its model for describing time is more complex than the |
| @@ -79,7 +79,7 @@ |
| can change at times. |
| Whether and when a <code><abbr>tz</abbr></code> region changes its |
| clock, and even the region's notional base offset from UTC, are variable. |
| -It doesn't even really make sense to talk about a region's |
| +It does not always make sense to talk about a region's |
| "base offset", since it is not necessarily a single number. |
| </p> |
| |
| @@ -92,8 +92,8 @@ |
| corresponds to a set of time zone rules. |
| Inexperienced users are not expected to select these names unaided. |
| Distributors should provide documentation and/or a simple selection |
| -interface that explains the names; for one example, see the 'tzselect' |
| -program in the <code><abbr>tz</abbr></code> code. |
| +interface that explains the names; for one example, see the |
| +<code>tzselect</code> program in the <code><abbr>tz</abbr></code> code. |
| The <a href="http://cldr.unicode.org/">Unicode Common Locale Data |
| Repository</a> contains data that may be useful for other selection |
| interfaces. |
| @@ -137,6 +137,9 @@ |
| North and South America share the same area, '<code>America</code>'. |
| Typical names are '<code>Africa/Cairo</code>', |
| '<code>America/New_York</code>', and '<code>Pacific/Honolulu</code>'. |
| +Some names are further qualified to help avoid confusion; for example, |
| +'<code>America/Indiana/Petersburg</code>' distinguishes Petersburg, |
| +Indiana from other Petersburgs in America. |
| </p> |
| |
| <p> |
| @@ -159,7 +162,8 @@ |
| <code>TZ</code> strings</a>. |
| A file name component must not exceed 14 characters or start with |
| '<code>-</code>'. |
| - E.g., prefer '<code>Brunei</code>' to '<code>Bandar_Seri_Begawan</code>'. |
| + E.g., prefer <code>Asia/Brunei</code> to |
| + <code>Asia/Bandar_Seri_Begawan</code>. |
| Exceptions: see the discussion of legacy names below. |
| </li> |
| <li> |
| @@ -177,8 +181,8 @@ |
| name <var>AB</var> (ignoring case), then <var>B</var> must not |
| start with '<code>/</code>', as a regular file cannot have the |
| same name as a directory in POSIX. |
| - For example, '<code>America/New_York</code>' precludes |
| - '<code>America/New_York/Bronx</code>'. |
| + For example, <code>America/New_York</code> precludes |
| + <code>America/New_York/Bronx</code>. |
| </li> |
| <li> |
| Uninhabited regions like the North Pole and Bouvet Island |
| @@ -193,7 +197,7 @@ |
| </li> |
| <li> |
| If all the clocks in a region have agreed since 1970, |
| - don't bother to include more than one location |
| + do not bother to include more than one location |
| even if subregions' clocks disagreed before 1970. |
| Otherwise these tables would become annoyingly large. |
| </li> |
| @@ -200,8 +204,9 @@ |
| <li> |
| If a name is ambiguous, use a less ambiguous alternative; |
| e.g., many cities are named San José and Georgetown, so |
| - prefer '<code>Costa_Rica</code>' to '<code>San_Jose</code>' and |
| - '<code>Guyana</code>' to '<code>Georgetown</code>'. |
| + prefer <code>America/Costa_Rica</code> to |
| + <code>America/San_Jose</code> and <code>America/Guyana</code> |
| + to <code>America/Georgetown</code>. |
| </li> |
| <li> |
| Keep locations compact. |
| @@ -208,35 +213,40 @@ |
| Use cities or small islands, not countries or regions, so that any |
| future changes do not split individual locations into different |
| <code><abbr>tz</abbr></code> regions. |
| - E.g., prefer '<code>Paris</code>' to '<code>France</code>', since |
| + E.g., prefer <code>Europe/Paris</code> to <code>Europe/France</code>, |
| + since |
| <a href="https://en.wikipedia.org/wiki/Time_in_France#History">France |
| has had multiple time zones</a>. |
| </li> |
| <li> |
| - Use mainstream English spelling, e.g., prefer '<code>Rome</code>' |
| - to '<code>Roma</code>', and prefer '<code>Athens</code>' to the |
| - Greek '<code>Αθήνα</code>' or the Romanized '<code>Athína</code>'. |
| + Use mainstream English spelling, e.g., prefer |
| + <code>Europe/Rome</code> to <code>Europe/Roma</code>, and |
| + prefer <code>Europe/Athens</code> to the Greek |
| + <code>Europe/Αθήνα</code> or the Romanized |
| + <code>Europe/Athína</code>. |
| The POSIX file name restrictions encourage this guideline. |
| </li> |
| <li> |
| Use the most populous among locations in a region, |
| - e.g., prefer '<code>Shanghai</code>' to |
| - '<code>Beijing</code>'. |
| + e.g., prefer <code>Asia/Shanghai</code> to |
| + <code>Asia/Beijing</code>. |
| Among locations with similar populations, pick the best-known |
| - location, e.g., prefer '<code>Rome</code>' to |
| - '<code>Milan</code>'. |
| + location, e.g., prefer <code>Europe/Rome</code> to |
| + <code>Europe/Milan</code>. |
| </li> |
| <li> |
| - Use the singular form, e.g., prefer '<code>Canary</code>' to |
| - '<code>Canaries</code>'. |
| + Use the singular form, e.g., prefer <code>Atlantic/Canary</code> to |
| + <code>Atlantic/Canaries</code>. |
| </li> |
| <li> |
| Omit common suffixes like '<code>_Islands</code>' and |
| '<code>_City</code>', unless that would lead to ambiguity. |
| - E.g., prefer '<code>Cayman</code>' to |
| - '<code>Cayman_Islands</code>' and '<code>Guatemala</code>' to |
| - '<code>Guatemala_City</code>', but prefer |
| - '<code>Mexico_City</code>' to '<code>Mexico</code>' |
| + E.g., prefer <code>America/Cayman</code> to |
| + <code>America/Cayman_Islands</code> and |
| + <code>America/Guatemala</code> to |
| + <code>America/Guatemala_City</code>, but prefer |
| + <code>America/Mexico_City</code> to |
| + <code>America/Mexico</code> |
| because <a href="https://en.wikipedia.org/wiki/Time_in_Mexico">the |
| country of Mexico has several time zones</a>. |
| </li> |
| @@ -245,13 +255,14 @@ |
| </li> |
| <li> |
| Omit '<code>.</code>' from abbreviations in names. |
| - E.g., prefer '<code>St_Helena</code>' to '<code>St._Helena</code>'. |
| + E.g., prefer <code>Atlantic/St_Helena</code> to |
| + <code>Atlantic/St._Helena</code>. |
| </li> |
| <li> |
| Do not change established names if they only marginally violate |
| the above guidelines. |
| - For example, don't change the existing name '<code>Rome</code>' to |
| - '<code>Milan</code>' merely because Milan's population has grown |
| + For example, do not change the existing name <code>Europe/Rome</code> to |
| + <code>Europe/Milan</code> merely because Milan's population has grown |
| to be somewhat greater than Rome's. |
| </li> |
| <li> |
| @@ -318,8 +329,10 @@ |
| Use three to six characters that are ASCII alphanumerics or |
| '<code>+</code>' or '<code>-</code>'. |
| Previous editions of this database also used characters like |
| - '<code> </code>' and '<code>?</code>', but these characters have a |
| - special meaning to the shell and cause commands like |
| + space and '<code>?</code>', but these characters have a |
| + special meaning to the |
| + <a href="https://en.wikipedia.org/wiki/Unix_shell">UNIX shell</a> |
| + and cause commands like |
| '<code><a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set">set</a> |
| `<a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html">date</a>`</code>' |
| to have unexpected effects. |
| @@ -688,7 +701,7 @@ |
| subsecond accuracy is needed. |
| </li> |
| <li> |
| - Civil time was not based on atomic time before 1972, and we don't |
| + Civil time was not based on atomic time before 1972, and we do not |
| know the history of |
| <a href="https://en.wikipedia.org/wiki/Earth's_rotation">earth's |
| rotation</a> accurately enough to map <a |
| @@ -720,7 +733,7 @@ |
| Ideally it would contain information about when data entries are |
| incomplete or dicey. |
| Partial temporal knowledge is a field of active research, though, |
| - and it's not clear how to apply it here. |
| + and it is not clear how to apply it here. |
| </li> |
| </ul> |
| |
| @@ -764,7 +777,7 @@ |
| Unfortunately, the POSIX |
| <code>TZ</code> string takes a form that is hard to describe and |
| is error-prone in practice. |
| - Also, POSIX <code>TZ</code> strings can't deal with daylight |
| + Also, POSIX <code>TZ</code> strings cannot deal with daylight |
| saving time rules not based on the Gregorian calendar (as in |
| Iran), or with situations where more than two time zone |
| abbreviations or <abbr>UT</abbr> offsets are used in an area. |
| @@ -874,7 +887,7 @@ |
| need access to multiple time zone rulesets. |
| </li> |
| <li> |
| - In POSIX, there's no tamper-proof way for a process to learn the |
| + In POSIX, there is no tamper-proof way for a process to learn the |
| system's best idea of local wall clock. |
| (This is important for applications that an administrator wants |
| used only at certain times – without regard to whether the |
| @@ -973,14 +986,16 @@ |
| by subsequent calls to <code>localtime</code>. |
| Source code for portable applications that "must" run on local wall |
| clock time should call <code>tzsetwall</code>; |
| - if such code is moved to "old" systems that don't |
| - provide <code>tzsetwall</code>, you won't be able to generate an |
| + if such code is moved to "old" systems that do not |
| + provide <code>tzsetwall</code>, you will not be able to generate an |
| executable program. |
| (These functions also arrange for local wall clock time to |
| be used if <code>tzset</code> is called – directly or |
| - indirectly – and there's no <code>TZ</code> environment |
| + indirectly – and there is no <code>TZ</code> environment |
| variable; portable applications should not, however, rely on this |
| - behavior since it's not the way SVR2 systems behave.) |
| + behavior since it is not the way <a |
| + href="https://en.wikipedia.org/wiki/UNIX_System_V#SVR2"><abbr>SVR2</abbr></a> |
| + systems behave.) |
| </li> |
| <li> |
| Negative <code>time_t</code> values are supported, on systems |
| @@ -1040,7 +1055,7 @@ |
| <li> |
| The <a href="https://en.wikipedia.org/wiki/Version_7_Unix">7th Edition |
| UNIX</a> <code>timezone</code> function is not present in this |
| - package; it's impossible to reliably map <code>timezone</code>'s |
| + package; it is impossible to reliably map <code>timezone</code>'s |
| arguments (a "minutes west of <abbr>GMT</abbr>" value and a |
| "daylight saving time in effect" flag) to a time zone |
| abbreviation, and we refuse to guess. |
| @@ -1052,7 +1067,9 @@ |
| zone abbreviation to use. |
| </li> |
| <li> |
| - The <abbr>4.2BSD</abbr> <code>gettimeofday</code> function is not |
| + The <a |
| + href="https://en.wikipedia.org/wiki/History_of_the_Berkeley_Software_Distribution#4.2BSD"><abbr>4.2BSD</abbr></a> |
| + <code>gettimeofday</code> function is not |
| used in this package. |
| This formerly let users obtain the current <abbr>UTC</abbr> offset |
| and <abbr>DST</abbr> flag, but this functionality was removed in |
| @@ -1061,7 +1078,7 @@ |
| <li> |
| In <abbr>SVR2</abbr>, time conversion fails for near-minimum or |
| near-maximum <code>time_t</code> values when doing conversions |
| - for places that don't use <abbr>UT</abbr>. |
| + for places that do not use <abbr>UT</abbr>. |
| This package takes care to do these conversions correctly. |
| A comment in the source code tells how to get compatibly wrong |
| results. |
| @@ -1155,10 +1172,10 @@ |
| Calendrical issues are a bit out of scope for a time zone database, |
| but they indicate the sort of problems that we would run into if we |
| extended the time zone database further into the past. |
| -An excellent resource in this area is Nachum Dershowitz and Edward M. |
| -Reingold, <cite><a |
| -href="https://www.cs.tau.ac.il/~nachum/calendar-book/third-edition/">Calendrical |
| -Calculations: Third Edition</a></cite>, Cambridge University Press (2008). |
| +An excellent resource in this area is Edward M. Reingold |
| +and Nachum Dershowitz, <cite><a |
| +href="https://www.cambridge.org/fr/academic/subjects/computer-science/computing-general-interest/calendrical-calculations-ultimate-edition-4th-edition">Calendrical |
| +Calculations: The Ultimate Edition</a></cite>, Cambridge University Press (2018). |
| Other information and sources are given in the file '<code>calendars</code>' |
| in the <code><abbr>tz</abbr></code> distribution. |
| They sometimes disagree. |
| @@ -1170,11 +1187,11 @@ |
| <p> |
| Some people's work schedules |
| use <a href="https://en.wikipedia.org/wiki/Timekeeping on Mars">Mars time</a>. |
| -Jet Propulsion Laboratory (JPL) coordinators have kept Mars time on |
| -and off at least since 1997 for the |
| +Jet Propulsion Laboratory (JPL) coordinators kept Mars time on |
| +and off during the |
| <a href="https://en.wikipedia.org/wiki/Mars_Pathfinder#End_of_mission">Mars |
| Pathfinder</a> mission. |
| -Some of their family members have also adapted to Mars time. |
| +Some of their family members also adapted to Mars time. |
| Dozens of special Mars watches were built for JPL workers who kept |
| Mars time during the Mars Exploration Rovers mission (2004). |
| These timepieces look like normal Seikos and Citizens but use Mars |
| @@ -1262,7 +1279,7 @@ |
| Jia-Rui Chong, |
| "<a href="http://articles.latimes.com/2004/jan/14/science/sci-marstime14">Workdays |
| Fit for a Martian</a>", <cite>Los Angeles Times</cite> |
| - (2004-01-14), pp A1, A20-A21. |
| + (2004-01-14), pp A1, A20–A21. |
| </li> |
| <li> |
| Tom Chmielewski, |
| Index: contrib/tzdata/version |
| =================================================================== |
| --- contrib/tzdata/version (版本 333371) |
| +++ contrib/tzdata/version (版本 335465) |
| @@ -1 +1 @@ |
| -2018d |
| +2018e |
| Index: contrib/tzdata/ziguard.awk |
| =================================================================== |
| --- contrib/tzdata/ziguard.awk (版本 333371) |
| +++ contrib/tzdata/ziguard.awk (版本 335465) |
| @@ -13,20 +13,31 @@ |
| # rearguard format. |
| |
| BEGIN { |
| - dst_type["vanguard.zi"] = 1 |
| - dst_type["main.zi"] = 1 |
| - dst_type["rearguard.zi"] = 1 |
| + dataform_type["vanguard"] = 1 |
| + dataform_type["main"] = 1 |
| + dataform_type["rearguard"] = 1 |
| |
| - # The command line should set OUTFILE to the name of the output file. |
| - if (!dst_type[outfile]) exit 1 |
| - vanguard = outfile == "vanguard.zi" |
| + # The command line should set DATAFORM. |
| + if (!dataform_type[DATAFORM]) exit 1 |
| + vanguard = DATAFORM == "vanguard" |
| } |
| |
| /^Zone/ { zone = $2 } |
| |
| -outfile != "main.zi" { |
| +DATAFORM != "main" { |
| in_comment = /^#/ |
| + uncomment = comment_out = 0 |
| |
| + # If the line should differ due to Czechoslovakia using negative SAVE values, |
| + # uncomment the desired version and comment out the undesired one. |
| + if (zone == "Europe/Prague" && /1947 Feb 23/) { |
| + if (($(in_comment + 2) != "-") == vanguard) { |
| + uncomment = in_comment |
| + } else { |
| + comment_out = !in_comment |
| + } |
| + } |
| + |
| # If this line should differ due to Ireland using negative SAVE values, |
| # uncomment the desired version and comment out the undesired one. |
| Rule_Eire = /^#?Rule[\t ]+Eire[\t ]/ |
| @@ -37,11 +48,38 @@ |
| if ((Rule_Eire \ |
| || (Zone_Dublin_post_1968 && $(in_comment + 3) == "IST/GMT")) \ |
| == vanguard) { |
| - sub(/^#/, "") |
| - } else if (/^[^#]/) { |
| - sub(/^/, "#") |
| + uncomment = in_comment |
| + } else { |
| + comment_out = !in_comment |
| } |
| } |
| + |
| + # If this line should differ due to Namibia using Rule SAVE suffixes, |
| + # uncomment the desired version and comment out the undesired one. |
| + Rule_Namibia = /^#?Rule[\t ]+Namibia[\t ]/ |
| + Zone_using_Namibia_rule \ |
| + = (zone == "Africa/Windhoek" \ |
| + && ($(in_comment + 2) == "Namibia" \ |
| + || (1994 <= $(in_comment + 4) && $(in_comment + 4) <= 2017) \ |
| + || in_comment + 3 == NF)) |
| + if (Rule_Namibia || Zone_using_Namibia_rule) { |
| + if ((Rule_Namibia \ |
| + ? ($(in_comment + 9) ~ /^-/ \ |
| + || ($(in_comment + 9) == 0 && $(in_comment + 10) == "CAT")) \ |
| + : $(in_comment + 1) == "2:00" && $(in_comment + 2) == "Namibia") \ |
| + == vanguard) { |
| + uncomment = in_comment |
| + } else { |
| + comment_out = !in_comment |
| + } |
| + } |
| + |
| + if (uncomment) { |
| + sub(/^#/, "") |
| + } |
| + if (comment_out) { |
| + sub(/^/, "#") |
| + } |
| } |
| |
| # If a Link line is followed by a Zone line for the same data, comment |