package amqp import ( "context" "os" "path/filepath" "strconv" "testing" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/testconn" "github.com/fortytw2/leaktest" "github.com/stretchr/testify/require" ) func fuzzConn(data []byte) int { // Receive ctx, cancel := context.WithTimeout(context.Background(), 20*time.Millisecond) client, err := NewConn(ctx, testconn.New(data), &ConnOptions{ IdleTimeout: 20 * time.Millisecond, SASLType: SASLTypePlain("listen", "3aCXZYFcuZA89xe6lZkfYJvOPnTGipA3ap7NvPruBhI="), }) cancel() if err != nil { return 0 } defer client.Close() s, err := client.NewSession(context.Background(), nil) if err != nil { return 0 } r, err := s.NewReceiver(context.Background(), "source", &ReceiverOptions{ Credit: 2, }) if err != nil { return 0 } msg, err := r.Receive(context.Background(), nil) if err != nil { return 0 } if err = r.AcceptMessage(context.Background(), msg); err != nil { return 0 } ctx, close := context.WithTimeout(context.Background(), 10*time.Millisecond) defer close() r.Close(ctx) s.Close(ctx) // Send ctx, cancel = context.WithTimeout(context.Background(), time.Second) client, err = NewConn(ctx, testconn.New(data), &ConnOptions{ IdleTimeout: 10 * time.Millisecond, SASLType: SASLTypePlain("listen", "3aCXZYFcuZA89xe6lZkfYJvOPnTGipA3ap7NvPruBhI="), }) cancel() if err != nil { return 0 } defer client.Close() s, err = client.NewSession(context.Background(), nil) if err != nil { return 0 } sender, err := s.NewSender(context.Background(), "source", nil) if err != nil { return 0 } err = sender.Send(context.Background(), NewMessage(data), nil) if err != nil { return 0 } ctx, close = context.WithTimeout(context.Background(), 10*time.Millisecond) defer close() r.Close(ctx) s.Close(ctx) return 1 } func fuzzUnmarshal(data []byte) int { types := []any{ new(frames.PerformAttach), new(*frames.PerformAttach), new(frames.PerformBegin), new(*frames.PerformBegin), new(frames.PerformClose), new(*frames.PerformClose), new(frames.PerformDetach), new(*frames.PerformDetach), new(frames.PerformDisposition), new(*frames.PerformDisposition), new(frames.PerformEnd), new(*frames.PerformEnd), new(frames.PerformFlow), new(*frames.PerformFlow), new(frames.PerformOpen), new(*frames.PerformOpen), new(frames.PerformTransfer), new(*frames.PerformTransfer), new(frames.Source), new(*frames.Source), new(frames.Target), new(*frames.Target), new(encoding.SASLCode), new(*encoding.SASLCode), new(frames.SASLMechanisms), new(*frames.SASLMechanisms), new(frames.SASLChallenge), new(*frames.SASLChallenge), new(frames.SASLResponse), new(*frames.SASLResponse), new(frames.SASLOutcome), new(*frames.SASLOutcome), new(Message), new(*Message), new(MessageHeader), new(*MessageHeader), new(MessageProperties), new(*MessageProperties), } for _, t := range types { _ = encoding.Unmarshal(buffer.New(data), t) _, _ = encoding.ReadAny(buffer.New(data)) } return 0 } func TestFuzzConnCrashers(t *testing.T) { tests := []string{ 0: "\x00\x00\x00\x010000", 1: "\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc02\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00\x05PLAIN\x00\x00\x00\tANONYMOUS\x00\x00\x00\bEXTERNAL", 2: "AMQP\x03\x01\x00\x00\x00\x00\x00\x1a0000\x00SD\xc00\x02P0\xa0\x0000000000", 3: "AMQP\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00S@\xc0108412541625644849\xe0", 4: "\x00\x00\x00\x1a0000\x00SD\xc000P0\xa0\x0000000000", 5: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\x12\v\xa1\x05/tes" + "t@@@@@@@@@@@@@C\x80\x00\x00\x00\x00" + "\x00\x04\x10\x00@@@\x00\x00\x01y\x02\x00\x00\x00\x00S\x14\xc0\x1d" + "\vCC\xa0\x10F>\xc6\\\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3" + ";C@B@@@@A\x00Sp\xc0\n\x05@@pH\x19" + "\b\x00@C\x00Sr\xc1\\\x06\xa3\x13x-opt-en" + "queued-time\x83\x00\x00\x01[\x9c_)\xd1" + "\xa3\x15x-opt-sequence-num" + "ber\x81\x00\x00\x00\x00\x00\x00\x03x\xa3\x12x-opt-" + "locked-until\x83\x00\x00\x01[\x9c_\x9f" + "\x11\x00Ss\xc0H\r\xa1$5e84053f-81" + "c9-49fc-ae42-ff0ab35" + "3d998@@\xa1\x14Service Bus" + " Explorer@@@@@@@@@\x00S" + "t\xc18\x04\xa1\vMachineName\xa1\x0fW" + "IN-37U7RVPH3B1\xa1\bUser" + "Name\xa1\rAdministrator\x00" + "Su\xa0P\r\nHi mate" + ", how are you?", 6: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\xf8\x00\x00\aMSSBCBm\x00\x00\x00" + "\x05PLA\xff\x00\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\b\x14\nEXTERNAL", 7: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x02", 8: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSS \x00\x00\x00\x00\x00\x00" + "\x05PLAIN�^�~\x00\x00\x00\tAN" + "\xcfNYMOUS\x00\x00\x00\bEXT\xf1\xf1I\xdf\xed", 9: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x02\x00S\x12\xa1JNPuzy" + "MPawtPilffySBhxtxVGC" + "B@\x00\xc0\x05/ts@@@@C\x80\x00\x00\x04@\x00\x00" + "\x01y\x02\x00\x14\xc0CC\x10>\xc6\\\x9c\xa8\xe7\x83;@@@" + "@pHC\x00S\xc1\\\xa3\x13xopenqud-t" + "me\x83\x00\x01\xa3\x15-o-equneubr\x00\x00" + "\x00\x00\x03xxp-lced-util\x83\x00\x01\x9c" + "\x9f\r\xa1$5e0589-f-4fb339@" + "@\xa1\x14ervuExplor@@@@@\xc1a" + "cNIN3VP\xa1UserN\xa1Amitao" + "u?m n=\". cin=\"ut-?>m" + "ssagHimae arey/mess>", 10: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\xa9\x80@@@@@\x00\x00\x00\x1f\x02\x00\x00" + "\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88R\x01R" + "\xff@@@\x00\x00\x00d\x00\x00S\x12\xc0", 11: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00S(oJNPsiMPf" + "sfkSGlxxVGCB@P\x01\x00\xc0\x12\xa1\x05" + "/st@@@@\x80\x00\x00\x10\x00@@\x00\x00\x00S\x14\xc0" + "\x1d\vC\xa0\x10>\\\xfa\xa8\x8eC@@A\x00\xc0\n@\b@" + "\x00\x06\xa3x-oenqe-ti\x00\x01[_ѣx" + "-p-senenue\x00\x00\x00\x00\x03x\xa3\x12pt" + "-lked-tl\x83\x00\x01\x9c\x11\x00Ss\xc05e8" + "41c9-4c-e42-fab3d\xa1\x14e" + "rvsEpr@@@@@@\x00t\xc1\x04\xa1Mhi" + "n\xa1\x0fN3RB\bUsNminrato\xa0<" + "?m vro=\"10ncodig\"utf" + "?\r", 12: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAINlf�\t��s\x00" + "?\x02\x00\x00\x00\x00ShxtxVSGCB@P\x01\x00" + "Q", 13: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x04\x00S@\xc0" + "1\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCB\xff\x00\x00\x00" + "\x05PLAIN\xfa\x00\x00\tAN\xcfNYMOUS\x00" + "\x00\x00\bE\xef\xbf\x02\x00\fU ", 14: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUR\xff" + "\xff\xed\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\x12\v\xa1\x05/tes" + "t@@@@@@@@@@@C\x80\x00\x00\x00\x00\x00\x04" + "\x10\x00@@@\x00\x00\x01y\x02\x00\x00\x00\x00S\x14\xc0\x1d\vC" + "C\xa0\x10F>\xc6\\\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3;C" + "@B@@@@A\x00Sp\xc0\n\x05@@pH\x19\b\x00" + "@C\x00Sr\xc1\\\x06\xa3\x13x-opt-enqu" + "eued-time\x83\x00\x00\x01[\x9c_)ѣ\x15" + "x-opt-sequence-numbe" + "r\x81\x00\x00\x00\x00\x00\x00\x03x\xa3\x12x-opt-lo" + "cked-until\x83\x00\x00\x01[\x9c_\x9f\x11\x00" + "Ss\xc0H\r\xa1$5e84053f-81c9" + "-49fc-ae42-ff0ab353d" + "998@@\xa1\x14Service Bus E" + "xplorer@@@@@@@@@\x00St\xc1" + "8\x04\xa1\vMachineNam", 15: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!A2Q" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\"\xd9\aTERNA" + "L\x00\x00t@@@@@@@\x17\r\r\x1a@@@@@" + "@C\x80\x00\x00\x01[\x9c\x00\x00\x00\x00\x04\x10\x00@-@\x00\x00" + "\x01y\x02\x00\x00\x00\x00S\x14\xc0\x1d\vCC\xa0\x10F>\xc6\\" + "\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3;C@B@@@A\x00" + "Sp\xc0\n\x05@@pH\x19\b\x00@C\x00r\xc1\\\xa3\x13" + "xop-enqueed-im\x83\x00\x00\x01[\x9c" + "_-ѣ\x15x-opt-squnce-nu" + "mber\x81\x00\x00\x00\x00\x00\x00\x03x\xa3\x12x@opt" + "-locked-until\x83\x00\x00\x01[\x9c_" + "\x9f\x11\x00Ss\xc0\r\xa1$58405f-81c9" + "-4fc-ae42-ff0ab353d9" + "98@@\xa1\x14Servie ", 16: "\x00\x00\x0000000\x00S\x17\xc00\x01000000" + "00000000000000000000" + "00000000000000000000" + "000", 17: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f301\"eeab1d_G29@p\x00" + "\x00\x00\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\x12\v\xa1\x05/tes" + "t@@@@@@@@@@@@@C\x80\x00\x00\x00\x00" + "\x00\x04\x10\x00@@@\x00\x00\x01y\x00\x00\x00\x00S\x14\xc0\x1dC" + "C\xa0\x10F>\xc6\\\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3C@" + "B@@@@\x00Sp\xc0\n\x05@@p\x19\b\x00@C\x00" + "Sr\xc1\\\x06\xa3\x13x-opt-enqueue" + "d-time\x83\x00\x00\x01[\x9c)ѣ\x15x-op" + "t-equence-nmbe\x81\x00\x00\x00\x00\x00" + "\x03x\xa3\x12x-opt-\xe6ocke-unti" + "l\x83\x00\x00\x01\x9c_\x9f\x11\x00SsH\r\xa1$5e84" + "053f-81c9-49fc-ae42-" + "ff0b353d998@\xa1\x14Servic" + " Bus Explrer@@@@@@@@" + "@\x00St\xc18\x04\xa1\vMachineName" + "\xa1\x0fWIN-37U7RVPH3B1\xa1Us" + "erName\xa1Administrator" + "\x00Su\xa0P