static bool g_lock_parse(uint8_t *buf, size_t buflen, struct g_lock *lck)
{
struct server_id exclusive;
- size_t num_shared, shared_len;
+ size_t num_shared, shared_len, data_len;
uint64_t unique_lock_epoch;
uint64_t unique_data_epoch;
}
shared_len = num_shared * SERVER_ID_BUF_LENGTH;
+ data_len = buflen - shared_len;
*lck = (struct g_lock) {
.exclusive = exclusive,
.num_shared = num_shared,
- .shared = buf,
+ .shared = num_shared == 0 ? NULL : buf,
.unique_lock_epoch = unique_lock_epoch,
.unique_data_epoch = unique_data_epoch,
- .datalen = buflen-shared_len,
- .data = buf+shared_len,
+ .datalen = data_len,
+ .data = data_len == 0 ? NULL : buf + shared_len,
};
return true;