From a8a908d1855ad80ac657078b909e90440e352412 Mon Sep 17 00:00:00 2001 From: Juha Hyttinen Date: Tue, 26 May 2020 15:12:47 +0300 Subject: [PATCH] RMR params payload points to params msgbuf. Make sure that freed memory is not used Change-Id: I5dc09c9ff0ca907a23d49d7055a6ee9eaf351480 Signed-off-by: Juha Hyttinen --- go.mod | 2 +- go.sum | 20 ++++++++++---------- pkg/control/control.go | 10 ++++++++++ pkg/control/ut_test.go | 30 ++++++++++++++++++------------ pkg/teststub/controlRmrStub.go | 4 ++++ pkg/teststub/rmrenv.go | 14 ++++++++------ 6 files changed, 51 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 9b2386e..6410b0f 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ module gerrit.o-ran-sc.org/r/ric-plt/submgr replace gerrit.o-ran-sc.org/r/ric-plt/sdlgo => gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2 -replace gerrit.o-ran-sc.org/r/ric-plt/xapp-frame => gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.4.9 +replace gerrit.o-ran-sc.org/r/ric-plt/xapp-frame => gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.4.11 replace gerrit.o-ran-sc.org/r/com/golog => gerrit.o-ran-sc.org/r/com/golog.git v0.0.1 diff --git a/go.sum b/go.sum index 0563736..2186933 100644 --- a/go.sum +++ b/go.sum @@ -3,16 +3,16 @@ gerrit.o-ran-sc.org/r/com/golog.git v0.0.1 h1:9RfO/Whehaaq5KiJTT7s+YOzmi9mT1C3Hk gerrit.o-ran-sc.org/r/com/golog.git v0.0.1/go.mod h1:b8YB31U8/4iRpABioeSzGi/YMzOQ/Zq7hrJmmXKqlJk= gerrit.o-ran-sc.org/r/ric-plt/alarm-go.git/alarm v0.4.2 h1:XNfkp3PwZ7pfkPszX7NaX6DzToCGjcWTLbIHYqCFNu0= gerrit.o-ran-sc.org/r/ric-plt/alarm-go.git/alarm v0.4.2/go.mod h1:AdEWKtERGvOQy9ybLhyhrb9w9LLVn8i9xzTwoR5n4BY= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.21 h1:eK9nUZOTMJ/EnMpH9bkWtMgOvCn3u4+PNCb9gu10s6w= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.21/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.21 h1:PQ/Mu2ol+8Oh/0BqCWWhPlVVoRCg5dQDEGm4+Opp5w4= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.21/go.mod h1:GXiXLz4ORBeIr0FLIbzENRykgh3Po5uPkX2jICxnRF0= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.21 h1:N3UbqJ9WqC8JEz/TwHHwZwCFAW6VTlZLpD5lnbdD+Y8= -gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.21/go.mod h1:SQBZLy1HP94i1vQ3y730wGFsrHqZtgPaEkzPgtqBNw0= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.35 h1:TGXHb4DNY8on+ej4S9VUnk2HibIC/5chDy64OE+bQBQ= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.0.35/go.mod h1:QJ1uPPZosGbhxUWpUpeM5fLqFHdnWTrVnvW2DgyOCes= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.35 h1:tkM3yE8UzmuH4nf9TqAmiNBSuIZ2CtcMRH2eBIYIzpQ= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.0.35/go.mod h1:G+4sUBMbLfQ+RrGS65U15tKmbnP+/1b5oLTPmMfyfT4= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.35 h1:LcxnUUDwsCzYEISKmkjkyYfg/lnLt8ofkPiGK69vNIA= +gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.0.35/go.mod h1:2bSaXTpECbZieB8bMnubTqMwF3n+mMBxlTaAXvcduNg= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2 h1:UK7awyRKIkVdokWvvkYvazlg3EWIfMnIqCcJxTnLlDA= gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.5.2/go.mod h1:y2WhrCvdLkAKdH+ySdHSOSehACJkTMyZghCGVcqoZzc= -gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.4.9 h1:ceyAhNmrbmhG7HnMjJRZCFQSI6T9YStC1G0sn48YOzs= -gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.4.9/go.mod h1:KW8iIt4GdHJHEHmVlSiz95rL4cLoWSIF3OmPeShRR/s= +gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.4.11 h1:XDdMGircM79SJ7FD+GEw60qK6RfdfEtyvO88VcoYt+s= +gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.4.11/go.mod h1:bjhhEII07w+zPQzyvqTq84TjKQPa6IkcnSyWB1DfGHo= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -127,8 +127,8 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= diff --git a/pkg/control/control.go b/pkg/control/control.go index 4978a8d..35e39f4 100755 --- a/pkg/control/control.go +++ b/pkg/control/control.go @@ -191,6 +191,16 @@ func (c *Control) Consume(params *xapp.RMRParams) (err error) { defer c.Rmr.Free(msg.Mbuf) + // xapp-frame might use direct access to c buffer and + // when msg.Mbuf is freed, someone might take it into use + // and payload data might be invalid inside message handle function + // + // subscriptions won't load system a lot so there is no + // real performance hit by cloning buffer into new go byte slice + cPay := append(msg.Payload[:0:0], msg.Payload...) + msg.Payload = cPay + msg.PayloadLen = len(cPay) + switch msg.Mtype { case xapp.RIC_SUB_REQ: go c.handleXAPPSubscriptionRequest(msg) diff --git a/pkg/control/ut_test.go b/pkg/control/ut_test.go index c0c3b72..baedbae 100644 --- a/pkg/control/ut_test.go +++ b/pkg/control/ut_test.go @@ -38,6 +38,11 @@ func CaseBegin(desc string) *teststub.TestWrapper { return tent } +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +const teststubPortSeed int = 55555 + //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- @@ -51,7 +56,7 @@ var mainCtrl *testingSubmgrControl var dummystub *teststubdummy.RmrDummyStub -func ut_test_init() { +func ut_test_init() func() { tent := CaseBegin("ut_test_init") //--------------------------------- @@ -108,7 +113,7 @@ func ut_test_init() { // If XID is not matching xapp stub will just // drop message. (Messages 12011, 12012, 12021, 12022) // - // NOTE2: 55555 message type is for stub rmr connectivity probing + // NOTE2: teststubPortSeed message type is for stub rmr connectivity probing // // NOTE3: Ports per entity: // @@ -140,13 +145,12 @@ func ut_test_init() { rt.AddRoute(12022, e2term2src.String(), -1, mainsrc.String()) rt.AddRoute(12021, mainsrc.String(), -1, xapp2src.String()+";"+xapp1src.String()) rt.AddRoute(12022, mainsrc.String(), -1, xapp2src.String()+";"+xapp1src.String()) - rt.AddRoute(55555, "", -1, xapp2src.String()+";"+xapp1src.String()+";"+e2term1src.String()+";"+e2term2src.String()+";"+dummysrc.String()) + rt.AddRoute(teststubPortSeed, "", -1, xapp2src.String()+";"+xapp1src.String()+";"+e2term1src.String()+";"+e2term2src.String()+";"+dummysrc.String()) rt.AddMeid(e2term1src.String(), []string{"RAN_NAME_1", "RAN_NAME_2"}) rt.AddMeid(e2term2src.String(), []string{"RAN_NAME_11", "RAN_NAME_12"}) rt.Enable() - defer rt.Disable() tent.Logger.Info("rttable[%s]", rt.Table()) //--------------------------------- @@ -168,8 +172,8 @@ func ut_test_init() { } else { tent.Logger.Info("Alarm has alternated RMR_SEED_RT=%s, so waiting 0.5 secs before restoring it", os.Getenv("RMR_SEED_RT")) time.Sleep(500 * time.Millisecond) - rt.Disable() rt.Enable() + tent.Logger.Info("rttable[%s]", rt.Table()) break } } @@ -183,36 +187,36 @@ func ut_test_init() { // //--------------------------------- tent.Logger.Info("### xapp1 stub run ###") - xappConn1 = teststube2ap.CreateNewE2Stub("xappstub1", xapp1src, teststub.RmrRtgSvc{}, "RMRXAPP1STUB", 55555) + xappConn1 = teststube2ap.CreateNewE2Stub("xappstub1", xapp1src, teststub.RmrRtgSvc{}, "RMRXAPP1STUB", teststubPortSeed) //--------------------------------- // //--------------------------------- tent.Logger.Info("### xapp2 stub run ###") - xappConn2 = teststube2ap.CreateNewE2Stub("xappstub2", xapp2src, teststub.RmrRtgSvc{}, "RMRXAPP2STUB", 55555) + xappConn2 = teststube2ap.CreateNewE2Stub("xappstub2", xapp2src, teststub.RmrRtgSvc{}, "RMRXAPP2STUB", teststubPortSeed) //--------------------------------- // //--------------------------------- tent.Logger.Info("### e2term1 stub run ###") - e2termConn1 = teststube2ap.CreateNewE2termStub("e2termstub1", e2term1src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB1", 55555) + e2termConn1 = teststube2ap.CreateNewE2termStub("e2termstub1", e2term1src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB1", teststubPortSeed) //--------------------------------- // //--------------------------------- tent.Logger.Info("### e2term2 stub run ###") - e2termConn2 = teststube2ap.CreateNewE2termStub("e2termstub2", e2term2src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB2", 55555) + e2termConn2 = teststube2ap.CreateNewE2termStub("e2termstub2", e2term2src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB2", teststubPortSeed) //--------------------------------- // Just to test dummy stub //--------------------------------- tent.Logger.Info("### dummy stub run ###") - dummystub = teststubdummy.CreateNewRmrDummyStub("dummystub", dummysrc, teststub.RmrRtgSvc{}, "DUMMYSTUB", 55555) + dummystub = teststubdummy.CreateNewRmrDummyStub("dummystub", dummysrc, teststub.RmrRtgSvc{}, "DUMMYSTUB", teststubPortSeed) //--------------------------------- // Testing message sending //--------------------------------- - if teststub.RmrStubControlWaitAlive(10, 55555, mainCtrl.c) == false { + if teststub.RmrStubControlWaitAlive(10, teststubPortSeed, mainCtrl.c) == false { os.Exit(1) } @@ -221,6 +225,7 @@ func ut_test_init() { os.Exit(1) } + return func() { rt.Disable() } } //----------------------------------------------------------------------------- @@ -228,7 +233,8 @@ func ut_test_init() { //----------------------------------------------------------------------------- func TestMain(m *testing.M) { CaseBegin("TestMain start") - ut_test_init() + cleanfn := ut_test_init() code := m.Run() + cleanfn() os.Exit(code) } diff --git a/pkg/teststub/controlRmrStub.go b/pkg/teststub/controlRmrStub.go index 0f207e8..958b8b8 100644 --- a/pkg/teststub/controlRmrStub.go +++ b/pkg/teststub/controlRmrStub.go @@ -88,6 +88,10 @@ func (tc *RmrStubControl) Consume(params *xapp.RMRParams) (err error) { msg := xapptweaks.NewParams(params) tc.CntRecvMsg++ + cPay := append(msg.Payload[:0:0], msg.Payload...) + msg.Payload = cPay + msg.PayloadLen = len(cPay) + if msg.Mtype == tc.InitMsg { tc.Logger.Info("Testing message ignore %s", msg.String()) tc.SetActive() diff --git a/pkg/teststub/rmrenv.go b/pkg/teststub/rmrenv.go index 5a57b56..cf1e284 100644 --- a/pkg/teststub/rmrenv.go +++ b/pkg/teststub/rmrenv.go @@ -53,9 +53,9 @@ func (rrt *RmrRouteTable) AddRoute(mtype int, src string, subid int, trg string) func (rrt *RmrRouteTable) AddMeid(trg string, meids []string) { line := "mme_ar" - line += "|" + line += " | " line += trg - line += "|" + line += " | " for _, str := range meids { line += " " + str } @@ -65,7 +65,7 @@ func (rrt *RmrRouteTable) AddMeid(trg string, meids []string) { func (rrt *RmrRouteTable) DelMeid(meids []string) { line := "mme_del" - line += "|" + line += " | " for _, str := range meids { line += " " + str } @@ -82,6 +82,7 @@ func (rrt *RmrRouteTable) Table() string { allrt += val + "\n" } allrt += "newrt|end\n" + allrt += "\n" allrt += "meid_map | start\n" for _, val := range rrt.meids { allrt += val + "\n" @@ -91,11 +92,11 @@ func (rrt *RmrRouteTable) Table() string { } func (rrt *RmrRouteTable) Enable() { - if len(rrt.tmpfile) > 0 { - os.Remove(rrt.tmpfile) + if len(rrt.tmpfile) == 0 { + rrt.tmpfile, _ = CreateTmpFile(rrt.Table()) } - rrt.tmpfile, _ = CreateTmpFile(rrt.Table()) os.Setenv("RMR_SEED_RT", rrt.tmpfile) + os.Setenv("RMR_RTG_SVC", "-1") xapp.Logger.Info("Using rt file %s", os.Getenv("RMR_SEED_RT")) } @@ -103,6 +104,7 @@ func (rrt *RmrRouteTable) Disable() { if len(rrt.tmpfile) > 0 { os.Remove(rrt.tmpfile) os.Unsetenv("RMR_SEED_RT") + os.Unsetenv("RMR_RTG_SVC") rrt.tmpfile = "" xapp.Logger.Info("Not using rt file ") } -- 2.16.6