conn: fix getSrcFromControl() iteration
We only expect a single control message in the normal case, but this would loop infinitely if there were more. Reviewed-by: Adrian Dewhurst <adrian@tailscale.com> Signed-off-by: Jordan Whited <jordan@tailscale.com> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									fff53afca7
								
							
						
					
					
						commit
						07a1e55270
					
				| @ -25,7 +25,7 @@ func getSrcFromControl(control []byte, ep *StdNetEndpoint) { | |||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	for len(rem) > unix.SizeofCmsghdr { | 	for len(rem) > unix.SizeofCmsghdr { | ||||||
| 		hdr, data, rem, err = unix.ParseOneSocketControlMessage(control) | 		hdr, data, rem, err = unix.ParseOneSocketControlMessage(rem) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -150,6 +150,34 @@ func Test_getSrcFromControl(t *testing.T) { | |||||||
| 			t.Errorf("unexpected ifindex: %d", ep.src.ifidx) | 			t.Errorf("unexpected ifindex: %d", ep.src.ifidx) | ||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
|  | 	t.Run("Multiple", func(t *testing.T) { | ||||||
|  | 		zeroControl := make([]byte, unix.CmsgSpace(0)) | ||||||
|  | 		zeroHdr := (*unix.Cmsghdr)(unsafe.Pointer(&zeroControl[0])) | ||||||
|  | 		zeroHdr.SetLen(unix.CmsgLen(0)) | ||||||
|  | 
 | ||||||
|  | 		control := make([]byte, srcControlSize) | ||||||
|  | 		hdr := (*unix.Cmsghdr)(unsafe.Pointer(&control[0])) | ||||||
|  | 		hdr.Level = unix.IPPROTO_IP | ||||||
|  | 		hdr.Type = unix.IP_PKTINFO | ||||||
|  | 		hdr.SetLen(unix.CmsgLen(int(unsafe.Sizeof(unix.Inet4Pktinfo{})))) | ||||||
|  | 		info := (*unix.Inet4Pktinfo)(unsafe.Pointer(&control[unix.CmsgLen(0)])) | ||||||
|  | 		info.Spec_dst = [4]byte{127, 0, 0, 1} | ||||||
|  | 		info.Ifindex = 5 | ||||||
|  | 
 | ||||||
|  | 		combined := make([]byte, 0) | ||||||
|  | 		combined = append(combined, zeroControl...) | ||||||
|  | 		combined = append(combined, control...) | ||||||
|  | 
 | ||||||
|  | 		ep := &StdNetEndpoint{} | ||||||
|  | 		getSrcFromControl(combined, ep) | ||||||
|  | 
 | ||||||
|  | 		if ep.src.Addr != netip.MustParseAddr("127.0.0.1") { | ||||||
|  | 			t.Errorf("unexpected address: %v", ep.src.Addr) | ||||||
|  | 		} | ||||||
|  | 		if ep.src.ifidx != 5 { | ||||||
|  | 			t.Errorf("unexpected ifindex: %d", ep.src.ifidx) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Test_listenConfig(t *testing.T) { | func Test_listenConfig(t *testing.T) { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user