diff options
author | brianp <brianp> | 2004-04-26 15:05:13 +0000 |
---|---|---|
committer | brianp <brianp> | 2004-04-26 15:05:13 +0000 |
commit | b42adba4a86097ff70b190ba4d58b7de9e38e087 (patch) | |
tree | 9ecd5e18f9269be44c759a9e53b267d86ff04dc3 | |
parent | c53d590294ef8bd6cb5c2c4c0f45717cd41a1a5e (diff) |
fixe memleak in drmMapBufs (Tilman Sauerbeck)
-rw-r--r-- | xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c index 00d94e108..36a583ef6 100644 --- a/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c +++ b/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c @@ -1138,7 +1138,8 @@ drmBufMapPtr drmMapBufs(int fd) bufs.virtual = NULL; if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL; - if (bufs.count) { + if (!bufs.count) return NULL; + if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list)))) return NULL; @@ -1157,9 +1158,10 @@ drmBufMapPtr drmMapBufs(int fd) retval->list[i].used = 0; retval->list[i].address = bufs.list[i].address; } + + drmFree(bufs.list); + return retval; - } - return NULL; } @@ -1169,7 +1171,8 @@ drmBufMapPtr drmMapBufs(int fd) * \return zero on success, or negative value on failure. * * \internal - * Calls munmap() for every buffer stored in \p bufs. + * Calls munmap() for every buffer stored in \p bufs and frees the + * memory allocated by drmMapBufs(). */ int drmUnmapBufs(drmBufMapPtr bufs) { @@ -1178,6 +1181,10 @@ int drmUnmapBufs(drmBufMapPtr bufs) for (i = 0; i < bufs->count; i++) { munmap(bufs->list[i].address, bufs->list[i].total); } + + drmFree(bufs->list); + drmFree(bufs); + return 0; } |