mirror of https://github.com/google/oss-fuzz.git
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
|
|
}
|