profile
viewpoint

dvyukov/go-fuzz 3642

Randomized testing for Go

google/starlark-go 1068

Starlark in Go: the Starlark configuration language, implemented in Go

dvyukov/go-fuzz-corpus 88

Corpus for github.com/dvyukov/go-fuzz examples

josharian/2015-oscon-go-perf-tutorial 19

Slides and code for Go performance tutorial given at 2015 OSCON

josharian/dont 11

Don't: template-based, decentralized static analysis for Go

josharian/compilecmp 9

automate Go compiler comparisons

josharian/countselectcases 3

Gather distribution information about select cases usage in Go (quick and dirty)

josharian/benchserve 2

benchserve turns a test binary into a benchmark server

josharian/abif 1

Package abif provides an ABIF file reader in Go

issue openedgolang/go

cmd/compile: optimize comparisons to min/max (u)ints by checking for overflow

package p

import "math"

func f(x int64) bool {
	return x == math.MinInt64
}

On amd64, the core of this compiles to:

	0x0005 00005 (z.go:6)	MOVQ	$-9223372036854775808, CX
	0x000f 00015 (z.go:6)	CMPQ	AX, CX
	0x0012 00018 (z.go:6)	SETEQ	"".~r1+16(SP)

It would be cheaper and smaller instead to decrement CX and check the flags for underflow. A similar trick can be used for checking min and max ints and uints of all sizes. It might also be useful in the division fix-up code, where we must check for min int divisor.

cc @randall77 @dr2chase @martisch @mundaym

created time in 16 hours

issue openedgolang/go

cmd/compile: missed opportunity to coalesce reads/writes

package p

import "encoding/binary"

func f(b []byte, x *[8]byte) {
	_ = b[8]
	t := binary.LittleEndian.Uint64(x[:])
	binary.LittleEndian.PutUint64(b, t)
}

This should compile down to two MOVQs on amd64, one to load from x and one to write to b.

Instead, it compiles to a series of smaller MOVxs. The coalescing rules may need more cases added.

cc @randall77 @dr2chase @martisch

created time in 17 hours

issue openedgolang/go

cmd/compile: missed opportunity to inline runtime.memmove

package p

func f(b []byte, x *[8]byte) {
	_ = b[8]
	copy(b, x[:])
}

This should compile down to a pair of MOVQs, one to load from x and one to write to b. It doesn't; it still contains a call to runtime.memmove. From a quick glance at ssa.html, the problem is that the lowering of runtime.memmove to Move happens during generic.rules, but we haven't detected that the size of the memmove is a constant until after lowering.

To fix this, we could either improve the analysis in the generic stages or add arch-specific runtime.memmove-to-Move lowering.

cc @randall77 @dr2chase @martisch

created time in 17 hours

PR opened btcsuite/btcutil

allocate less in Encode
+7 -8

0 comment

2 changed files

pr created time in 3 days

create barnchjosharian/btcutil

branch : encode-allocate-less

created branch time in 3 days

fork josharian/btcutil

Provides bitcoin-specific convenience functions and types

fork in 3 days

pull request commenttailscale/tailscale

WIP: tstime: add an abstract Time interface, which can be real or virtual.

I'm on the fence about this. I like the idea of having a more complete mockery of time, and I see its utility. But the existing implementation makes me a bit nervous, per the comment above.

I haven't done a full review of the code yet; I will do so (if appropriate) once conversation about monotonic time and cross-tstime.Time safety has settled.

danderson

comment created time in 3 days

PullRequestReviewEvent

Pull request review commenttailscale/tailscale

WIP: tstime: add an abstract Time interface, which can be real or virtual.

 package tstime  import (-	"errors"-	"fmt"-	"strings"-	"sync"+	"context"+	"math/bits"+	"sync/atomic" 	"time" ) -// zoneOf returns the RFC3339 zone suffix (either "Z" or like-// "+08:30"), or the empty string if it's invalid or not something we-// want to cache.-func zoneOf(s string) string {-	if strings.HasSuffix(s, "Z") {-		return "Z"-	}-	if len(s) < len("2020-04-05T15:56:00+08:00") {-		// Too short, invalid? Let time.Parse fail on it.-		return ""-	}-	zone := s[len(s)-len("+08:00"):]-	if c := zone[0]; c == '+' || c == '-' {-		min := zone[len("+08:"):]-		switch min {-		case "00", "15", "30":-			return zone-		}-	}-	return ""+// Time is an interface to all things that deal with the current time,+// and the passage of time. It's meant to be used as a replacement for+// the functions of the same name in the `time` and `context`+// packages, so that different implementations of time can be swapped+// in.+type Time interface {+	// After is like time.After.+	After(time.Duration) <-chan time.Time+	// Sleep is like time.Sleep.+	Sleep(time.Duration)++	// Since is like time.Since.+	Since(time.Time) time.Duration+	// Until is like time.Until.+	Until(time.Time) time.Duration++	// Now is like time.Now.+	Now() time.Time++	// AfterFunc is like time.AfterFunc.+	AfterFunc(time.Duration, func()) *Timer+	// NewTimer is like time.NewTimer.+	NewTimer(time.Duration) *Timer+	// NewTicker is like time.NewTicker.+	NewTicker(time.Duration) *time.Ticker++	// WithTimeout is like context.WithTimeout.+	ContextWithTimeout(context.Context, time.Duration) (context.Context, context.CancelFunc)+	// WithDeadline is like context.WithDeadline.+	ContextWithDeadline(context.Context, time.Time) (context.Context, context.CancelFunc) } -// locCache maps from zone offset suffix string ("+08:00") =>-// *time.Location (from FixedLocation).-var locCache sync.Map+// Timer wraps a time.Timer and makes its Reset function integrate+// with a custom Time implementation, rather than hardcode stdlib's.+type Timer struct {+	timer  *time.Timer+	adjust func(time.Duration) time.Duration+} -func getLocation(zone, timeValue string) (*time.Location, error) {-	if zone == "Z" {-		return time.UTC, nil-	}-	if loci, ok := locCache.Load(zone); ok {-		return loci.(*time.Location), nil-	}-	// TODO(bradfitz): just parse it and call time.FixedLocation.-	// For now, just have time.Parse do it once:-	t, err := time.Parse(time.RFC3339Nano, timeValue)-	if err != nil {-		return nil, err-	}-	loc := t.Location()-	locCache.LoadOrStore(zone, loc)-	return loc, nil+func (t *Timer) Reset(d time.Duration) bool {+	return t.timer.Reset(t.adjust(d))+} +func (t *Timer) Stop() bool {+	return t.timer.Stop() } -// Parse3339 is a wrapper around time.Parse(time.RFC3339Nano, s) that caches-// timezone Locations for future parses.-func Parse3339(s string) (time.Time, error) {-	zone := zoneOf(s)-	if zone == "" {-		// Invalid or weird timezone offset. Use slow path,-		// which'll probably return an error.-		return time.Parse(time.RFC3339Nano, s)-	}-	loc, err := getLocation(zone, s)-	if err != nil {-		return time.Time{}, err-	}-	s = s[:len(s)-len(zone)] // remove zone suffix-	var year, mon, day, hr, min, sec, nsec int-	const baseLen = len("2020-04-05T15:56:00")-	if len(s) < baseLen ||-		!parseInt(s[:4], &year) ||-		s[4] != '-' ||-		!parseInt(s[5:7], &mon) ||-		s[7] != '-' ||-		!parseInt(s[8:10], &day) ||-		s[10] != 'T' ||-		!parseInt(s[11:13], &hr) ||-		s[13] != ':' ||-		!parseInt(s[14:16], &min) ||-		s[16] != ':' ||-		!parseInt(s[17:19], &sec) {-		return time.Time{}, errors.New("invalid time")+// Std is a Time implementation that uses standard library+// functions. With this implementation, time works as you'd normally+// expect.+type Std struct{}++// After is like time.After.+func (Std) After(d time.Duration) <-chan time.Time { return time.After(d) }++// After is like time.Sleep.+func (Std) Sleep(d time.Duration) { time.Sleep(d) }++// After is like time.Since.+func (Std) Since(t time.Time) time.Duration { return time.Since(t) }++// After is like time.Until.+func (Std) Until(t time.Time) time.Duration { return time.Until(t) }++// After is like time.NewTicker.+func (Std) NewTicker(d time.Duration) *time.Ticker { return time.NewTicker(d) }++// After is like time.Now.+func (Std) Now() time.Time                           { return time.Now() }+func durationIdentity(d time.Duration) time.Duration { return d }++// After is like time.AfterFunc.+func (s Std) AfterFunc(d time.Duration, f func()) *Timer {+	return &Timer{time.AfterFunc(d, f), durationIdentity}+}++// After is like time.NewTimer.+func (s Std) NewTimer(d time.Duration) *Timer { return &Timer{time.NewTimer(d), durationIdentity} }++// ContextWithTimeout is like context.WithTimeout.+func (Std) ContextWithTimeout(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc) {+	return context.WithTimeout(ctx, d)+}++// ContextWithDeadline is like context.WithDeadline.+func (Std) ContextWithDeadline(ctx context.Context, t time.Time) (context.Context, context.CancelFunc) {+	return context.WithDeadline(ctx, t)+}++// Virtual is a Time implementation that runs faster or slower than+// wall clock time, but keeps ratios the same.+type Virtual struct {+	// Second is how long a virtual second actually takes in wall+	// clock time. That is, if you virtual.Sleep(time.Second), this is+	// how long you'll actually sleep.+	Second time.Duration++	// first is the first value of time.Now seen by this virtual+	// instance. It's used as the origin point for virtual time.Time+	// values when scaling them to/from wall clock time.+	first int64 // nanoseconds since Epoch, accessed atomically.+}++func (vt *Virtual) init() {+	atomic.CompareAndSwapInt64(&vt.first, 0, time.Now().UnixNano())+}++// mulDiv implements v*mul/div using 128-bit integer math, to avoid+// overflows and losses of precision.+func mulDiv(v, mul, div time.Duration) time.Duration {+	neg := v < 0+	if neg {+		v = -v 	}-	nsStr := s[baseLen:]-	if nsStr != "" {-		if nsStr[0] != '.' {-			return time.Time{}, errors.New("invalid optional nanosecond prefix")-		}-		if !parseInt(nsStr[1:], &nsec) {-			return time.Time{}, fmt.Errorf("invalid optional nanosecond number %q", nsStr[1:])-		}-		for i := 0; i < len("999999999")-(len(nsStr)-1); i++ {-			nsec *= 10-		}++	hi, lo := bits.Mul64(uint64(v), uint64(mul))+	quo, _ := bits.Div64(hi, lo, uint64(div))++	ret := time.Duration(quo)+	if neg {+		ret = -ret 	}-	return time.Date(year, time.Month(mon), day, hr, min, sec, nsec, loc), nil+	return ret+}++// virtualToWallDuration converts a time.Duration from the virtual+// reference frame to the wall clock reference frame. This is the+// transform that takes place to convert+// virtual.Sleep(virtualDuration) into time.Sleep(realDuration), for+// example.+func (vt *Virtual) virtualToWallDuration(d time.Duration) time.Duration {+	return mulDiv(d, vt.Second, time.Second)+}++// wallToVirtualDuration converts a time.Duration from the wall clock+// reference frame to the virtual reference frame.+func (vt *Virtual) wallToVirtualDuration(d time.Duration) time.Duration {+	return mulDiv(d, time.Second, vt.Second)+}++func (vt *Virtual) virtualToWallTime(t time.Time) time.Time {+	vt.init()+	wt := time.Unix(0, atomic.LoadInt64(&vt.first)).In(t.Location())+	return wt.Add(vt.virtualToWallDuration(t.Sub(wt)))+}+func (vt *Virtual) wallToVirtualTime(t time.Time) time.Time {+	vt.init()+	ret := time.Unix(0, atomic.LoadInt64(&vt.first)).In(t.Location())+	return ret.Add(vt.wallToVirtualDuration(t.Sub(ret)))+}++// After is like time.After.+func (vt *Virtual) After(d time.Duration) <-chan time.Time {+	return time.After(vt.virtualToWallDuration(d))+}++// Sleep is like time.Sleep.+func (vt *Virtual) Sleep(d time.Duration) {+	time.Sleep(vt.virtualToWallDuration(d))+}++// Since is like time.Since.+func (vt *Virtual) Since(t time.Time) time.Duration {+	return vt.wallToVirtualDuration(time.Since(vt.virtualToWallTime(t)))

virtualToWallTime breaks monotonic time support (see https://go.googlesource.com/proposal/+/master/design/12914-monotonic.md), so this version of time.Since will behave differently in the fact of machine time changes. Maybe that's ok if it's intended for tests, but it could cause mysterious test flakes.

I haven't worked it all the way through, but I believe that you could work around this with even more wrapping. You could rename your Time interface to just T, and then instead of having this package accept/return time.Times, you could have them accept/return type Time interfaces. Clock times are unchanged (modulo being wrapped), but Virtual methods return virtual times, which are a struct containing the virtual time and the clock. You'd need to modify yourTinterface methods to deal intstime.Timeinstead oftime.Time`, and your Std implementation accordingly.

Then the implementation of this function looks like:

if u, ok := t.(*virtualTime); !ok {
  panic("cannot mix and match different tstime.T")
}
return vt.wallToVirtualDuration(time.Since(u.Clock))

The panic in this function is another sign that the existing implementation is a little bit dangerous: Mixing time.Times between different tstime.Times will cause silent weird results, not failures.

danderson

comment created time in 3 days

issue commenttailscale/tailscale

Multiple "tailscale up" can deadlock tailscaled

Manual inspection of the stack trace was not enlightening. Given all that, I'm adjusting to L1. We can reprioritize if it ever happens again.

bradfitz

comment created time in 3 days

issue commentdvyukov/go-fuzz

"go-fuzz-build" leads to "misplaced compiler directive"

It’s a bug in go-fuzz. But we are already tracking the bug in #294 , so I’m going to close this issue. Let’s continue discussion in #294.

lipeng28

comment created time in 4 days

issue commenttailscale/tailscale

Multiple "tailscale up" can deadlock tailscaled

Did this happen once or repeatably? I have been unable to reproduce locally running 8 tailscale up processes concurrently in a loop.

bradfitz

comment created time in 4 days

delete branch tailscale/tailscale

delete branch : josh/tsdns-netns

delete time in 4 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha f0ef5610499ceffa890523ec34df5f0cf9891120

wgengine/tsdns: use netns to obtain a socket Fixes #789 Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 4 days

issue closedtailscale/tailscale

wgengine/tsdns: forwarding should use net/netns to open sockets

This will prevent accidental routing loops.

I'd like to wait for #788 to be merged (or another path selected) before working on this, to avoid merge conflicts.

closed time in 4 days

josharian

PR opened tailscale/tailscale

Reviewers
wgengine/tsdns: use netns to obtain a socket
+6 -5

0 comment

1 changed file

pr created time in 4 days

create barnchtailscale/tailscale

branch : josh/tsdns-netns

created branch time in 4 days

delete branch tailscale/tailscale

delete branch : josh/magicdns-reconnect

delete time in 4 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 6e8328cba5489c35a01ea0ad87cf52f9843cc03c

wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 4 days

PR merged tailscale/tailscale

wgengine/tsdns: replace connections when net link changes (macOS)

See individual commit message for details.

Tested manually on macOS. If we're happy with this direction, we can expand to other platforms.

<!-- Reviewable:start -->

This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->

+247 -34

2 comments

4 changed files

josharian

pr closed time in 4 days

pull request commenttailscale/tailscale

wgengine/tsdns: replace connections when net link changes (macOS)

Oh n/m, easy to miss the approval. No need to take another look. :)

josharian

comment created time in 4 days

pull request commenttailscale/tailscale

wgengine/tsdns: replace connections when net link changes (macOS)

All done, thanks. PTAL.

josharian

comment created time in 4 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 1fd10061fdfba0062a1754470151524e2b9c3a45

wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

Josh Bleecher Snyder

commit sha 5247e9936021819b5ab3d9d5efdb1e3f83c2e29f

wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 4 days

Pull request review commenttailscale/tailscale

wgengine/tsdns: replace connections when net link changes (macOS)

 func (f *forwarder) forward(query Packet) error {  	return nil }++// A fwdconn manages a single connection used to forward DNS requests.+// Net link changes can cause a *net.UDPConn to become permanently unusable, particularly on macOS.+// fwdconn detects such situations and transparently creates new connections.+type fwdconn struct {+	// logf allows a fwdconn to log+	logf logger.Logf++	// wg tracks the number of outstanding conn.Read and conn.Write calls+	wg sync.WaitGroup+	// change allows calls to read to block until a the network connection has been replaced+	change *sync.Cond++	// mu protects fields that follow it; it is is also change's Locker+	mu sync.Mutex++	// closed tracks whether fwdconn has been permanently closed+	closed bool++	// conn is the current active connection+	conn *net.UDPConn+}++func newFwdConn(logf logger.Logf, idx int) *fwdconn {+	c := new(fwdconn)+	c.logf = logger.WithPrefix(logf, fmt.Sprintf("fwdconn %d: ", idx))+	c.change = sync.NewCond(&c.mu)+	// c.conn is created lazily in send+	return c+}++// send sends packet to dst using fwdconn's connection.+// It is best effort. It is UDP, after all. Failures are logged.+func (c *fwdconn) send(packet []byte, dst net.Addr) {+	b := backoff.NewBackoff("tsdns-fwdconn-send", c.logf, 30*time.Second)

It doesn't move the benchmarks, but since it's done now, I'll leave it in place.

josharian

comment created time in 4 days

PullRequestReviewEvent

Pull request review commenttailscale/tailscale

wgengine/tsdns: replace connections when net link changes (macOS)

+// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved.+// Use of this source code is governed by a BSD-style+// license that can be found in the LICENSE file.++package tsdns++import (+	"errors"+	"syscall"+)++func isSyscallErrno(err error, errno syscall.Errno) bool {+	var n syscall.Errno+	if !errors.As(err, &n) {+		return false+	}+	return n == errno+}++func networkIsDown(err error) bool {+	return isSyscallErrno(err, syscall.ENETDOWN)

Nice, thanks.

josharian

comment created time in 4 days

PullRequestReviewEvent

issue openedtailscale/tailscale

wgengine/tsdns: forwarding should use net/netns to open sockets

This will prevent accidental routing loops.

I'd like to wait for #788 to be merged (or another path selected) before working on this, to avoid merge conflicts.

created time in 4 days

delete branch tailscale/tailscale

delete branch : handle-bonjour-rdns-names

delete time in 4 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 1fd10061fdfba0062a1754470151524e2b9c3a45

wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 4 days

PR merged tailscale/tailscale

wgengine/tsdns: handle bonjour service prefixes in rdns names

Noticed while debugging something else.

<!-- Reviewable:start -->

This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->

+60 -4

6 comments

2 changed files

josharian

pr closed time in 4 days

pull request commenttailscale/tailscale

wgengine/tsdns: handle bonjour service prefixes in rdns names

Submitting. Holler if you desire changes post-facto.

josharian

comment created time in 4 days

PR opened tailscale/tailscale

Reviewers
wgengine/tsdns: replace connections when net link changes (macOS)

See individual commit message for details.

Tested manually on macOS. If we're happy with this direction, we can expand to other platforms.

+243 -34

0 comment

4 changed files

pr created time in 4 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 051d966537cc28c5b45a24165fc46deac20b943e

wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 4 days

push eventtailscale/tailscale

David Anderson

commit sha b7e0ff598ad72fa6c48afa0beeae211aad60164f

wgengine: don't close tundev in NewUserspaceEngine. newUserspaceEngineAdvanced closes the tun device on error already. Fixes #783. Signed-off-by: David Anderson <danderson@tailscale.com>

view details

Brad Fitzpatrick

commit sha 7c11f71ac53f83c813859a9cae3ae7bf8a273bcb

wgengine/router: ignore errors deleting 169.254.255.255/32 route on Windows Updates #785

view details

Brad Fitzpatrick

commit sha 2d0ed9967288770ba92d2ff3a5d0c44cbd9bf0e1

wgengine, wgengine/router: add a bunch of (temporary?) engine creation logging Trying to debug what's slow on a user's machine. Updates #785

view details

Josh Bleecher Snyder

commit sha 167c808671ed3cd674dc03664e40ccb573d585b8

wgengine/tsdns: replace connections when net link changes (macOS) When the network link changes, existing UDP sockets fail immediately and permanently on macOS. The forwarder set up a single UDP conn and never changed it. As a result, any time there was a network link change, all forwarded DNS queries failed. To fix this, create a new connection when send requests fail because of network unreachability. This change is darwin-only, although extended it to other platforms should be straightforward. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 4 days

create barnchtailscale/tailscale

branch : josh/magicdns-reconnect

created branch time in 4 days

create barnchjosharian/go-fuzz

branch : kitchensink

created branch time in 4 days

create barnchjosharian/go-fuzz

branch : pprof

created branch time in 4 days

push eventjosharian/pct

Josh Bleecher Snyder

commit sha 0a85e0cdde87788fe1627d3d2d8ab42b801c66d4

go.mod: only require Go 1.14 1.16 isn't even out yet. :P

view details

push time in 4 days

push eventjosharian/pct

Roger Peppe

commit sha a07db6a7da5c307ffa3569b79c6a62aff08dfb95

add go.mod file

view details

push time in 4 days

PR merged josharian/pct

add go.mod file

Fixes #1

+7 -0

1 comment

2 changed files

rogpeppe

pr closed time in 4 days

issue closedjosharian/pct

add go.mod file

You know it makes sense :)

closed time in 4 days

rogpeppe

pull request commentjosharian/pct

add go.mod file

Thanks, Rog. It should probably require Go 1.14 (or Go 1.5!) instead of Go 1.16, but I'll fix that after merge.

I also need to s/master/main/. Someday.

rogpeppe

comment created time in 4 days

Pull request review commenttailscale/tailscale

wgengine/tsdns: handle bonjour service prefixes in rdns names

 func (f *forwarder) Start() error { 	}  	f.wg.Add(connCount + 1)-	for idx, conn := range f.conns {-		go f.recv(uint16(idx), conn)+	for idx := range f.conns {+		idx := idx

Sigh. Yes, thanks. I just misread.

josharian

comment created time in 5 days

PullRequestReviewEvent

push eventtailscale/tailscale

push time in 5 days

pull request commenttailscale/tailscale

wgengine/tsdns: handle bonjour service prefixes in rdns names

Also added in a quick bug fix. PTAL.

josharian

comment created time in 5 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha b48daf65674efab0cf6d86f27bfecfbe850e7ab8

wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

Josh Bleecher Snyder

commit sha 39ad71eb5e7a15aeb59dd459efb1854ac4a59f78

wgengine/tsdns: fix race condition in forwarder.Start Closing over a loop iteration variable is a classic Go bug. There are going to be a bunch of other changes to this code, but may as well make this standalone bug fix for clarity. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 5 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha aebd1a331024478f39a37b178a995a7d817bfe54

wgengine/tsdns: delegate bonjour service rdns requests While we're here, parseQuery into a plain function. This is helpful for fuzzing. (Which I did a bit of. Didn't find anything.) And clean up a few minor things. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 5 days

pull request commenttailscale/tailscale

wgengine/tsdns: handle bonjour service prefixes in rdns names

Ah, I see now. I'll change this to just remove the logging noise, then.

josharian

comment created time in 5 days

pull request commenttailscale/tailscale

wgengine/tsdns: handle bonjour service prefixes in rdns names

I could easily be missing a lot of context here...but if we know the answer, why wouldn't we respond to a Bonjour request? Any reason Bonjour shouldn't work over Tailscale?

josharian

comment created time in 5 days

PR opened tailscale/tailscale

Reviewers
wgengine/tsdns: handle bonjour service prefixes in rdns names

Noticed while debugging something else.

+59 -1

0 comment

2 changed files

pr created time in 5 days

create barnchtailscale/tailscale

branch : handle-bonjour-rdns-names

created branch time in 5 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 4cc0ed67f9c49091bdc3c6396886e27dd461e958

tailcfg: add MachineKey.IsZero Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 7 days

issue commentpion/webrtc

improve samplebuilder docs

I’m no longer using pion; I’m happy to let you decide about the best path forward for this issue.

josharian

comment created time in 12 days

issue commentgolang/go

cmd/compile: mid-stack inline dispatch functions that call a function on each path

My Go time is severely restricted at the moment, but I really look forward to trying this out. And reverting my math/big hacks.

josharian

comment created time in 12 days

PR opened dvyukov/go-fuzz

go-fuzz: reorder Testee fields to fix 32 bit architectures

Fixes #299

+1 -1

0 comment

1 changed file

pr created time in 13 days

issue commentdvyukov/go-fuzz

Bad atomic field offset on i386

Thanks! Fix forthcoming...

MariusVanDerWijden

comment created time in 13 days

push eventjosharian/go-fuzz

Josh Bleecher Snyder

commit sha e3eb428511720f87ce75d11e2450fe82b44ccc5b

go-fuzz-build: load reflect when using libfuzzer libfuzzer's generated main function uses package reflect. When attempting to build a package that doesn't depend on reflect, such as github.com/dvyukuv/go-fuzz-corpus/{bzip2,gif,url}, package reflect wasn't getting copied to GOROOT, and the build failed. Fix that. We may need something similar in the future for fuzz.F; see #223. Updates google/oss-fuzz/#2188

view details

Josh Bleecher Snyder

commit sha 5cc3605ccbb6e38722b388400463114cc3ef29f5

go-fuzz-build: use -trimpath flag when available Go 1.13 has a new -trimpath flag to cmd/go. It removes all path prefixes (GOROOT, GOPATH). This will yield nicer panic tracebacks, without the go-fuzz-build temp directories. It will also allow go-fuzz-build to use the cmd/go cache. It doesn't have a dramatic impact on build times, but every little bit helps. Note that upstream cache support for -trimpath is mildly broken, but it will be fixed by the time Go 1.13 is released, and in the meantime, adding -trimpath support to go-fuzz doesn't hurt.

view details

Herman Schaaf

commit sha 134cf682d3493813fe98108faf2a31759fa0764e

Update location of examples

view details

Dmitry Vyukov

commit sha f37f81c5d15aaa6c906e962f3f50bed1ccc48471

Update README.md Add links to continuous fuzzing services. Move "History rewrite" closer to the bottom (hopefully this is not interesting for most users today).

view details

Dmitry Vyukov

commit sha f6654ea54e55961a6cf227340e95ffd24d35fa58

go-fuzz-dep: set input capacity to len The input capacity was always set MaxInputSize (1MB). This means that go-fuzz could miss whole lot of out-of-bounds bugs related to slicing, since slicing operations look at capacity. E.g. calculating indices of a field in the input and then extracting the field with slicing. Somehow we missed this for all this time. Found thanks to libfuzzer mode that does this properly and fuzzit.dev that uses the libfuzzer mode.

view details

Dmitry Vyukov

commit sha 193030f1cb162cbb89749cb7d14e7e7defac63c0

Update README.md

view details

Alexander Bayandin

commit sha 98cec4f7504559d49c40130911aeb137db966234

Add 2 more examples of found bugs

view details

Alexander Bayandin

commit sha 4d6aa5bf4d29bf896e3fa4eabca3c1dc6a4fd6ec

go-fuzz: fix integer divide by zero

view details

Alexander Bayandin

commit sha 1123d3b1be967487900f7ecf92fc30889650545c

go-build-fuzz: add -x flag

view details

Alexander Bayandin

commit sha 1810d380ab9c2786af00db592f86d83063216ed0

go-fuzz: add retrying to connect to coordinator

view details

Josh Bleecher Snyder

commit sha 6db5890afbd34304856de2b72c96fe4aa60e5c4d

go-fuzz-build: add -preserve flag The -preserve flag allows people to opt out of having particular packages instrumented, either to work around issues or to reduce coverage noise from uninteresting, large packages early in the critical path. Fixes #266

view details

Josh Bleecher Snyder

commit sha 532ac05586a18c759fde1ca66a457911d9f42fe4

go-fuzz-build: improve error when trying to fuzz package main Package main is not importable, and go-fuzz-build requires that we be able to import the package in question, in order to be able to call the Fuzz function. The existing error message did contain the relevant information, but it was buried amidst a bunch of other noise. Make it clearer. Error message before: failed to execute go build: exit status 1 /var/folders/1t/n61cbvls5bl293bbb0zyypqw0000gn/T/go-fuzz-build699217618/gopath/src/github.com/dvyukov/go-fuzz-corpus/cmd/go.fuzz.main/main.go:5:2: import "github.com/dvyukov/go-fuzz-corpus/cmd" is a program, not an importable package Error message after: cannot fuzz package main

view details

Alexander Bayandin

commit sha 3901820d0d7219cef278724014898cd009058f88

Add 5 more examples of found bugs

view details

Yevgeny Pats

commit sha 7002bfe060a6e036346536bbb5e1256609330146

Add opt-in go-fuzz modules support

view details

Brandon Weeks

commit sha fdaa9b19a67dfb373a320aff9b35148182da99e6

trophies: github.com/google/go-attestation

view details

LthomasMP

commit sha a9511467ab5995dac8ba1b3c685b488ce73e9aef

trophies: github.com/buger/jsonparser

view details

thepudds

commit sha 8cb20381268133974b070fff8f404435b3d189c1

preliminary Go modules support (#274) * preliminary Go modules support (#2) #### Summary The heart of the change is very small -- we stop overwriting the user's value for the `GO111MODULE` env var in two places. This means we end up respecting whatever the user has set for `GO111MODULE`, and relying on `cmd/go` to interpret the meaning of an unset `GO111MODULE` (which defaults to `auto` for Go 1.11-1.13, and likely will default to `on` at some point during Go 1.14 development). In addition, there are some comments added, as well as an explicit check for `GOFLAGS=-mod=vendor`, which is not supported. The tests exercises 'replace' directives, v2+ modules, GO111MODULE set to on|off|auto, running inside GOPATH, running outside GOPATH, the mechanisms by which go-fuzz/go-fuzz-dep is found, as well as vendoring (which is not supported, but it tests that a sensible error is emitted). #### Additional Details Historically, go-fuzz has set up a clean GOPATH environment in a temp directory, instrumented the code for fuzzing coverage, and built the instrumented code in the temp directory. The current approach is to keep doing that (and not set up a full-blown modules-based environment for building), but use modules to find the code to instrument. v2+ modules are potentially problematic due to Semantic Import Versioning (with the major version in the import path). However, it turns out to not be too bad to handle it. For a v2+ module created following the 'major branch' approach, the /vN is materialized into a physical directory. For example, the github.com/russross/blackfriday/v2 module ends up in the /tmp/blah/gopath/src/github.com/russross/blackfriday/v2 directory. This should be a valid layout, and people use this layout today (including when manually switching to a 'major subdirectory' approach for a v2+ module, which involves creating a /v2 or /vN directory so that pre-modules toolchains follow a /v2 or /vN import path and find an on-disk layout that they expect without any knowledge of modules). The approach does not copy go.mod files at all. (Before starting, I was thinking I would need to copy go.mod files to trigger "minimal module awareness", which is a transitional mechanism within cmd/go, but after some experimentation / thinking, I concluded it was not needed based on materializing the /v2). For tests, I am using the script-driven test facility that the core Go team created for testing cmd/go, which is well tuned to testing the various permutations of modules, including it lets you relatively easily set up go.mod files and source files, run commands and check results. (Some more details of the capability here: https://github.com/golang/go/blob/master/src/cmd/go/testdata/script/README). * modules support: adjust wording based on first-pass review, and update vendor test (#3) * travis: attempt to install cmd/testscript * testing: initial check of 'go-fuzz-build -h' output to see if any testscripts work * testing: change name of first test script * travis: check if the 'testscript' cmd seems to function at all. * testing: use the exec command to invoke 'go-fuzz-build -h' * testing: create initially failing test case for v2 modules * travis: run testscript for v2 modules * testing: remember to use 'exec' to invoke go-fuzz-build * testing: adjust comments in v2 module testscript * go-fuzz-build: preliminary module support * testing: flip from an expected failure to an expected pass for a module test * go-fuzz-build: update comments for preliminary modules support * go-fuzz: preliminary modules support for go-fuzz itself * travis: go-fuzz-defs sanity check * travis: additional temp sanity check * travis: add more comments, some additional sanity checks in case we need to debug in future * travis: s/go-fuzz-deps/go-fuzz-dep/ * testing: validate behavior of v2 modules * testing: renamed fuzz_help.txt * testing: update travis to use the renamed testscripts * travis: conditionally set GO111MODULE=auto, and test Go 1.13 rather than 1.11 * testing: validate modules outside GOPATH * testing: validate modules inside GOPATH * testing: invoke timeout properly * testing: preliminary test for vendored modules (not yet supported) * testing: validate how go-fuzz-dep and go-fuzz-defs are found * travis: run the latest testscripts for modules testing * testing: fix typo in mod_outside_gopath.txt file name * travis: fix typo in file name * go-fuzz-build: detect -mod=vendor * testing: validate we get a proper error for -mod=vendor * readme: describe preliminary modules support * readme: correct typo in modules support * readme: adjust modules support section * readme: tweak wording based on PR review * go-fuzz: tweak comment wording by removing "preliminary modules support" * go-fuzz-build: tweak comment wording by removing "preliminary modules support" * mod_vendor.txt: avoid triggering Go 1.14 auto detection of a vendor directory * readme: update wording based on review * readme: remove a blank line to re-trigger travis

view details

Roberto Clapis

commit sha a378175e205cefb8ea839b9db53de2e86f061e4d

Added two found and fixed bugs to trophies.

view details

Dmitry Vyukov

commit sha be3528f3a81351d8a438aed216130e1e7da39f7c

.travis.yml: fix osx setup There seems to be some change in osx machine setup on travis.

view details

Eric Cornelissen

commit sha 2dc2d88eb660c60dd6e94689bf287a7f9311ed3f

Add trophy to README Add a new entry to the list of trophies for an off-by-one(?) issue I found in gofuzz [1], another fuzzing package for go that does purely random fuzzing. -- 1. https://github.com/google/gofuzz

view details

push time in 13 days

delete branch tailscale/tailscale

delete branch : josh/microproxy-dev

delete time in 13 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 7f97cf654dd128cdd8d826f9eee1aedb60a707b4

cmd/microproxy: add -insecure flag This makes it easier to run microproxy locally during development. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 13 days

PR merged tailscale/tailscale

Reviewers
cmd/microproxy: add -insecure flag

This makes it easier to run microproxy locally during development.

<!-- Reviewable:start -->

This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->

+8 -4

3 comments

1 changed file

josharian

pr closed time in 13 days

pull request commenttailscale/tailscale

cmd/microproxy: add -insecure flag

Remind me why some random production workaround(?) temporary(?) binary is in the open source tailscale/tailscale repo? Do we imagine anybody else ever needing this?

I wondered the same thing. Unless you say otherwise, @danderson, I'll move to corp later this week.

josharian

comment created time in 13 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha b38ab5092013e313ebcf97b221b282081d0fe2e5

cmd/microproxy: add -insecure flag This makes it easier to run microproxy locally during development. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 13 days

PR opened tailscale/tailscale

Reviewers
cmd/microproxy: add -insecure flag

This makes it easier to run microproxy locally during development.

+8 -4

0 comment

1 changed file

pr created time in 13 days

delete branch tailscale/tailscale

delete branch : josh/html-escape-string

delete time in 13 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 3fa863e6d94cc61619e117c9ec073818d802b2ed

cmd/derper: add missing html.EscapeString calls in /debug page Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 13 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 07a3c599c728d98161aae00f6933f5e7d8920936

cmd/derper: add missing html.EscapeString calls in /debug page Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 13 days

create barnchtailscale/tailscale

branch : josh/html-escape-string

created branch time in 13 days

create barnchtailscale/tailscale

branch : josh/microproxy-dev

created branch time in 13 days

issue commentgolang/go

math/big: different subVV result on pure Go vs assembly implementations

I believe that the length checks in the Go code are there to prevent bounds checks in the loop; removing them will make things worse. (Feel free to double-check, though.)

More docs and comments around this would be welcome, to avoid future confusion, if you are so inclined.

SparrowLii

comment created time in 13 days

issue closedgolang/go

cmd/go: get downloads main~1 commit, not main

Reproduce:

Create a new repo and go mod init. Run go get -v -u github.com/tailscale/depaware. Then cat go.mod.

Result:

require github.com/tailscale/depaware v0.0.0-20200914201916-3f1070fd0d55 // indirect

Expected:

require github.com/tailscale/depaware v0.0.0-20200914232109-e09ee10c1824 // indirect

Note that you can force upgrade by go get -u github.com/tailscale/depaware@e09ee10c1824.

3f1070fd0d55 is HEAD~1; e09ee10c1824 is HEAD. go get should thus pick e09ee10c1824.

cc @jayconrod @bcmills

cc @danderson

closed time in 13 days

josharian

issue commentgolang/go

cmd/go: get downloads main~1 commit, not main

Yep, it was the cache. :/ Closing as a duplicate.

josharian

comment created time in 13 days

issue commentgolang/go

math/big: different subVV result on pure Go vs assembly implementations

Does this result in any observable changes when using only the public API? IIRC it is the responsibility of the caller to ensure that the lengths are equal. It is possible we should document that more clearly.

I would love to delete the assembly, but the performance of the Go code is not good enough yet to do that. I got it closer a cycle or two ago, but there's a ways to go.

SparrowLii

comment created time in 13 days

issue openedgolang/go

cmd/go: get downloads main~1 commit, not main

Reproduce:

Create a new repo and go mod init. Run go get -v -u github.com/tailscale/depaware. Then cat go.mod.

Result:

require github.com/tailscale/depaware v0.0.0-20200914201916-3f1070fd0d55 // indirect

Expected:

require github.com/tailscale/depaware v0.0.0-20200914232109-e09ee10c1824 // indirect

Note that you can force upgrade by go get -u github.com/tailscale/depaware@e09ee10c1824.

3f1070fd0d55 is HEAD~1; e09ee10c1824 is HEAD. go get should thus pick e09ee10c1824.

cc @jayconrod @bcmills

cc @danderson

created time in 14 days

pull request commenttailscale/tailscale

net/netns: add windows support.

If you rebase and push again, you should get a better depaware error. (If you get one at all. :) )

danderson

comment created time in 14 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 3f4d93feb2272c011fb1531e72a8726ea33b3459

go.mod: bump depaware to get diffs out of -check, again I had to use go get -u github.com/tailscale/depaware@e09ee10c18249e4bf198e66bbd47babcd502637a to force it to the correct version; it kept selecting head~1. Maybe because the branch is called main instead of master? Maybe because of some delay?

view details

push time in 14 days

pull request commenttailscale/tailscale

net/netns: add windows support.

What's wrong with depaware is apparently there's a serious lag before go get -u gets you the latest version pushed to GitHub. My previous go get -u upgraded to an old version. Working on fixing now, but waiting for the latest to really be the latest...

danderson

comment created time in 14 days

push eventtailscale/depaware

Josh Bleecher Snyder

commit sha e09ee10c18249e4bf198e66bbd47babcd502637a

Fix grammar in error message The list ... is ... not The list ... are ...

view details

push time in 14 days

pull request commenttailscale/tailscale

net/netns: add windows support.

CI is using the wrong depaware version: go: downloading github.com/tailscale/depaware v0.0.0-20200910145248-cb751026f10d. I don't see why.

danderson

comment created time in 14 days

pull request commenttailscale/tailscale

net/netns: add windows support.

Try rebasing? I pushed a change that should provide more info on depaware failures: https://github.com/tailscale/tailscale/commit/41f6c78c5315dbea56b44de684e9664640fb17f9

danderson

comment created time in 14 days

issue commenttailscale/depaware

use "<multiple packages>" instead of "samplepkg+" when imported multiple times

For the diff in #3, 6 of the changes were new dependencies, 2 were new indirect dependencies, and 6 were lexicographic changes. That's not a great ratio.

A fancier alternative is to have depaware parse the existing depaware.txt file and attempt to preserve the existing lines if possible.

josharian

comment created time in 14 days

delete branch tailscale/tailscale

delete branch : issue654

delete time in 14 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 6e38d2948589df598a7f1f58e013f5eca2103260

wgengine/magicsock: improve test logging output This fixes line numbers and reduces timestamp precision to overwhelming the output. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

Josh Bleecher Snyder

commit sha 0c0239242c381ffb84b2211756faffa173c8c25a

wgengine/magicsock: make discoPingPurpose a stringer It was useful for debugging once, it'll probably be useful again. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

Josh Bleecher Snyder

commit sha a5d701095b8812837bc4df9d4cad0b5b3884774e

wgengine/magicsock: increase test timeout to reduce flakiness Updates #654. See that issue for a discussion of why this timeout reduces flakiness, and what next steps are. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 14 days

PR merged tailscale/tailscale

wgengine/magicsock: reduce test flakiness

...and assorted debugging improvements.

See individual commit messages and #654 for more detail.

Updates #654

<!-- Reviewable:start -->

This change is <img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/> <!-- Reviewable:end -->

+34 -2

1 comment

3 changed files

josharian

pr closed time in 14 days

push eventtailscale/tailscale

Brad Fitzpatrick

commit sha 31c13013ae39962b6fa66287aecd51e24c9ac980

wgengine/router: tolerate disabled IPv6 on Windows Fixes #412 Updates #524 (maybe fixes?) Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>

view details

Brad Fitzpatrick

commit sha a084c44afca32eb3e05c3c5823509d07b2c78713

wgengine, wgengine/router, cmd/tailscale: force netfilter mode off on Synology For now. Get it working again so it's not stuck on 0.98. Subnet relay can come later. Updates #451 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>

view details

Brad Fitzpatrick

commit sha 3af64765fd5808e72ddd2b29888c3defe9bf5026

ipn: fix Windows crash from improperly strict assertion

view details

Brad Fitzpatrick

commit sha 4f71319f7cfb1eb43797cce123bc461b2ecd9521

ipn/ipnserver: make ipnserver also be an HTTP server for localhost clients For now it just says hello to show auth works. More later.

view details

Brad Fitzpatrick

commit sha 4f7751e02512a80180d6844ab990cf58980a6a17

Update depaware for previous ipnserver change.

view details

Brad Fitzpatrick

commit sha 662c19551ac6d052969e37769996ac2e818ad8aa

control/controlclient: deal with localized 'Version' string getting Windows version

view details

Josh Bleecher Snyder

commit sha 41f6c78c5315dbea56b44de684e9664640fb17f9

go.mod: bump depaware to get diffs out of -check

view details

Josh Bleecher Snyder

commit sha 78f7f1ea66e557c8511638e06aebe8cc7a79944c

wgengine/magicsock: improve test logging output This fixes line numbers and reduces timestamp precision to overwhelming the output. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

Josh Bleecher Snyder

commit sha 8debb032f19836a0c5abb7b22f0b8d003cdd722c

wgengine/magicsock: make discoPingPurpose a stringer It was useful for debugging once, it'll probably be useful again. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

Josh Bleecher Snyder

commit sha 99f9b37449a4abd80d9e3d871bc445fddc6e85ab

wgengine/magicsock: increase test timeout to reduce flakiness Updates #654. See that issue for a discussion of why this timeout reduces flakiness, and what next steps are. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>

view details

push time in 14 days

push eventtailscale/tailscale

Josh Bleecher Snyder

commit sha 41f6c78c5315dbea56b44de684e9664640fb17f9

go.mod: bump depaware to get diffs out of -check

view details

push time in 14 days

delete branch tailscale/depaware

delete branch : check-diff

delete time in 14 days

push eventtailscale/depaware

Josh Bleecher Snyder

commit sha 3f1070fd0d558fad55562b3349d2c4257f8e81c4

write a diff when -check fails This makes it easier to understand what went wrong when depaware fails in a CI or other non-local context. The diff could be improved, in that a single addition can cause cascading diffs. For example, adding a bufio dependency to a package can cause this: - bytes from encoding/json+ + bytes from bufio+ Observe that bytes didn't really change meaningfully--it was imported by >=2 packages before, and it still is. But now it is imported by bufio, which is alphabetically prior to encoding/json. This adds a bunch of noise to the diffs. It's not obvious what the best fix to this is. Sample output, from running on this commit: $ TERM=dumb go run depaware-main.go -check . The list of dependencies in /Users/josh/t/depaware/depaware.txt are out of date. --- before +++ after @@ -1,16 +1,23 @@ github.com/tailscale/depaware dependencies: (generated by github.com/tailscale/depaware) + github.com/pkg/diff from github.com/tailscale/depaware/depaware + github.com/pkg/diff/ctxt from github.com/pkg/diff + github.com/pkg/diff/edit from github.com/pkg/diff/ctxt+ + github.com/pkg/diff/intern from github.com/pkg/diff + github.com/pkg/diff/myers from github.com/pkg/diff + github.com/pkg/diff/write from github.com/pkg/diff+ github.com/tailscale/depaware/depaware from github.com/tailscale/depaware - bytes from encoding/json+ - context from os/exec + bufio from github.com/pkg/diff+ + bytes from bufio+ + context from github.com/pkg/diff+ encoding from encoding/json encoding/base64 from encoding/json encoding/binary from encoding/base64 encoding/json from github.com/tailscale/depaware/depaware - errors from bytes+ + errors from bufio+ flag from github.com/tailscale/depaware/depaware fmt from encoding/json+ - io from bytes+ + io from bufio+ io/ioutil from github.com/tailscale/depaware/depaware log from github.com/tailscale/depaware/depaware math from encoding/binary+ @@ -21,12 +28,12 @@ reflect from encoding/binary+ sort from encoding/json+ strconv from encoding/base64+ - strings from encoding/json+ + strings from bufio+ sync from context+ sync/atomic from context+ syscall from internal/poll+ time from context+ unicode from bytes+ unicode/utf16 from encoding/json+ - unicode/utf8 from bytes+ + unicode/utf8 from bufio+ unsafe from internal/bytealg+ exit status 1

view details

push time in 14 days

PR merged tailscale/depaware

write a diff when -check fails
+42 -7

0 comment

4 changed files

josharian

pr closed time in 14 days

issue openedtailscale/depaware

use "<multiple packages>" instead of "samplepkg+" when imported multiple times

depaware.txt diffs can be very noisy. See e.g. the diff in https://github.com/tailscale/depaware/pull/3/commits. Many of those changes are of the form:

-        bytes                                                        from encoding/json+
+        bytes                                                        from bufio+

I propose that when a package is imported by >1 package, we write <multiple packages> instead of using lexifirst+. This provides less information, but will be much more stable.

Optionally, we could also add a -all flag (better name welcome) that spells out every single importing package like bufio,encoding/json, instead of <multiple packages>. That would be useful for someone actively trying to cut dependencies. And teams might choose to use it all the time; with a good intra-line diff, it'd generate usable diffs again.

I'm willing to implementation, but feedback on design requested first.

created time in 14 days

PR opened tailscale/depaware

write a diff when -check fails
+42 -7

0 comment

4 changed files

pr created time in 14 days

create barnchtailscale/depaware

branch : check-diff

created branch time in 14 days

issue openedpkg/diff

rename master branch to main

need to check what impact this has on go modules

created time in 14 days

push eventpkg/diff

Josh Bleecher Snyder

commit sha 7cc3ed0907612adbf15333ca2e30315e97009d3c

edit: create package Part of #18. There are some unfortunate API changes as part of this, such as the new EditScriptWithContextSize, since edit.Script is now part of a different package. Those will get ironed out as the refactoring continues.

view details

Josh Bleecher Snyder

commit sha f932f2c54714ccef80294672aa92ce93026bad93

myers: create package Part of #18.

view details

Josh Bleecher Snyder

commit sha 9897735d8fe2c16c115f3fe155d178f090ab699b

ctxt: create package Part of #18.

view details

Josh Bleecher Snyder

commit sha b63e0faf7226324a50d703393e48865cc4615691

move some TODOs from diff.go to adaptor.go

view details

Josh Bleecher Snyder

commit sha a78b2397ab6b2815d9e61ad1019a8ed1736daf51

write: create package Part of #18. I am very torn about having a single write package with a routine per format: write.Pair write.Option write.Names write.Unified write.SideBySide vs having a package per format: write.Option write.Names unified.Pair unified.Write sidebyside.Pair sidebyside.Write One motivation for separate packages is that the ideal interface for different formats is different. For unified, WriteTo is high performance, and we don't need more. For side by side, we need to be able to inspect and even modify the line before writing, so it makes more sense to have an interface specified in terms of []byte. However, we can use a bytes.Buffer internally to bridge from WriteTo to []byte, and most write options are shared between the formats. So for the moment, try out a single write package. Maybe Daniel (or someone else) will have a compelling reason to go one way or another. The adaptor API is getting ugly. It'll get fixed (mostly eliminated) soon.

view details

Josh Bleecher Snyder

commit sha 0a511de994d6e2d29b1d628fea9bacace88b720e

remove adapters, create wrappers package diff now has a simple, single-call API. for more control, people can use the subpackages. Part of #18.

view details

Josh Bleecher Snyder

commit sha eb1debf3ee33d36d88f8c3909068e595d4b49abf

ctxt: add todos

view details

Josh Bleecher Snyder

commit sha de2f738bc65407e924f31369a8450c671c8db34d

fuzz: fix fuzz function

view details

Josh Bleecher Snyder

commit sha 859542ea7d2e4fc6d5312cd3dc8d51fa3670a941

go.sum: let cmd/go scribble

view details

Josh Bleecher Snyder

commit sha f0356d9df2d0b8786f97730071a23520215e75a0

update readme and todo

view details

Josh Bleecher Snyder

commit sha 84ebd80e9130ff3bc3899be1ca092ff31e2621a7

all: clean up some docs

view details

Josh Bleecher Snyder

commit sha 0bf1797b23964681d63cacab514f5ae094eb15b0

write: check err from Unified in test

view details

Josh Bleecher Snyder

commit sha 4849219ecbd68faa95ff0faf37e654d593d7781e

cmd/pkg-diff-example: support use as an external git diff tool this makes it easier to quickly use it on real world diffs. sample usage: $ GIT_EXTERNAL_DIFF="`which pkg-diff-example` -color" git diff

view details

Josh Bleecher Snyder

commit sha 41cc38ae142420c0fd15ca63e3ae02ffdf91068d

write: use bufio instead of errWriter This simplifies the code and improves performance. The downside is that we no longer know the number of bytes written. (This entails an API change, which is the reason to do it now, while we can.) But this is not a common need, and worst case, callers can count themselves by wrapping their writer in a counting writer.

view details

Josh Bleecher Snyder

commit sha 13b73a993604f83bc121134de1ab3466163cdfca

all: add a high level benchmark actually, add a high level benchmark framework. the first fixture comes from commit 870080752d175d5cede350486acf36213c64f35c in the Go repository. it is a large generated file that got regenerated in that commit into a more compact form. it has small changes scattered throughout a large file. it is thus a nice torture test for a diff algorithm.

view details

Josh Bleecher Snyder

commit sha 4065ac9eb877c54e35f6e748e916c8cdcf44bbad

myers: fix stupid amounts of allocation and copying that was shockingly lazy code to have written, TODO or not TODO. fix it. name old time/op new time/op delta Golden/testdata/rewriteAMD64.go-8 23.9s ±42% 0.5s ± 2% -97.98% (p=0.000 n=10+9) name old alloc/op new alloc/op delta Golden/testdata/rewriteAMD64.go-8 19.5GB ± 0% 0.8GB ± 0% -96.02% (p=0.000 n=9+10) name old allocs/op new allocs/op delta Golden/testdata/rewriteAMD64.go-8 150k ± 0% 150k ± 0% -0.00% (p=0.000 n=10+10)

view details

Josh Bleecher Snyder

commit sha e8890afd1f155a280f47e8a7e9d35bee670bc9c9

intern: create package there's not much to it, but it does prevent others from having to roll their own, which is broadly speaking the point of this module. name old time/op new time/op delta Golden/testdata/rewriteAMD64.go-8 482ms ± 2% 418ms ± 2% -13.22% (p=0.000 n=9+9) name old alloc/op new alloc/op delta Golden/testdata/rewriteAMD64.go-8 777MB ± 0% 770MB ± 0% -0.90% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Golden/testdata/rewriteAMD64.go-8 150k ± 0% 41k ± 0% -72.60% (p=0.000 n=10+10)

view details

Josh Bleecher Snyder

commit sha 3b17ca09f7ba42274135828b79e5e99ecbf57b00

readme: refer to module by its full path

view details

Josh Bleecher Snyder

commit sha 0f84953dec38f4d58659769a00b1c2e9f7b69632

myers: specify which myers' diff algorithm we're using i believe this may explain the significant performance gap between this module and git's implementation. good thing i'm doing all this digging while the api still has some flexibility. eek. :) updates #18, insofar as it means that i want to do some more implementing before declaring this part of the api stable.

view details

Josh Bleecher Snyder

commit sha d40ec79d4dfb8c6cc323aa9ae2e877f03a6c993b

readme: add another diff implementation resource

view details

push time in 14 days

issue commentsethvargo/go-signalcontext

Missing call to signal.Stop

This feels kinda rude.

josharian

comment created time in 16 days

pull request commenttailscale/tailscale

wgengine/magicsock: reduce test flakiness

I don't understand why the depaware check is failing; depaware passes locally for me, and I don't think I added any new dependencies. On Monday I'll make depaware's --check more verbose to figure it out. This PR can wait until then.

josharian

comment created time in 17 days

more