diff options
author | marha <marha@users.sourceforge.net> | 2013-11-14 08:33:57 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2013-11-14 08:33:57 +0100 |
commit | cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b (patch) | |
tree | 91ed73daada51bddd5652fd847f30b3593ecff04 /xorg-server/Xext/shm.c | |
parent | 6d8fefe38077f4d532c256e79cfcaf2a46c5269d (diff) | |
parent | 8fbb807d1029b012d2f45cb0f3ea0c6a6ebded6d (diff) | |
download | vcxsrv-cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b.tar.gz vcxsrv-cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b.tar.bz2 vcxsrv-cb9ef04f0bb4cc87787a113f61fcfa7c4818b29b.zip |
Merge remote-tracking branch 'origin/released'
* origin/released:
mesa xserver pixman git update 9 nov 2013
Conflicts:
mesalib/src/mesa/drivers/dri/common/dri_util.c
xorg-server/Xext/shm.c
Diffstat (limited to 'xorg-server/Xext/shm.c')
-rw-r--r-- | xorg-server/Xext/shm.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/xorg-server/Xext/shm.c b/xorg-server/Xext/shm.c index 0bf27f4c6..c9d39b22e 100644 --- a/xorg-server/Xext/shm.c +++ b/xorg-server/Xext/shm.c @@ -401,7 +401,7 @@ ProcShmAttach(ClientPtr client) return BadValue; } for (shmdesc = Shmsegs; shmdesc; shmdesc = shmdesc->next) { - if (!shmdesc->is_fd && shmdesc->shmid == stuff->shmid) + if (!SHMDESC_IS_FD(shmdesc) && shmdesc->shmid == stuff->shmid) break; } if (shmdesc) { @@ -413,7 +413,9 @@ ProcShmAttach(ClientPtr client) shmdesc = malloc(sizeof(ShmDescRec)); if (!shmdesc) return BadAlloc; +#ifdef SHM_FD_PASSING shmdesc->is_fd = FALSE; +#endif shmdesc->addr = shmat(stuff->shmid, 0, stuff->readOnly ? SHM_RDONLY : 0); if ((shmdesc->addr == ((char *) -1)) || SHMSTAT(stuff->shmid, &buf)) { @@ -453,9 +455,13 @@ ShmDetachSegment(pointer value, /* must conform to DeleteType */ if (--shmdesc->refcnt) return TRUE; #ifndef _MSC_VER - if (shmdesc->is_fd) +#if SHM_FD_PASSING + if (shmdesc->is_fd) { + if (shmdesc->busfault) + busfault_unregister(shmdesc->busfault); munmap(shmdesc->addr, shmdesc->size); - else + } else +#endif shmdt(shmdesc->addr); #endif for (prev = &Shmsegs; *prev != shmdesc; prev = &(*prev)->next); @@ -1113,6 +1119,20 @@ ProcShmCreatePixmap(ClientPtr client) return BadAlloc; } +#ifdef SHM_FD_PASSING + +static void +ShmBusfaultNotify(void *context) +{ + ShmDescPtr shmdesc = context; + + ErrorF("shared memory 0x%x truncated by client\n", + (unsigned int) shmdesc->resource); + busfault_unregister(shmdesc->busfault); + shmdesc->busfault = NULL; + FreeResource (shmdesc->resource, RT_NONE); +} + static int ProcShmAttachFd(ClientPtr client) { @@ -1157,6 +1177,15 @@ ProcShmAttachFd(ClientPtr client) shmdesc->refcnt = 1; shmdesc->writable = !stuff->readOnly; shmdesc->size = statb.st_size; + shmdesc->resource = stuff->shmseg; + + shmdesc->busfault = busfault_register_mmap(shmdesc->addr, shmdesc->size, ShmBusfaultNotify, shmdesc); + if (!shmdesc->busfault) { + munmap(shmdesc->addr, shmdesc->size); + free(shmdesc); + return BadAlloc; + } + shmdesc->next = Shmsegs; Shmsegs = shmdesc; @@ -1212,6 +1241,15 @@ ProcShmCreateSegment(ClientPtr client) shmdesc->refcnt = 1; shmdesc->writable = !stuff->readOnly; shmdesc->size = stuff->size; + + shmdesc->busfault = busfault_register_mmap(shmdesc->addr, shmdesc->size, ShmBusfaultNotify, shmdesc); + if (!shmdesc->busfault) { + close(fd); + munmap(shmdesc->addr, shmdesc->size); + free(shmdesc); + return BadAlloc; + } + shmdesc->next = Shmsegs; Shmsegs = shmdesc; @@ -1228,6 +1266,7 @@ ProcShmCreateSegment(ClientPtr client) WriteToClient(client, sizeof (xShmCreateSegmentReply), &rep); return Success; } +#endif /* SHM_FD_PASSING */ static int ProcShmDispatch(ClientPtr client) @@ -1258,10 +1297,12 @@ ProcShmDispatch(ClientPtr client) return ProcPanoramiXShmCreatePixmap(client); #endif return ProcShmCreatePixmap(client); +#ifdef SHM_FD_PASSING case X_ShmAttachFd: return ProcShmAttachFd(client); case X_ShmCreateSegment: return ProcShmCreateSegment(client); +#endif default: return BadRequest; } @@ -1362,6 +1403,7 @@ SProcShmCreatePixmap(ClientPtr client) return ProcShmCreatePixmap(client); } +#ifdef SHM_FD_PASSING static int SProcShmAttachFd(ClientPtr client) { @@ -1383,6 +1425,7 @@ SProcShmCreateSegment(ClientPtr client) swapl(&stuff->size); return ProcShmCreateSegment(client); } +#endif /* SHM_FD_PASSING */ static int SProcShmDispatch(ClientPtr client) @@ -1401,10 +1444,12 @@ SProcShmDispatch(ClientPtr client) return SProcShmGetImage(client); case X_ShmCreatePixmap: return SProcShmCreatePixmap(client); +#ifdef SHM_FD_PASSING case X_ShmAttachFd: return SProcShmAttachFd(client); case X_ShmCreateSegment: return SProcShmCreateSegment(client); +#endif default: return BadRequest; } |