114 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| package grpc_hello_fuzz
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"log"
 | |
| 	"net"
 | |
| 	"time"
 | |
| 
 | |
| 	"google.golang.org/grpc"
 | |
| 	pb "google.golang.org/grpc/examples/helloworld/helloworld"
 | |
| )
 | |
| 
 | |
| var initialized = 0
 | |
| 
 | |
| type server struct {
 | |
| 	pb.UnimplementedGreeterServer
 | |
| }
 | |
| 
 | |
| // SayHello implements helloworld.GreeterServer
 | |
| func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
 | |
| 	log.Printf("Received: %v", in.GetName())
 | |
| 	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
 | |
| }
 | |
| 
 | |
| func FuzzHelloServer(data []byte) int {
 | |
| 	if initialized == 0 {
 | |
| 		lis, err := net.Listen("tcp", ":50051")
 | |
| 		if err != nil {
 | |
| 			log.Printf("failed to listen: %v\n", err)
 | |
| 			return 0
 | |
| 		}
 | |
| 		s := grpc.NewServer()
 | |
| 		pb.RegisterGreeterServer(s, &server{})
 | |
| 		// start server as a separate goroutine
 | |
| 		go func() {
 | |
| 			if err := s.Serve(lis); err != nil {
 | |
| 				log.Printf("failed to serve: %v\n", err)
 | |
| 			}
 | |
| 		}()
 | |
| 		initialized = 1
 | |
| 	}
 | |
| 
 | |
| 	conn, err := net.Dial("tcp", "localhost:50051")
 | |
| 	if err != nil {
 | |
| 		log.Printf("failed to dial: %v\n", err)
 | |
| 		return 0
 | |
| 	}
 | |
| 	conn.Write(data)
 | |
| 	response := make([]byte, 1+len(data))
 | |
| 	n, err := conn.Read(response)
 | |
| 	conn.Close()
 | |
| 	if err != nil || n == 0 {
 | |
| 		return 0
 | |
| 	}
 | |
| 	return 1
 | |
| }
 | |
| 
 | |
| var fuzzdata []byte
 | |
| 
 | |
| func FuzzHelloClient(data []byte) int {
 | |
| 	if len(data) == 0 {
 | |
| 		return 0
 | |
| 	}
 | |
| 	if initialized == 0 {
 | |
| 		lis, err := net.Listen("tcp", ":50051")
 | |
| 		if err != nil {
 | |
| 			log.Printf("failed to listen: %v\n", err)
 | |
| 			return 0
 | |
| 		}
 | |
| 		go func() {
 | |
| 			for {
 | |
| 				conn, err := lis.Accept()
 | |
| 				if err != nil {
 | |
| 					log.Printf("did not accept: %v", err)
 | |
| 					break
 | |
| 				}
 | |
| 				conn.SetDeadline(time.Now().Add(time.Millisecond * 100))
 | |
| 				request := make([]byte, 24)
 | |
| 				n, err := conn.Read(request)
 | |
| 				if err != nil || n == 0 {
 | |
| 					log.Printf("did not read: %v", err)
 | |
| 					conn.Close()
 | |
| 					break
 | |
| 				}
 | |
| 				n, err = conn.Write(fuzzdata)
 | |
| 				if err != nil || n == 0 {
 | |
| 					log.Printf("did not write: %v", err)
 | |
| 				}
 | |
| 				conn.Close()
 | |
| 			}
 | |
| 		}()
 | |
| 		initialized = 1
 | |
| 	}
 | |
| 
 | |
| 	fuzzdata = data
 | |
| 	// Set up a connection to the server.
 | |
| 	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*10)
 | |
| 	defer cancel()
 | |
| 	conn, err := grpc.DialContext(ctx, "localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
 | |
| 	if err != nil {
 | |
| 		return 0
 | |
| 	}
 | |
| 	defer conn.Close()
 | |
| 	c := pb.NewGreeterClient(conn)
 | |
| 
 | |
| 	// Contact the server and print out its response.
 | |
| 	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "world"})
 | |
| 	if err != nil {
 | |
| 		return 0
 | |
| 	}
 | |
| 	r.GetMessage()
 | |
| 	return 1
 | |
| }
 |