Skip to content

NTNDArrayConverterPvxs cannot handle string attributes #571

@stephen-jd-dann

Description

@stephen-jd-dann

When a string attribute is fed to NDPluginPvxs, the IOC immediately segfaults. I managed to produce this error using the epics-containers image and I've included a complete example (using a compose file) showing the problem. I've also tracked down what I think is the cause.

A bit of gdb reveals the cause of the problem. The backtrace includes fromStringAttribute.

void NTNDArrayConverterPvxs::fromStringAttribute (Value destValue, NDAttribute *src)
{
    const char *value;
    src->getValue(src->getDataType(), (void*)&value);
    destValue["value"] = std::string(value);
}

The segfault happens on the last line, but the bug is on the line above that. Asking gdb to print value reveals:

(gdb) print value
$3 = 0x6574616c756d6953 <error: Cannot access memory at address 0x6574616c756d6953>

That's a very suspicious looking pointer. In fact, the memory that should contain the value pointer now contains a string:

(gdb) x/12c &value
0x7f1690d59028: 83 'S'  105 'i' 109 'm' 117 'u' 108 'l' 97 'a'  116 't' 101 'e'
0x7f1690d59030: 100 'd' 32 ' '  100 'd' 101 'e'

So it looks like src->getValue is overwriting the value pointer with the string data, instead of a pointer to the string data. The corresponding code in NTNDArrayConverter looks promising:

void NTNDArrayConverter::fromStringAttribute (PVStructurePtr dest, NDAttribute *src)
{
    NDAttrDataType_t attrDataType;
    size_t attrDataSize;

    src->getValueInfo(&attrDataType, &attrDataSize);
    std::vector<char> value(attrDataSize);
    src->getValue(attrDataType, &value[0], attrDataSize);

Sadly I'm not confident enough to attempt a fix, but hopefully this will help out.

FYI @gilesknap

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions