epics-modules / autosave

APS BCDA synApps module: autosave
https://epics-modules.github.io/autosave/
Other
8 stars 31 forks source link

Fix segmentation fault when trying to save invalid long strings #60

Open simon-ess opened 6 months ago

simon-ess commented 6 months ago

This can occur if you have something like the following:

record(waveform, "foo") {
  field(FTVL, "CHAR")
  field(NELM, "10")
  info(autosaveFields, "VAL VAL$")
}

The VAL$ field will cause a segmentation fault when it tries to save it to disk. The reason this seems to happen is that on one hand, VAL$ is regarded by autosave as a valid field (it is a field, but with a $ at the end). On the other hand, when connecting a monitor, the connection fails as the VAL field is not of the correcct type as defined in dbChannelCreate from EPICS base.

This means that autosave will try to save the date from an unconnected array, with uninitialised pArray, causing a segmentation fault.

Fixes #59

anjohnson commented 6 months ago

I'd recommend testing this change against the lsi & lso (long string in/out) record types too, they provide access to the VAL field slightly differently than a waveform record although I doubt the code would need to be any different for them. Using these types instead of a CHAR waveform makes the database designer's intention clearer when they're available (since Base 3.15).