From cbb1d33b29d7f60ebcbec4611e41b37b34fa25a5 Mon Sep 17 00:00:00 2001 From: gordon Date: Tue, 8 May 2018 17:12:10 +0000 Subject: Fix mishandling of x86 debug exceptions. [SA-18:06.debugreg] Bump newvers.sh and UPDATING for today's patches. Approved by: so Security: CVE-2018-8897 Security: FreeBSD-SA-18:06.debugreg Sponsored by: The FreeBSD Foundation --- UPDATING | 10 ++++ sys/amd64/amd64/exception.S | 116 ++++++++++++++++++++++++++++++++++++++++++- sys/amd64/amd64/machdep.c | 13 +++-- sys/amd64/amd64/mp_machdep.c | 11 ++++ sys/amd64/amd64/pmap.c | 3 ++ sys/amd64/amd64/trap.c | 52 +++++++++++++++++++ sys/conf/newvers.sh | 2 +- sys/i386/i386/trap.c | 30 +++++++++++ 8 files changed, 232 insertions(+), 5 deletions(-) diff --git a/UPDATING b/UPDATING index dad80fa..fd9ec27 100644 --- a/UPDATING +++ b/UPDATING @@ -16,6 +16,16 @@ from older versions of FreeBSD, try WITHOUT_CLANG and WITH_GCC to bootstrap to 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. +20180508 p10 FreeBSD-SA-18:06.debugreg + FreeBSD-EN-18:05.mem + FreeBSD-EN-18:06.tzdata + + Fix mishandling of x86 debug exceptions. [SA-18:06.debugreg] + + Fix multiple small kernel memory disclosures. [EN-18:05.mem] + + Update timezone database information. [EN-18:06.tzdata] + 20180404 p9 FreeBSD-SA-18:04.vt FreeBSD-SA-18:05.ipsec FreeBSD-EN-18:03.tzdata diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 524e729..39ecfe2 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -116,7 +116,6 @@ X\l: subq $TF_RIP,%rsp jmp alltraps_noen .endm - TRAP_NOEN dbg, T_TRCTRAP TRAP_NOEN bpt, T_BPTFLT #ifdef KDTRACE_HOOKS TRAP_NOEN dtrace_ret, T_DTRACE_RET @@ -509,6 +508,121 @@ IDTVEC(fast_syscall32) sysret /* + * DB# handler is very similar to NM#, because 'mov/pop %ss' delay + * generation of exception until the next instruction is executed, + * which might be a kernel entry. So we must execute the handler + * on IST stack and be ready for non-kernel GSBASE. + */ +IDTVEC(dbg) + subq $TF_RIP,%rsp + movl $(T_TRCTRAP),TF_TRAPNO(%rsp) + movq $0,TF_ADDR(%rsp) + movq $0,TF_ERR(%rsp) + movq %rdi,TF_RDI(%rsp) + movq %rsi,TF_RSI(%rsp) + movq %rdx,TF_RDX(%rsp) + movq %rcx,TF_RCX(%rsp) + movq %r8,TF_R8(%rsp) + movq %r9,TF_R9(%rsp) + movq %rax,TF_RAX(%rsp) + movq %rbx,TF_RBX(%rsp) + movq %rbp,TF_RBP(%rsp) + movq %r10,TF_R10(%rsp) + movq %r11,TF_R11(%rsp) + movq %r12,TF_R12(%rsp) + movq %r13,TF_R13(%rsp) + movq %r14,TF_R14(%rsp) + movq %r15,TF_R15(%rsp) + SAVE_SEGS + movl $TF_HASSEGS,TF_FLAGS(%rsp) + cld + testb $SEL_RPL_MASK,TF_CS(%rsp) + jnz dbg_fromuserspace + /* + * We've interrupted the kernel. Preserve GS.base in %r12, + * %cr3 in %r13, and possibly lower half of MSR_IA32_SPEC_CTL in %r14d. + */ + movl $MSR_GSBASE,%ecx + rdmsr + movq %rax,%r12 + shlq $32,%rdx + orq %rdx,%r12 + /* Retrieve and load the canonical value for GS.base. */ + movq TF_SIZE(%rsp),%rdx + movl %edx,%eax + shrq $32,%rdx + wrmsr + movq %cr3,%r13 + movq PCPU(KCR3),%rax + cmpq $~0,%rax + je 1f + movq %rax,%cr3 +1: testl $CPUID_STDEXT3_IBPB,cpu_stdext_feature3(%rip) + je 2f + movl $MSR_IA32_SPEC_CTRL,%ecx + rdmsr + movl %eax,%r14d + call handle_ibrs_entry +2: FAKE_MCOUNT(TF_RIP(%rsp)) + movq %rsp,%rdi + call trap + MEXITCOUNT + testl $CPUID_STDEXT3_IBPB,cpu_stdext_feature3(%rip) + je 3f + movl %r14d,%eax + xorl %edx,%edx + movl $MSR_IA32_SPEC_CTRL,%ecx + wrmsr + /* + * Put back the preserved MSR_GSBASE value. + */ +3: movl $MSR_GSBASE,%ecx + movq %r12,%rdx + movl %edx,%eax + shrq $32,%rdx + wrmsr + movq %r13,%cr3 + RESTORE_REGS + addq $TF_RIP,%rsp + jmp doreti_iret +dbg_fromuserspace: + /* + * Switch to kernel GSBASE and kernel page table, and copy frame + * from the IST stack to the normal kernel stack, since trap() + * re-enables interrupts, and since we might trap on DB# while + * in trap(). + */ + swapgs + movq PCPU(KCR3),%rax + cmpq $~0,%rax + je 1f + movq %rax,%cr3 +1: movq PCPU(RSP0),%rax + movl $TF_SIZE,%ecx + subq %rcx,%rax + movq %rax,%rdi + movq %rsp,%rsi + rep;movsb + movq %rax,%rsp + call handle_ibrs_entry + movq PCPU(CURPCB),%rdi + orl $PCB_FULL_IRET,PCB_FLAGS(%rdi) + testb $CPUID_STDEXT_FSGSBASE,cpu_stdext_feature(%rip) + jz 3f + cmpw $KUF32SEL,TF_FS(%rsp) + jne 2f + rdfsbase %rax + movq %rax,PCB_FSBASE(%rdi) +2: cmpw $KUG32SEL,TF_GS(%rsp) + jne 3f + movl $MSR_KGSBASE,%ecx + rdmsr + shlq $32,%rdx + orq %rdx,%rax + movq %rax,PCB_GSBASE(%rdi) +3: jmp calltrap + +/* * NMI handling is special. * * First, NMIs do not respect the state of the processor's RFLAGS.IF diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index dd5bb06..3419dea 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -675,6 +675,7 @@ struct gate_descriptor *idt = &idt0[0]; /* interrupt descriptor table */ static char dblfault_stack[PAGE_SIZE] __aligned(16); static char mce0_stack[PAGE_SIZE] __aligned(16); static char nmi0_stack[PAGE_SIZE] __aligned(16); +static char dbg0_stack[PAGE_SIZE] __aligned(16); CTASSERT(sizeof(struct nmi_pcpu) == 16); struct amd64tss common_tss[MAXCPU]; @@ -827,7 +828,7 @@ extern inthand_t IDTVEC(tss), IDTVEC(missing), IDTVEC(stk), IDTVEC(prot), IDTVEC(page), IDTVEC(mchk), IDTVEC(rsvd), IDTVEC(fpu), IDTVEC(align), IDTVEC(xmm), IDTVEC(dblfault), - IDTVEC(div_pti), IDTVEC(dbg_pti), IDTVEC(bpt_pti), + IDTVEC(div_pti), IDTVEC(bpt_pti), IDTVEC(ofl_pti), IDTVEC(bnd_pti), IDTVEC(ill_pti), IDTVEC(dna_pti), IDTVEC(fpusegm_pti), IDTVEC(tss_pti), IDTVEC(missing_pti), IDTVEC(stk_pti), IDTVEC(prot_pti), IDTVEC(page_pti), @@ -1637,8 +1638,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) SEL_KPL, 0); setidt(IDT_DE, pti ? &IDTVEC(div_pti) : &IDTVEC(div), SDT_SYSIGT, SEL_KPL, 0); - setidt(IDT_DB, pti ? &IDTVEC(dbg_pti) : &IDTVEC(dbg), SDT_SYSIGT, - SEL_KPL, 0); + setidt(IDT_DB, &IDTVEC(dbg), SDT_SYSIGT, SEL_KPL, 4); setidt(IDT_NMI, &IDTVEC(nmi), SDT_SYSIGT, SEL_KPL, 2); setidt(IDT_BP, pti ? &IDTVEC(bpt_pti) : &IDTVEC(bpt), SDT_SYSIGT, SEL_UPL, 0); @@ -1720,6 +1720,13 @@ hammer_time(u_int64_t modulep, u_int64_t physfree) np = ((struct nmi_pcpu *) &mce0_stack[sizeof(mce0_stack)]) - 1; np->np_pcpu = (register_t) pc; common_tss[0].tss_ist3 = (long) np; + + /* + * DB# stack, runs on ist4. + */ + np = ((struct nmi_pcpu *) &dbg0_stack[sizeof(dbg0_stack)]) - 1; + np->np_pcpu = (register_t) pc; + common_tss[0].tss_ist4 = (long) np; /* Set the IO permission bitmap (empty due to tss seg limit) */ common_tss[0].tss_iobase = sizeof(struct amd64tss) + IOPERM_BITMAP_SIZE; diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index 450d512..34a05e9 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -87,6 +87,7 @@ extern struct pcpu __pcpu[]; char *doublefault_stack; char *mce_stack; char *nmi_stack; +char *dbg_stack; /* * Local data and functions. @@ -225,6 +226,10 @@ init_secondary(void) np = ((struct nmi_pcpu *) &mce_stack[PAGE_SIZE]) - 1; common_tss[cpu].tss_ist3 = (long) np; + /* The DB# stack runs on IST4. */ + np = ((struct nmi_pcpu *) &dbg_stack[PAGE_SIZE]) - 1; + common_tss[cpu].tss_ist4 = (long) np; + /* Prepare private GDT */ gdt_segs[GPROC0_SEL].ssd_base = (long) &common_tss[cpu]; for (x = 0; x < NGDT; x++) { @@ -270,6 +275,10 @@ init_secondary(void) np = ((struct nmi_pcpu *) &mce_stack[PAGE_SIZE]) - 1; np->np_pcpu = (register_t) pc; + /* Save the per-cpu pointer for use by the DB# handler. */ + np = ((struct nmi_pcpu *) &dbg_stack[PAGE_SIZE]) - 1; + np->np_pcpu = (register_t) pc; + wrmsr(MSR_FSBASE, 0); /* User value */ wrmsr(MSR_GSBASE, (u_int64_t)pc); wrmsr(MSR_KGSBASE, (u_int64_t)pc); /* XXX User value while we're in the kernel */ @@ -368,6 +377,8 @@ native_start_all_aps(void) M_WAITOK | M_ZERO); nmi_stack = (char *)kmem_malloc(kernel_arena, PAGE_SIZE, M_WAITOK | M_ZERO); + dbg_stack = (char *)kmem_malloc(kernel_arena, PAGE_SIZE, + M_WAITOK | M_ZERO); dpcpu = (void *)kmem_malloc(kernel_arena, DPCPU_SIZE, M_WAITOK | M_ZERO); diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 2989eb40..8e2f048 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -7565,6 +7565,9 @@ pmap_pti_init(void) /* MC# stack IST 3 */ va = common_tss[i].tss_ist3 + sizeof(struct nmi_pcpu); pmap_pti_add_kva_locked(va - PAGE_SIZE, va, false); + /* DB# stack IST 4 */ + va = common_tss[i].tss_ist4 + sizeof(struct nmi_pcpu); + pmap_pti_add_kva_locked(va - PAGE_SIZE, va, false); } pmap_pti_add_kva_locked((vm_offset_t)kernphys + KERNBASE, (vm_offset_t)etext, true); diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index fccd297..dd5d891 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$"); */ #include "opt_clock.h" +#include "opt_compat.h" #include "opt_cpu.h" #include "opt_hwpmc_hooks.h" #include "opt_isa.h" @@ -99,6 +100,11 @@ PMC_SOFT_DEFINE( , , page_fault, write); #include #endif +extern inthand_t IDTVEC(bpt), IDTVEC(bpt_pti), IDTVEC(dbg), + IDTVEC(fast_syscall), IDTVEC(fast_syscall_pti), IDTVEC(fast_syscall32), + IDTVEC(int0x80_syscall_pti), IDTVEC(int0x80_syscall); + + extern void __noinline trap(struct trapframe *frame); extern void trap_check(struct trapframe *frame); extern void syscall(struct trapframe *frame); @@ -536,6 +542,52 @@ trap(struct trapframe *frame) load_dr6(rdr6() & ~0xf); goto out; } + + /* + * Malicious user code can configure a debug + * register watchpoint to trap on data access + * to the top of stack and then execute 'pop + * %ss; int 3'. Due to exception deferral for + * 'pop %ss', the CPU will not interrupt 'int + * 3' to raise the DB# exception for the debug + * register but will postpone the DB# until + * execution of the first instruction of the + * BP# handler (in kernel mode). Normally the + * previous check would ignore DB# exceptions + * for watchpoints on user addresses raised in + * kernel mode. However, some CPU errata + * include cases where DB# exceptions do not + * properly set bits in %dr6, e.g. Haswell + * HSD23 and Skylake-X SKZ24. + * + * A deferred DB# can also be raised on the + * first instructions of system call entry + * points or single-step traps via similar use + * of 'pop %ss' or 'mov xxx, %ss'. + */ + if (pti) { + if (frame->tf_rip == + (uintptr_t)IDTVEC(fast_syscall_pti) || +#ifdef COMPAT_FREEBSD32 + frame->tf_rip == + (uintptr_t)IDTVEC(int0x80_syscall_pti) || +#endif + frame->tf_rip == (uintptr_t)IDTVEC(bpt_pti)) + return; + } else { + if (frame->tf_rip == + (uintptr_t)IDTVEC(fast_syscall) || +#ifdef COMPAT_FREEBSD32 + frame->tf_rip == + (uintptr_t)IDTVEC(int0x80_syscall) || +#endif + frame->tf_rip == (uintptr_t)IDTVEC(bpt)) + return; + } + if (frame->tf_rip == (uintptr_t)IDTVEC(dbg) || + /* Needed for AMD. */ + frame->tf_rip == (uintptr_t)IDTVEC(fast_syscall32)) + return; /* * FALLTHROUGH (TRCTRAP kernel mode, kernel address) */ diff --git a/sys/conf/newvers.sh b/sys/conf/newvers.sh index f296585..e2d1727 100644 --- a/sys/conf/newvers.sh +++ b/sys/conf/newvers.sh @@ -44,7 +44,7 @@ TYPE="FreeBSD" REVISION="11.1" -BRANCH="RELEASE-p9" +BRANCH="RELEASE-p10" if [ -n "${BRANCH_OVERRIDE}" ]; then BRANCH=${BRANCH_OVERRIDE} fi diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c index 7c16b24..3b8e8ed 100644 --- a/sys/i386/i386/trap.c +++ b/sys/i386/i386/trap.c @@ -116,6 +116,8 @@ void dblfault_handler(void); extern inthand_t IDTVEC(lcall_syscall); +extern inthand_t IDTVEC(bpt), IDTVEC(dbg), IDTVEC(int0x80_syscall); + #define MAX_TRAP_MSG 32 static char *trap_msg[] = { "", /* 0 unused */ @@ -668,6 +670,34 @@ kernel_trctrap: load_dr6(rdr6() & ~0xf); goto out; } + + /* + * Malicious user code can configure a debug + * register watchpoint to trap on data access + * to the top of stack and then execute 'pop + * %ss; int 3'. Due to exception deferral for + * 'pop %ss', the CPU will not interrupt 'int + * 3' to raise the DB# exception for the debug + * register but will postpone the DB# until + * execution of the first instruction of the + * BP# handler (in kernel mode). Normally the + * previous check would ignore DB# exceptions + * for watchpoints on user addresses raised in + * kernel mode. However, some CPU errata + * include cases where DB# exceptions do not + * properly set bits in %dr6, e.g. Haswell + * HSD23 and Skylake-X SKZ24. + * + * A deferred DB# can also be raised on the + * first instructions of system call entry + * points or single-step traps via similar use + * of 'pop %ss' or 'mov xxx, %ss'. + */ + if (frame->tf_eip == + (uintptr_t)IDTVEC(int0x80_syscall) || + frame->tf_eip == (uintptr_t)IDTVEC(bpt) || + frame->tf_eip == (uintptr_t)IDTVEC(dbg)) + return; /* * FALLTHROUGH (TRCTRAP kernel mode, kernel address) */ -- cgit v1.1 From 9d2807bdf72c932cabb0bf577328a5ba0eff42af Mon Sep 17 00:00:00 2001 From: gordon Date: Tue, 8 May 2018 17:14:54 +0000 Subject: Fix multiple small kernel memory disclosures. [EN-18:05.mem] Approved by: so Security: CVE-2018-6920 Security: CVE-2018-6921 Security: FreeBSD-EN-18:05.mem --- sys/compat/linux/linux_ioctl.c | 2 ++ sys/compat/linux/linux_ipc.c | 10 ++++++++++ sys/dev/ath/if_ath_btcoex.c | 3 ++- sys/dev/ath/if_ath_ioctl.c | 2 +- sys/dev/ath/if_ath_lna_div.c | 3 ++- sys/dev/ath/if_ath_spectral.c | 3 ++- sys/netinet/tcp_usrreq.c | 4 +++- 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c index b77db6c..5c30c19 100644 --- a/sys/compat/linux/linux_ioctl.c +++ b/sys/compat/linux/linux_ioctl.c @@ -253,6 +253,7 @@ linux_ioctl_hdio(struct thread *td, struct linux_ioctl_args *args) } 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 @@ linux_ioctl_socket(struct thread *td, struct linux_ioctl_args *args) 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); diff --git a/sys/compat/linux/linux_ipc.c b/sys/compat/linux/linux_ipc.c index 9fa1fed..cd01c41 100644 --- a/sys/compat/linux/linux_ipc.c +++ b/sys/compat/linux/linux_ipc.c @@ -548,6 +548,9 @@ linux_semctl(struct thread *td, struct linux_semctl_args *args) 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,12 +705,15 @@ linux_msgctl(struct thread *td, struct linux_msgctl_args *args) 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: 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 @@ linux_shmctl(struct thread *td, struct linux_shmctl_args *args) 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: { diff --git a/sys/dev/ath/if_ath_btcoex.c b/sys/dev/ath/if_ath_btcoex.c index f071fc4..002483a 100644 --- a/sys/dev/ath/if_ath_btcoex.c +++ b/sys/dev/ath/if_ath_btcoex.c @@ -457,7 +457,7 @@ ath_btcoex_ioctl(struct ath_softc *sc, struct ath_diag *ad) * 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 @@ ath_btcoex_ioctl(struct ath_softc *sc, struct ath_diag *ad) switch (id) { default: error = EINVAL; + goto bad; } if (outsize < ad->ad_out_size) ad->ad_out_size = outsize; diff --git a/sys/dev/ath/if_ath_ioctl.c b/sys/dev/ath/if_ath_ioctl.c index 1128c18..73c1ca2 100644 --- a/sys/dev/ath/if_ath_ioctl.c +++ b/sys/dev/ath/if_ath_ioctl.c @@ -197,7 +197,7 @@ ath_ioctl_diag(struct ath_softc *sc, struct ath_diag *ad) * 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; diff --git a/sys/dev/ath/if_ath_lna_div.c b/sys/dev/ath/if_ath_lna_div.c index 5c102fb..ec85924 100644 --- a/sys/dev/ath/if_ath_lna_div.c +++ b/sys/dev/ath/if_ath_lna_div.c @@ -187,7 +187,7 @@ ath_lna_div_ioctl(struct ath_softc *sc, struct ath_diag *ad) * 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 @@ ath_lna_div_ioctl(struct ath_softc *sc, struct ath_diag *ad) switch (id) { default: error = EINVAL; + goto bad; } if (outsize < ad->ad_out_size) ad->ad_out_size = outsize; diff --git a/sys/dev/ath/if_ath_spectral.c b/sys/dev/ath/if_ath_spectral.c index e4afdae..d8f9e8a 100644 --- a/sys/dev/ath/if_ath_spectral.c +++ b/sys/dev/ath/if_ath_spectral.c @@ -212,7 +212,7 @@ ath_ioctl_spectral(struct ath_softc *sc, struct ath_diag *ad) * 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 @@ ath_ioctl_spectral(struct ath_softc *sc, struct ath_diag *ad) break; default: error = EINVAL; + goto bad; } if (outsize < ad->ad_out_size) ad->ad_out_size = outsize; diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 6a7bf00..64f8562 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1495,7 +1495,9 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt) 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); -- cgit v1.1 From 2128561f0f5745f9e9330fbd5910e68e71159fcc Mon Sep 17 00:00:00 2001 From: gordon Date: Tue, 8 May 2018 17:18:24 +0000 Subject: Update timezone database information. [EN-18:06.tzdata] Approved by: so Security: FreeBSD-EN-18:06.tzdata --- contrib/tzdata/Makefile | 57 ++++++++++++++++------ contrib/tzdata/NEWS | 66 ++++++++++++++++++++++++- contrib/tzdata/africa | 43 +++++++++++++---- contrib/tzdata/asia | 18 ++++++- contrib/tzdata/australasia | 9 ++++ contrib/tzdata/europe | 46 +++++++++++------- contrib/tzdata/theory.html | 117 ++++++++++++++++++++++++++------------------- contrib/tzdata/version | 2 +- contrib/tzdata/ziguard.awk | 58 ++++++++++++++++++---- 9 files changed, 313 insertions(+), 103 deletions(-) diff --git a/contrib/tzdata/Makefile b/contrib/tzdata/Makefile index c69e01b..21fa488 100644 --- a/contrib/tzdata/Makefile +++ b/contrib/tzdata/Makefile @@ -21,7 +21,7 @@ DATAFORM= main # 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 @@ LOCALTIME= GMT # 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_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \ $(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 @@ VERSION_DEPS= \ 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 @@ version: $(VERSION_DEPS) # 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 @@ check_time_t_alternatives: 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 @@ tarballs traditional_tarballs signatures traditional_signatures: version # 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 @@ tzdata$(VERSION).tar.gz: set-timestamps.out 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/' \ + 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 @@ tzdb-$(VERSION).tar.lz: set-timestamps.out 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: diff --git a/contrib/tzdata/NEWS b/contrib/tzdata/NEWS index 8afe3a4..9c445cd 100644 --- a/contrib/tzdata/NEWS +++ b/contrib/tzdata/NEWS @@ -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 @@ Release 2018d - 2018-03-22 07:05:46 -0700 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 diff --git a/contrib/tzdata/africa b/contrib/tzdata/africa index 2f7217a..84e1ce2 100644 --- a/contrib/tzdata/africa +++ b/contrib/tzdata/africa @@ -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 @@ Link Africa/Maputo Africa/Lusaka # Zambia # 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,19 +996,42 @@ Link Africa/Maputo Africa/Lusaka # Zambia # 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 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. diff --git a/contrib/tzdata/asia b/contrib/tzdata/asia index 998a7d4..3d30864 100644 --- a/contrib/tzdata/asia +++ b/contrib/tzdata/asia @@ -1983,6 +1983,19 @@ Rule ROK 1987 1988 - Oct Sun>=8 3:00 0 S # 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 @@ Zone Asia/Pyongyang 8:23:00 - LMT 1908 Apr 1 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 @@ Zone Asia/Karachi 4:28:12 - LMT 1907 # 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 # diff --git a/contrib/tzdata/australasia b/contrib/tzdata/australasia index 32ad61e..e3e79f1 100644 --- a/contrib/tzdata/australasia +++ b/contrib/tzdata/australasia @@ -1085,6 +1085,15 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901 # (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): diff --git a/contrib/tzdata/europe b/contrib/tzdata/europe index 3f092a4..6994ed8 100644 --- a/contrib/tzdata/europe +++ b/contrib/tzdata/europe @@ -528,13 +528,13 @@ Link Europe/London Europe/Isle_of_Man # 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 @@ Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2 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 @@ Zone Europe/Sofia 1:33:16 - LMT 1880 # 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 1938 1939 - May 15 2:00s 1:00 S 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 diff --git a/contrib/tzdata/theory.html b/contrib/tzdata/theory.html index 4d8726d..fc2102b 100644 --- a/contrib/tzdata/theory.html +++ b/contrib/tzdata/theory.html @@ -32,7 +32,7 @@ all computer-based clocks that track civil time. It organizes time zone and daylight saving time data by partitioning the world into regions -whose clocks all agree about timestamps that occur after the of the POSIX Epoch (1970-01-01 00:00:00 backzone that is distributed along with the database proper, this file is less reliable and does not necessarily follow database guidelines. @@ -68,7 +68,7 @@ standard for UNIX-like systems. As of this writing, the current edition of POSIX is: The Open -Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 +Group Base Specifications Issue 7, 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 @@ flip back and forth between two alternatives, and the rules themselves can change at times. Whether and when a tz 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.

@@ -92,8 +92,8 @@ Each tz region has a unique name that 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 tz code. +interface that explains the names; for one example, see the +tzselect program in the tz code. The Unicode Common Locale Data Repository contains data that may be useful for other selection interfaces. @@ -137,6 +137,9 @@ region. North and South America share the same area, 'America'. Typical names are 'Africa/Cairo', 'America/New_York', and 'Pacific/Honolulu'. +Some names are further qualified to help avoid confusion; for example, +'America/Indiana/Petersburg' distinguishes Petersburg, +Indiana from other Petersburgs in America.

@@ -159,7 +162,8 @@ in decreasing order of importance: TZ strings. A file name component must not exceed 14 characters or start with '-'. - E.g., prefer 'Brunei' to 'Bandar_Seri_Begawan'. + E.g., prefer Asia/Brunei to + Asia/Bandar_Seri_Begawan. Exceptions: see the discussion of legacy names below.

  • @@ -177,8 +181,8 @@ in decreasing order of importance: name AB (ignoring case), then B must not start with '/', as a regular file cannot have the same name as a directory in POSIX. - For example, 'America/New_York' precludes - 'America/New_York/Bronx'. + For example, America/New_York precludes + America/New_York/Bronx.
  • Uninhabited regions like the North Pole and Bouvet Island @@ -193,50 +197,56 @@ in decreasing order of importance:
  • 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.
  • If a name is ambiguous, use a less ambiguous alternative; e.g., many cities are named San José and Georgetown, so - prefer 'Costa_Rica' to 'San_Jose' and - 'Guyana' to 'Georgetown'. + prefer America/Costa_Rica to + America/San_Jose and America/Guyana + to America/Georgetown.
  • Keep locations compact. Use cities or small islands, not countries or regions, so that any future changes do not split individual locations into different tz regions. - E.g., prefer 'Paris' to 'France', since + E.g., prefer Europe/Paris to Europe/France, + since France has had multiple time zones.
  • - Use mainstream English spelling, e.g., prefer 'Rome' - to 'Roma', and prefer 'Athens' to the - Greek 'Αθήνα' or the Romanized 'Athína'. + Use mainstream English spelling, e.g., prefer + Europe/Rome to Europe/Roma, and + prefer Europe/Athens to the Greek + Europe/Αθήνα or the Romanized + Europe/Athína. The POSIX file name restrictions encourage this guideline.
  • Use the most populous among locations in a region, - e.g., prefer 'Shanghai' to - 'Beijing'. + e.g., prefer Asia/Shanghai to + Asia/Beijing. Among locations with similar populations, pick the best-known - location, e.g., prefer 'Rome' to - 'Milan'. + location, e.g., prefer Europe/Rome to + Europe/Milan.
  • - Use the singular form, e.g., prefer 'Canary' to - 'Canaries'. + Use the singular form, e.g., prefer Atlantic/Canary to + Atlantic/Canaries.
  • Omit common suffixes like '_Islands' and '_City', unless that would lead to ambiguity. - E.g., prefer 'Cayman' to - 'Cayman_Islands' and 'Guatemala' to - 'Guatemala_City', but prefer - 'Mexico_City' to 'Mexico' + E.g., prefer America/Cayman to + America/Cayman_Islands and + America/Guatemala to + America/Guatemala_City, but prefer + America/Mexico_City to + America/Mexico because the country of Mexico has several time zones.
  • @@ -245,13 +255,14 @@ in decreasing order of importance:
  • Omit '.' from abbreviations in names. - E.g., prefer 'St_Helena' to 'St._Helena'. + E.g., prefer Atlantic/St_Helena to + Atlantic/St._Helena.
  • Do not change established names if they only marginally violate the above guidelines. - For example, don't change the existing name 'Rome' to - 'Milan' merely because Milan's population has grown + For example, do not change the existing name Europe/Rome to + Europe/Milan merely because Milan's population has grown to be somewhat greater than Rome's.
  • @@ -318,8 +329,10 @@ in decreasing order of importance: Use three to six characters that are ASCII alphanumerics or '+' or '-'. Previous editions of this database also used characters like - ' ' and '?', but these characters have a - special meaning to the shell and cause commands like + space and '?', but these characters have a + special meaning to the + UNIX shell + and cause commands like 'set `date`' to have unexpected effects. @@ -688,7 +701,7 @@ href="https://www.dissentmagazine.org/blog/booked-a-global-history-of-time-vanes subsecond accuracy is needed.
  • - 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 earth's rotation accurately enough to map tzsetwall; - if such code is moved to "old" systems that don't - provide tzsetwall, you won't be able to generate an + if such code is moved to "old" systems that do not + provide tzsetwall, you will not be able to generate an executable program. (These functions also arrange for local wall clock time to be used if tzset is called – directly or - indirectly – and there's no TZ environment + indirectly – and there is no TZ 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 SVR2 + systems behave.)
  • Negative time_t values are supported, on systems @@ -1040,7 +1055,7 @@ The vestigial APIs are:
  • The 7th Edition UNIX timezone function is not present in this - package; it's impossible to reliably map timezone's + package; it is impossible to reliably map timezone's arguments (a "minutes west of GMT" value and a "daylight saving time in effect" flag) to a time zone abbreviation, and we refuse to guess. @@ -1052,7 +1067,9 @@ The vestigial APIs are: zone abbreviation to use.
  • - The 4.2BSD gettimeofday function is not + The 4.2BSD + gettimeofday function is not used in this package. This formerly let users obtain the current UTC offset and DST flag, but this functionality was removed in @@ -1061,7 +1078,7 @@ The vestigial APIs are:
  • In SVR2, time conversion fails for near-minimum or near-maximum time_t values when doing conversions - for places that don't use UT. + for places that do not use UT. 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 @@ based on guesswork and these guesses may be corrected or improved. 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, Calendrical -Calculations: Third Edition, Cambridge University Press (2008). +An excellent resource in this area is Edward M. Reingold +and Nachum Dershowitz, Calendrical +Calculations: The Ultimate Edition, Cambridge University Press (2018). Other information and sources are given in the file 'calendars' in the tz distribution. They sometimes disagree. @@ -1170,11 +1187,11 @@ They sometimes disagree.

    Some people's work schedules use Mars time. -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 Mars Pathfinder 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 @@ Sources for time on other planets: Jia-Rui Chong, "Workdays Fit for a Martian", Los Angeles Times - (2004-01-14), pp A1, A20-A21. + (2004-01-14), pp A1, A20–A21.

  • Tom Chmielewski, diff --git a/contrib/tzdata/version b/contrib/tzdata/version index ae3ff7c..cc61cea 100644 --- a/contrib/tzdata/version +++ b/contrib/tzdata/version @@ -1 +1 @@ -2018d +2018e diff --git a/contrib/tzdata/ziguard.awk b/contrib/tzdata/ziguard.awk index 6da3691..42e2910 100644 --- a/contrib/tzdata/ziguard.awk +++ b/contrib/tzdata/ziguard.awk @@ -13,19 +13,30 @@ # 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. @@ -37,11 +48,38 @@ outfile != "main.zi" { 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 -- cgit v1.1