Bug Summary

File:buttonmap.c
Location:line 80, column 9
Description:Potential leak of memory pointed to by 'map'

Annotated Source Code

1/*
2 * Copyright 1996 by Frederic Lepied, France. <Frederic.Lepied@sugix.frmug.org>
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of the authors not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. The authors make no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
13 *
14 * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 *
22 */
23
24#include "xinput.h"
25
26
27int
28get_button_map(Display *display,
29 int argc,
30 char *argv[],
31 char *name,
32 char *desc)
33{
34 XDeviceInfo *info;
35 XDevice *device;
36 XAnyClassPtr ip;
37 int i;
38 int nbuttons;
39
40 if (argc != 1) {
1
Assuming 'argc' is equal to 1
2
Taking false branch
41 fprintf(stderr__stderrp, "usage: xinput %s %s\n", name, desc);
42 return EXIT_FAILURE1;
43 }
44
45 info = find_device_info(display, argv[0], False0);
46
47 if (!info) {
3
Assuming 'info' is non-null
4
Taking false branch
48 fprintf(stderr__stderrp, "unable to find device '%s'\n", argv[0]);
49 return EXIT_FAILURE1;
50 }
51
52 ip = (XAnyClassPtr) info->inputclassinfo;
53 nbuttons = 0;
54
55 /* try to find the number of buttons */
56 for(i=0; i<info->num_classes; i++) {
5
Loop condition is true. Entering loop body
57 if (ip->class == ButtonClass1) {
6
Taking true branch
58 nbuttons = ((XButtonInfoPtr)ip)->num_buttons;
59 break;
7
Execution continues on line 63
60 }
61 ip = (XAnyClassPtr) ((char *) ip + ip->length);
62 }
63 if (nbuttons == 0) {
8
Assuming 'nbuttons' is not equal to 0
9
Taking false branch
64 fprintf(stderr__stderrp, "device has no buttons\n");
65 return EXIT_FAILURE1;
66 }
67
68 device = XOpenDevice(display, info->id);
69 if (device) {
10
Assuming 'device' is non-null
11
Taking true branch
70 int idx;
71 unsigned char *map;
72
73 map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons);
12
Memory is allocated
74
75 XGetDeviceButtonMapping(display, device, map, nbuttons);
76
77 for(idx=1; idx < nbuttons + 1; idx++) {
13
Loop condition is false. Execution continues on line 80
78 printf("%d ", map[idx - 1]);
79 }
80 printf("\n");
14
Potential leak of memory pointed to by 'map'
81 XCloseDevice(display, device);
82 return EXIT_SUCCESS0;
83 } else {
84 fprintf(stderr__stderrp, "Unable to open device\n");
85 return EXIT_FAILURE1;
86 }
87}
88
89
90
91int
92set_button_map(Display *display,
93 int argc,
94 char *argv[],
95 char *name,
96 char *desc)
97{
98 XDeviceInfo *info;
99 XDevice *device;
100 XAnyClassPtr ip;
101 int i;
102 int nbuttons;
103
104 if (argc < 2) {
105 fprintf(stderr__stderrp, "usage: xinput %s %s\n", name, desc);
106 return EXIT_FAILURE1;
107 }
108
109 info = find_device_info(display, argv[0], False0);
110
111 if (!info) {
112 fprintf(stderr__stderrp, "unable to find device '%s'\n", argv[0]);
113 return EXIT_FAILURE1;
114 }
115
116 ip = (XAnyClassPtr) info->inputclassinfo;
117 nbuttons = 0;
118
119 /* try to find the number of buttons */
120 for(i=0; i<info->num_classes; i++) {
121 if (ip->class == ButtonClass1) {
122 nbuttons = ((XButtonInfoPtr)ip)->num_buttons;
123 break;
124 }
125 ip = (XAnyClassPtr) ((char *) ip + ip->length);
126 }
127 if (nbuttons == 0) {
128 fprintf(stderr__stderrp, "device has no buttons\n");
129 return EXIT_FAILURE1;
130 }
131
132 device = XOpenDevice(display, info->id);
133 if (device) {
134 int idx;
135 unsigned char *map;
136 int min;
137
138 map = (unsigned char *) malloc(sizeof(unsigned char) * nbuttons);
139
140 XGetDeviceButtonMapping(display, device, map, nbuttons);
141
142 min = (argc > nbuttons + 1) ? nbuttons + 1 : argc;
143
144 for(idx=1; idx < min; idx++) {
145 map[idx - 1] = atoi(argv[idx]);
146 }
147 XSetDeviceButtonMapping(display, device, map, nbuttons);
148 XCloseDevice(display, device);
149 return EXIT_SUCCESS0;
150 } else {
151 fprintf(stderr__stderrp, "Unable to open device\n");
152 return EXIT_FAILURE1;
153 }
154}
155
156/* end of buttonmap.c */