diff options
author | Alan Curry <pacman@TheWorld.com> | 2006-03-27 04:17:30 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-27 11:44:56 -0500 |
commit | db77ec270d00098ff4fbf15f62f4506f6efb25d2 (patch) | |
tree | c4d49f61e120624d435b80b9ee7448eb6f064046 | |
parent | 59153f7d7effdb5b3c81eb6d03914a866157b319 (diff) |
[PATCH] framebuffer: cmap-setting return values
A set of 3 small bugfixes, all of which are related to bogus return values
of fb colormap-setting functions.
First, fb_alloc_cmap returns -1 if memory allocation fails. This is a hard
condition to reproduce since you'd have to be really low on memory, but from
studying the contexts in which it is called, I think this function should be
returning a negative errno, and the -1 will be seen as an EPERM. Switching it
to -ENOMEM makes sense.
Second, the store_cmap function which is called for writes to
/sys/class/graphics/fb0/color_map returns 0 for success, but it should be
returning the count of bytes written since its return value ends up in
userspace as the result of the write() syscall.
Third, radeonfb returns 1 instead of a negative errno when FBIOPUTCMAP is
called with an oversized colormap. This is seen in userspace as a return
value of 1 from the ioctl() syscall with errno left unchanged. A more
useful return value would be -EINVAL.
Signed-off-by: Alan Curry <pacman@TheWorld.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/video/aty/radeon_base.c | 6 | ||||
-rw-r--r-- | drivers/video/fbcmap.c | 4 | ||||
-rw-r--r-- | drivers/video/fbsysfs.c | 4 |
3 files changed, 7 insertions, 7 deletions
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c index c9f0c5a07e6e..9a6b5b39b88e 100644 --- a/drivers/video/aty/radeon_base.c +++ b/drivers/video/aty/radeon_base.c | |||
@@ -1067,7 +1067,7 @@ static int radeon_setcolreg (unsigned regno, unsigned red, unsigned green, | |||
1067 | 1067 | ||
1068 | 1068 | ||
1069 | if (regno > 255) | 1069 | if (regno > 255) |
1070 | return 1; | 1070 | return -EINVAL; |
1071 | 1071 | ||
1072 | red >>= 8; | 1072 | red >>= 8; |
1073 | green >>= 8; | 1073 | green >>= 8; |
@@ -1086,9 +1086,9 @@ static int radeon_setcolreg (unsigned regno, unsigned red, unsigned green, | |||
1086 | pindex = regno * 8; | 1086 | pindex = regno * 8; |
1087 | 1087 | ||
1088 | if (rinfo->depth == 16 && regno > 63) | 1088 | if (rinfo->depth == 16 && regno > 63) |
1089 | return 1; | 1089 | return -EINVAL; |
1090 | if (rinfo->depth == 15 && regno > 31) | 1090 | if (rinfo->depth == 15 && regno > 31) |
1091 | return 1; | 1091 | return -EINVAL; |
1092 | 1092 | ||
1093 | /* For 565, the green component is mixed one order | 1093 | /* For 565, the green component is mixed one order |
1094 | * below | 1094 | * below |
diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c index c32a2a50bfa2..1f98392a43b3 100644 --- a/drivers/video/fbcmap.c +++ b/drivers/video/fbcmap.c | |||
@@ -85,7 +85,7 @@ static struct fb_cmap default_16_colors = { | |||
85 | * Allocates memory for a colormap @cmap. @len is the | 85 | * Allocates memory for a colormap @cmap. @len is the |
86 | * number of entries in the palette. | 86 | * number of entries in the palette. |
87 | * | 87 | * |
88 | * Returns -1 errno on error, or zero on success. | 88 | * Returns negative errno on error, or zero on success. |
89 | * | 89 | * |
90 | */ | 90 | */ |
91 | 91 | ||
@@ -116,7 +116,7 @@ int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp) | |||
116 | 116 | ||
117 | fail: | 117 | fail: |
118 | fb_dealloc_cmap(cmap); | 118 | fb_dealloc_cmap(cmap); |
119 | return -1; | 119 | return -ENOMEM; |
120 | } | 120 | } |
121 | 121 | ||
122 | /** | 122 | /** |
diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c index 6d26057337e2..b72b05250a9d 100644 --- a/drivers/video/fbsysfs.c +++ b/drivers/video/fbsysfs.c | |||
@@ -348,7 +348,7 @@ static ssize_t store_cmap(struct class_device *class_device, const char *buf, | |||
348 | fb_copy_cmap(&umap, &fb_info->cmap); | 348 | fb_copy_cmap(&umap, &fb_info->cmap); |
349 | fb_dealloc_cmap(&umap); | 349 | fb_dealloc_cmap(&umap); |
350 | 350 | ||
351 | return rc; | 351 | return rc ?: count; |
352 | } | 352 | } |
353 | for (i = 0; i < length; i++) { | 353 | for (i = 0; i < length; i++) { |
354 | u16 red, blue, green, tsp; | 354 | u16 red, blue, green, tsp; |
@@ -367,7 +367,7 @@ static ssize_t store_cmap(struct class_device *class_device, const char *buf, | |||
367 | if (transp) | 367 | if (transp) |
368 | fb_info->cmap.transp[i] = tsp; | 368 | fb_info->cmap.transp[i] = tsp; |
369 | } | 369 | } |
370 | return 0; | 370 | return count; |
371 | } | 371 | } |
372 | 372 | ||
373 | static ssize_t show_cmap(struct class_device *class_device, char *buf) | 373 | static ssize_t show_cmap(struct class_device *class_device, char *buf) |