Skip to content

Commit 4a935dd

Browse files
committed
Error checking for some structure fields
1 parent da2a19e commit 4a935dd

File tree

7 files changed

+115
-0
lines changed

7 files changed

+115
-0
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Changelog
22
Newest updates are at the top of this file.
33

4+
## July 30 2019 - v4.0.10
5+
* ibmmq - Add error checking to some structure fields (#111)
6+
47
## July 22 2019 - v4.0.9
58
* mqmetric - Support RESET QSTATS on z/OS queue manager
69
* mqmetric - Add a Logger class to enable debug output

ibmmq/mqi.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@ func (x *MQQueueManager) Sub(gosd *MQSD, qObject *MQObject) (MQObject, error) {
336336
qMgr: x,
337337
}
338338

339+
err := checkSD(gosd, "MQSUB")
340+
if err != nil {
341+
return subObject, err
342+
}
343+
339344
copySDtoC(&mqsd, gosd)
340345

341346
C.MQSUB(x.hConn,
@@ -504,6 +509,11 @@ func (object MQObject) Put(gomd *MQMD,
504509
var mqpmo C.MQPMO
505510
var ptr C.PMQVOID
506511

512+
err := checkMD(gomd, "MQPUT")
513+
if err != nil {
514+
return err
515+
}
516+
507517
bufflen := len(buffer)
508518

509519
copyMDtoC(&mqmd, gomd)
@@ -550,6 +560,11 @@ func (x *MQQueueManager) Put1(good *MQOD, gomd *MQMD,
550560
var mqod C.MQOD
551561
var ptr C.PMQVOID
552562

563+
err := checkMD(gomd, "MQPUT1")
564+
if err != nil {
565+
return err
566+
}
567+
553568
copyODtoC(&mqod, good)
554569
copyMDtoC(&mqmd, gomd)
555570
copyPMOtoC(&mqpmo, gopmo)
@@ -600,6 +615,15 @@ func (object MQObject) Get(gomd *MQMD,
600615
var datalen C.MQLONG
601616
var ptr C.PMQVOID
602617

618+
err := checkMD(gomd, "MQGET")
619+
if err != nil {
620+
return 0, err
621+
}
622+
err = checkGMO(gogmo, "MQGET")
623+
if err != nil {
624+
return 0, err
625+
}
626+
603627
bufflen := len(buffer)
604628

605629
copyMDtoC(&mqmd, gomd)

ibmmq/mqiMQGMO.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,23 @@ func NewMQGMO() *MQGMO {
7575
return gmo
7676
}
7777

78+
func checkGMO(gogmo *MQGMO, verb string) error {
79+
mqrc := C.MQRC_NONE
80+
81+
if len(gogmo.MsgToken) != C.MQ_MSG_TOKEN_LENGTH {
82+
mqrc = C.MQRC_GMO_ERROR
83+
}
84+
85+
if mqrc != C.MQRC_NONE {
86+
mqreturn := MQReturn{MQCC: C.MQCC_FAILED,
87+
MQRC: int32(mqrc),
88+
verb: verb,
89+
}
90+
return &mqreturn
91+
}
92+
return nil
93+
}
94+
7895
func copyGMOtoC(mqgmo *C.MQGMO, gogmo *MQGMO) {
7996
var i int
8097

ibmmq/mqiMQMD.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,32 @@ func NewMQMD() *MQMD {
103103
return md
104104
}
105105

106+
func checkMD(gomd *MQMD, verb string) error {
107+
mqrc := C.MQRC_NONE
108+
109+
if len(gomd.MsgId) != C.MQ_MSG_ID_LENGTH {
110+
mqrc = C.MQRC_MSG_ID_ERROR
111+
}
112+
if len(gomd.CorrelId) != C.MQ_CORREL_ID_LENGTH {
113+
mqrc = C.MQRC_CORREL_ID_ERROR
114+
}
115+
if len(gomd.GroupId) != C.MQ_GROUP_ID_LENGTH {
116+
mqrc = C.MQRC_GROUP_ID_ERROR
117+
}
118+
if len(gomd.AccountingToken) != C.MQ_ACCOUNTING_TOKEN_LENGTH {
119+
mqrc = C.MQRC_MD_ERROR // No specific error defined
120+
}
121+
122+
if mqrc != C.MQRC_NONE {
123+
mqreturn := MQReturn{MQCC: C.MQCC_FAILED,
124+
MQRC: int32(mqrc),
125+
verb: verb,
126+
}
127+
return &mqreturn
128+
}
129+
return nil
130+
}
131+
106132
func copyMDtoC(mqmd *C.MQMD, gomd *MQMD) {
107133
var i int
108134
setMQIString((*C.char)(&mqmd.StrucId[0]), "MD ", 4)

ibmmq/mqiMQOD.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,23 @@ func NewMQOD() *MQOD {
9898
return od
9999
}
100100

101+
func checkOD(good *MQOD, verb string) error {
102+
mqrc := C.MQRC_NONE
103+
104+
if len(good.AlternateSecurityId) != C.MQ_SECURITY_ID_LENGTH {
105+
mqrc = C.MQRC_OD_ERROR
106+
}
107+
108+
if mqrc != C.MQRC_NONE {
109+
mqreturn := MQReturn{MQCC: C.MQCC_FAILED,
110+
MQRC: int32(mqrc),
111+
verb: verb,
112+
}
113+
return &mqreturn
114+
}
115+
return nil
116+
}
117+
101118
/*
102119
* It is expected that copyXXtoC and copyXXfromC will be called as
103120
* matching pairs. That means that we can handle the MQCHARV type

ibmmq/mqiMQSD.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,25 @@ func NewMQSD() *MQSD {
9090
return sd
9191
}
9292

93+
func checkSD(gosd *MQSD, verb string) error {
94+
mqrc := C.MQRC_NONE
95+
96+
if len(gosd.AlternateSecurityId) != C.MQ_SECURITY_ID_LENGTH {
97+
mqrc = C.MQRC_SD_ERROR
98+
}
99+
if len(gosd.PubAccountingToken) != C.MQ_ACCOUNTING_TOKEN_LENGTH {
100+
mqrc = C.MQRC_SD_ERROR
101+
}
102+
if mqrc != C.MQRC_NONE {
103+
mqreturn := MQReturn{MQCC: C.MQCC_FAILED,
104+
MQRC: int32(mqrc),
105+
verb: verb,
106+
}
107+
return &mqreturn
108+
}
109+
return nil
110+
}
111+
93112
/*
94113
It is expected that copyXXtoC and copyXXfromC will be called as
95114
matching pairs. That means that we can handle the MQCHARV type

ibmmq/mqicb.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,15 @@ func (object *MQObject) CB(goOperation int32, gocbd *MQCBD, gomd *MQMD, gogmo *M
145145
var mqmd C.MQMD
146146
var mqgmo C.MQGMO
147147

148+
err := checkMD(gomd, "MQCB")
149+
if err != nil {
150+
return err
151+
}
152+
err = checkGMO(gogmo, "MQCB")
153+
if err != nil {
154+
return err
155+
}
156+
148157
mqOperation = C.MQLONG(goOperation)
149158
copyCBDtoC(&mqcbd, gocbd)
150159
copyMDtoC(&mqmd, gomd)

0 commit comments

Comments
 (0)