Skip to content

Commit

Permalink
fix(plc4go/knx): avoid panics
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed May 11, 2023
1 parent 13920f0 commit 9328974
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 17 deletions.
15 changes: 12 additions & 3 deletions plc4go/internal/knxnetip/Reader.go
Expand Up @@ -22,6 +22,7 @@ package knxnetip
import (
"context"
"errors"
"github.com/rs/zerolog/log"
"strconv"
"strings"
"time"
Expand Down Expand Up @@ -168,6 +169,7 @@ func (m Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest) <
func (m Reader) readGroupAddress(ctx context.Context, tag GroupAddressTag) (apiModel.PlcResponseCode, apiValues.PlcValue) {
rawAddresses, err := m.resolveAddresses(tag)
if err != nil {
log.Debug().Err(err).Msg("error resolving addresses")
return apiModel.PlcResponseCode_INVALID_ADDRESS, nil
}

Expand All @@ -178,8 +180,11 @@ func (m Reader) readGroupAddress(ctx context.Context, tag GroupAddressTag) (apiM
returnCodes := map[string]apiModel.PlcResponseCode{}
for _, numericAddress := range rawAddresses {
// Create a string representation of this numeric address depending on the type of requested address
stringAddress := NumericGroupAddressToString(numericAddress, tag)

stringAddress, err := NumericGroupAddressToString(numericAddress, tag)
if err != nil {
log.Debug().Err(err).Msg("error mapping addresses")
return apiModel.PlcResponseCode_INVALID_ADDRESS, nil
}
// Try to get a value from the cache
m.connection.valueCacheMutex.RLock()
int8s, ok := m.connection.valueCache[numericAddress]
Expand Down Expand Up @@ -233,7 +238,11 @@ func (m Reader) readGroupAddress(ctx context.Context, tag GroupAddressTag) (apiM
// If there is only one address to read, return this directly.
// Otherwise, return a struct, with the keys being the string representations of the address.
if len(rawAddresses) == 1 {
stringAddress := NumericGroupAddressToString(rawAddresses[0], tag)
stringAddress, err := NumericGroupAddressToString(rawAddresses[0], tag)
if err != nil {
log.Debug().Err(err).Msg("error mapping addresses")
return apiModel.PlcResponseCode_INVALID_ADDRESS, nil
}
return apiModel.PlcResponseCode_OK, values[stringAddress]
} else if len(rawAddresses) > 1 {
// Add it to the result
Expand Down
10 changes: 9 additions & 1 deletion plc4go/internal/knxnetip/SubscriptionEvent.go
Expand Up @@ -26,6 +26,8 @@ import (
"github.com/apache/plc4x/plc4go/pkg/api/values"
driverModel "github.com/apache/plc4x/plc4go/protocols/knxnetip/readwrite/model"
internalModel "github.com/apache/plc4x/plc4go/spi/model"

"github.com/rs/zerolog/log"
)

type SubscriptionEvent struct {
Expand Down Expand Up @@ -57,7 +59,13 @@ func (m SubscriptionEvent) GetAddress(name string) string {
groupAddress, err = driverModel.KnxGroupAddressParse(rawAddress, 1)
}
if err != nil {
log.Debug().Err(err).Msg("error parsing")
return ""
}
toString, err := GroupAddressToString(groupAddress)
if err != nil {
log.Debug().Err(err).Msg("error mapping")
return ""
}
return GroupAddressToString(groupAddress)
return toString
}
26 changes: 13 additions & 13 deletions plc4go/internal/knxnetip/Utils.go
Expand Up @@ -20,49 +20,49 @@
package knxnetip

import (
"fmt"
"github.com/pkg/errors"
"strconv"

driverModel "github.com/apache/plc4x/plc4go/protocols/knxnetip/readwrite/model"
)

func NumericGroupAddressToString(numericAddress uint16, groupAddress GroupAddressTag) string {
func NumericGroupAddressToString(numericAddress uint16, groupAddress GroupAddressTag) (string, error) {
if groupAddress == nil {
return ""
return "", nil
}
switch groupAddress.(type) {
case GroupAddress3LevelPlcTag:
main := numericAddress >> 11
middle := (numericAddress >> 8) & 0x07
sub := numericAddress & 0xFF
return strconv.Itoa(int(main)) + "/" + strconv.Itoa(int(middle)) + "/" + strconv.Itoa(int(sub))
return strconv.Itoa(int(main)) + "/" + strconv.Itoa(int(middle)) + "/" + strconv.Itoa(int(sub)), nil
case GroupAddress2LevelPlcTag:
main := numericAddress >> 11
sub := numericAddress & 0x07FF
return strconv.Itoa(int(main)) + "/" + strconv.Itoa(int(sub))
return strconv.Itoa(int(main)) + "/" + strconv.Itoa(int(sub)), nil
case GroupAddress1LevelPlcTag:
return strconv.Itoa(int(numericAddress))
return strconv.Itoa(int(numericAddress)), nil
default:
panic(fmt.Sprintf("Unmapped %T", groupAddress))
return "", errors.Errorf("Unmapped %T", groupAddress)
}
}

func GroupAddressToString(groupAddress driverModel.KnxGroupAddress) string {
func GroupAddressToString(groupAddress driverModel.KnxGroupAddress) (string, error) {
if groupAddress == nil {
return ""
return "", nil
}
switch groupAddress := groupAddress.(type) {
case driverModel.KnxGroupAddress3Level:
level3 := groupAddress
return strconv.Itoa(int(level3.GetMainGroup())) + "/" + strconv.Itoa(int(level3.GetMiddleGroup())) + "/" + strconv.Itoa(int(level3.GetSubGroup()))
return strconv.Itoa(int(level3.GetMainGroup())) + "/" + strconv.Itoa(int(level3.GetMiddleGroup())) + "/" + strconv.Itoa(int(level3.GetSubGroup())), nil
case driverModel.KnxGroupAddress2Level:
level2 := groupAddress
return strconv.Itoa(int(level2.GetMainGroup())) + "/" + strconv.Itoa(int(level2.GetSubGroup()))
return strconv.Itoa(int(level2.GetMainGroup())) + "/" + strconv.Itoa(int(level2.GetSubGroup())), nil
case driverModel.KnxGroupAddressFreeLevel:
level1 := groupAddress
return strconv.Itoa(int(level1.GetSubGroup()))
return strconv.Itoa(int(level1.GetSubGroup())), nil
default:
panic(fmt.Sprintf("Unmapped %T", groupAddress))
return "", errors.Errorf("Unmapped %T", groupAddress)
}
}

Expand Down

0 comments on commit 9328974

Please sign in to comment.