summaryrefslogtreecommitdiff
path: root/shmexport.c
diff options
context:
space:
mode:
authorZbigniew Chyla <zbigniew.chyla@nokia.com>2015-04-24 17:55:00 +0200
committerEric S. Raymond <esr@thyrsus.com>2015-04-28 08:29:18 -0400
commit2b7e3753ecbba3ada2572a2a7038b11cfd1f0bd3 (patch)
tree7e487d0c72174c58a79af283b6d919047f999a37 /shmexport.c
parent4f5c06746aef13298b5609558001beda0326da39 (diff)
downloadgpsd-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.c6
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) {