fix: move struct fc_slot definition to slot.h and declare accessors to fix 64-bit pointer truncation
The struct fc_slot was defined only in slot.c, making it an incomplete type in slot.h. The inline accessor functions (fc_slot_id, fc_slot_header, etc.) in slot.h could not compile because they referenced incomplete struct members. The compiler fell back to implicit int return type, truncating 64-bit pointers to 32 bits, causing SIGSEGV in registry_add() when strncpy received a truncated slot_id pointer. Fix: move the struct definition to slot.h and add proper function declarations for the accessors (definitions stay in slot.c).
This commit is contained in:
parent
902d985ca8
commit
f318e9c501
2 changed files with 17 additions and 17 deletions
|
|
@ -17,17 +17,6 @@
|
||||||
#define SEM_PREFIX "/framecache-"
|
#define SEM_PREFIX "/framecache-"
|
||||||
#define SEM_SUFFIX "-write"
|
#define SEM_SUFFIX "-write"
|
||||||
|
|
||||||
/* Internal handle used by both server (writer) and client (reader) */
|
|
||||||
struct fc_slot {
|
|
||||||
int shm_fd;
|
|
||||||
void *base;
|
|
||||||
size_t shm_size;
|
|
||||||
sem_t *sem;
|
|
||||||
char slot_id[FC_MAX_SLOT_ID];
|
|
||||||
char shm_path[128];
|
|
||||||
char sem_name[128];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ── helpers ─────────────────────────────────────────────────────────── */
|
/* ── helpers ─────────────────────────────────────────────────────────── */
|
||||||
|
|
||||||
static void build_paths(const char *slot_id,
|
static void build_paths(const char *slot_id,
|
||||||
|
|
@ -172,12 +161,6 @@ void fc_slot_write_frame(struct fc_slot *s,
|
||||||
sem_post(s->sem);
|
sem_post(s->sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Accessors used by HTTP API */
|
|
||||||
fc_header_t *fc_slot_header(struct fc_slot *s) { return (fc_header_t *)s->base; }
|
|
||||||
const char *fc_slot_id(struct fc_slot *s) { return s->slot_id; }
|
|
||||||
const char *fc_slot_shm_path(struct fc_slot *s) { return s->shm_path; }
|
|
||||||
const char *fc_slot_sem_name(struct fc_slot *s) { return s->sem_name; }
|
|
||||||
|
|
||||||
/* ── client-side open / read / close (also used by capture-manager) ── */
|
/* ── client-side open / read / close (also used by capture-manager) ── */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,17 @@
|
||||||
#define FC_FRAME_HDR_SIZE 24u /* pts_us(8) + wall_us(8) + size(4) + pad(4) */
|
#define FC_FRAME_HDR_SIZE 24u /* pts_us(8) + wall_us(8) + size(4) + pad(4) */
|
||||||
#define FC_MAX_SLOT_ID 64u
|
#define FC_MAX_SLOT_ID 64u
|
||||||
|
|
||||||
|
/* Internal handle used by both server (writer) and client (reader) */
|
||||||
|
struct fc_slot {
|
||||||
|
int shm_fd;
|
||||||
|
void *base;
|
||||||
|
size_t shm_size;
|
||||||
|
sem_t *sem;
|
||||||
|
char slot_id[FC_MAX_SLOT_ID];
|
||||||
|
char shm_path[128];
|
||||||
|
char sem_name[128];
|
||||||
|
};
|
||||||
|
|
||||||
/* Pixel format codes */
|
/* Pixel format codes */
|
||||||
#define FC_PIX_UYVY422 0u
|
#define FC_PIX_UYVY422 0u
|
||||||
|
|
||||||
|
|
@ -57,6 +68,12 @@ typedef struct {
|
||||||
_Static_assert(sizeof(fc_frame_t) == FC_FRAME_HDR_SIZE,
|
_Static_assert(sizeof(fc_frame_t) == FC_FRAME_HDR_SIZE,
|
||||||
"fc_frame_t header must be exactly FC_FRAME_HDR_SIZE bytes");
|
"fc_frame_t header must be exactly FC_FRAME_HDR_SIZE bytes");
|
||||||
|
|
||||||
|
/* Accessor function declarations (implemented in slot.c) */
|
||||||
|
fc_header_t *fc_slot_header(struct fc_slot *s);
|
||||||
|
const char *fc_slot_id(struct fc_slot *s);
|
||||||
|
const char *fc_slot_shm_path(struct fc_slot *s);
|
||||||
|
const char *fc_slot_sem_name(struct fc_slot *s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute total shm size for a slot given frame_size.
|
* Compute total shm size for a slot given frame_size.
|
||||||
* = FC_HEADER_SIZE + ring_depth * (FC_FRAME_HDR_SIZE + frame_size)
|
* = FC_HEADER_SIZE + ring_depth * (FC_FRAME_HDR_SIZE + frame_size)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue