diff options
author | Zbigniew Chyla <zbigniew.chyla@nokia.com> | 2015-04-24 17:55:00 +0200 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2015-04-28 08:29:18 -0400 |
commit | 2b7e3753ecbba3ada2572a2a7038b11cfd1f0bd3 (patch) | |
tree | 7e487d0c72174c58a79af283b6d919047f999a37 /shmexport.c | |
parent | 4f5c06746aef13298b5609558001beda0326da39 (diff) | |
download | gpsd-2b7e3753ecbba3ada2572a2a7038b11cfd1f0bd3.tar.gz |
Use correct size of segment for shared-mem export
The gpsd exports data to clients via shared-memory using
struct shmexport_t, which contains both a copy of
struct gps_data_t and additional fields. However, when
allocating shared memory via shmget(), it was passing
sizeof(struct gps_data_t) as size of the whole segment.
The bug may cause gpsd crash in case the size of gps_data_t
is equal to or slightly smaller than a multiple of PAGE_SIZE.
Diffstat (limited to 'shmexport.c')
-rw-r--r-- | shmexport.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/shmexport.c b/shmexport.c index bd118c9a..a69e6cb1 100644 --- a/shmexport.c +++ b/shmexport.c @@ -36,19 +36,19 @@ bool shm_acquire(struct gps_context_t *context) { long shmkey = getenv("GPSD_SHM_KEY") ? strtol(getenv("GPSD_SHM_KEY"), NULL, 0) : GPSD_SHM_KEY; - int shmid = shmget((key_t)shmkey, sizeof(struct gps_data_t), (int)(IPC_CREAT|0666)); + int shmid = shmget((key_t)shmkey, sizeof(struct shmexport_t), (int)(IPC_CREAT|0666)); if (shmid == -1) { gpsd_log(&context->errout, LOG_ERROR, "shmget(0x%lx, %zd, 0666) for SHM export failed: %s\n", shmkey, - sizeof(struct gps_data_t), + sizeof(struct shmexport_t), strerror(errno)); return false; } else gpsd_log(&context->errout, LOG_PROG, "shmget(0x%lx, %zd, 0666) for SHM export succeeded\n", shmkey, - sizeof(struct gps_data_t)); + sizeof(struct shmexport_t)); context->shmexport = (void *)shmat(shmid, 0, 0); if ((int)(long)context->shmexport == -1) { |