| File: | src/SetHints.c |
| Location: | line 223, column 14 |
| Description: | String copy function overflows destination buffer |
| 1 | ||||||
| 2 | /*********************************************************** | |||||
| 3 | ||||||
| 4 | Copyright 1987, 1998 The Open Group | |||||
| 5 | ||||||
| 6 | Permission to use, copy, modify, distribute, and sell this software and its | |||||
| 7 | documentation for any purpose is hereby granted without fee, provided that | |||||
| 8 | the above copyright notice appear in all copies and that both that | |||||
| 9 | copyright notice and this permission notice appear in supporting | |||||
| 10 | documentation. | |||||
| 11 | ||||||
| 12 | The above copyright notice and this permission notice shall be included in | |||||
| 13 | all copies or substantial portions of the Software. | |||||
| 14 | ||||||
| 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| 18 | OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | |||||
| 19 | AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |||||
| 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||||
| 21 | ||||||
| 22 | Except as contained in this notice, the name of The Open Group shall not be | |||||
| 23 | used in advertising or otherwise to promote the sale, use or other dealings | |||||
| 24 | in this Software without prior written authorization from The Open Group. | |||||
| 25 | ||||||
| 26 | ||||||
| 27 | Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. | |||||
| 28 | ||||||
| 29 | All Rights Reserved | |||||
| 30 | ||||||
| 31 | Permission to use, copy, modify, and distribute this software and its | |||||
| 32 | documentation for any purpose and without fee is hereby granted, | |||||
| 33 | provided that the above copyright notice appear in all copies and that | |||||
| 34 | both that copyright notice and this permission notice appear in | |||||
| 35 | supporting documentation, and that the name of Digital not be | |||||
| 36 | used in advertising or publicity pertaining to distribution of the | |||||
| 37 | software without specific, written prior permission. | |||||
| 38 | ||||||
| 39 | DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING | |||||
| 40 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL | |||||
| 41 | DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR | |||||
| 42 | ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | |||||
| 43 | WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | |||||
| 44 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | |||||
| 45 | SOFTWARE. | |||||
| 46 | ||||||
| 47 | ******************************************************************/ | |||||
| 48 | ||||||
| 49 | #ifdef HAVE_CONFIG_H1 | |||||
| 50 | #include <config.h> | |||||
| 51 | #endif | |||||
| 52 | #include <X11/Xlibint.h> | |||||
| 53 | #include <X11/Xutil.h> | |||||
| 54 | #include "Xatomtype.h" | |||||
| 55 | #include <X11/Xatom.h> | |||||
| 56 | #include <X11/Xos.h> | |||||
| 57 | ||||||
| 58 | #define safestrlen(s)((s) ? strlen(s) : 0) ((s) ? strlen(s) : 0) | |||||
| 59 | ||||||
| 60 | int | |||||
| 61 | XSetSizeHints( /* old routine */ | |||||
| 62 | Display *dpy, | |||||
| 63 | Window w, | |||||
| 64 | XSizeHints *hints, | |||||
| 65 | Atom property) | |||||
| 66 | { | |||||
| 67 | xPropSizeHints prop; | |||||
| 68 | memset(&prop, 0, sizeof(prop))__builtin___memset_chk (&prop, 0, sizeof(prop), __builtin_object_size (&prop, 0)); | |||||
| 69 | prop.flags = (hints->flags & (USPosition(1L << 0)|USSize(1L << 1)|PAllHints((1L << 2)|(1L << 3)|(1L << 4)|(1L << 5)|(1L << 6)|(1L << 7)))); | |||||
| 70 | if (hints->flags & (USPosition(1L << 0)|PPosition(1L << 2))) { | |||||
| 71 | prop.x = hints->x; | |||||
| 72 | prop.y = hints->y; | |||||
| 73 | } | |||||
| 74 | if (hints->flags & (USSize(1L << 1)|PSize(1L << 3))) { | |||||
| 75 | prop.width = hints->width; | |||||
| 76 | prop.height = hints->height; | |||||
| 77 | } | |||||
| 78 | if (hints->flags & PMinSize(1L << 4)) { | |||||
| 79 | prop.minWidth = hints->min_width; | |||||
| 80 | prop.minHeight = hints->min_height; | |||||
| 81 | } | |||||
| 82 | if (hints->flags & PMaxSize(1L << 5)) { | |||||
| 83 | prop.maxWidth = hints->max_width; | |||||
| 84 | prop.maxHeight = hints->max_height; | |||||
| 85 | } | |||||
| 86 | if (hints->flags & PResizeInc(1L << 6)) { | |||||
| 87 | prop.widthInc = hints->width_inc; | |||||
| 88 | prop.heightInc = hints->height_inc; | |||||
| 89 | } | |||||
| 90 | if (hints->flags & PAspect(1L << 7)) { | |||||
| 91 | prop.minAspectX = hints->min_aspect.x; | |||||
| 92 | prop.minAspectY = hints->min_aspect.y; | |||||
| 93 | prop.maxAspectX = hints->max_aspect.x; | |||||
| 94 | prop.maxAspectY = hints->max_aspect.y; | |||||
| 95 | } | |||||
| 96 | return XChangeProperty (dpy, w, property, XA_WM_SIZE_HINTS((Atom) 41), 32, | |||||
| 97 | PropModeReplace0, (unsigned char *) &prop, | |||||
| 98 | OldNumPropSizeElements15); | |||||
| 99 | } | |||||
| 100 | ||||||
| 101 | /* | |||||
| 102 | * XSetWMHints sets the property | |||||
| 103 | * WM_HINTS type: WM_HINTS format:32 | |||||
| 104 | */ | |||||
| 105 | ||||||
| 106 | int | |||||
| 107 | XSetWMHints ( | |||||
| 108 | Display *dpy, | |||||
| 109 | Window w, | |||||
| 110 | XWMHints *wmhints) | |||||
| 111 | { | |||||
| 112 | xPropWMHints prop; | |||||
| 113 | memset(&prop, 0, sizeof(prop))__builtin___memset_chk (&prop, 0, sizeof(prop), __builtin_object_size (&prop, 0)); | |||||
| 114 | prop.flags = wmhints->flags; | |||||
| 115 | if (wmhints->flags & InputHint(1L << 0)) | |||||
| 116 | prop.input = (wmhints->input == True1 ? 1 : 0); | |||||
| 117 | if (wmhints->flags & StateHint(1L << 1)) | |||||
| 118 | prop.initialState = wmhints->initial_state; | |||||
| 119 | if (wmhints->flags & IconPixmapHint(1L << 2)) | |||||
| 120 | prop.iconPixmap = wmhints->icon_pixmap; | |||||
| 121 | if (wmhints->flags & IconWindowHint(1L << 3)) | |||||
| 122 | prop.iconWindow = wmhints->icon_window; | |||||
| 123 | if (wmhints->flags & IconPositionHint(1L << 4)) { | |||||
| 124 | prop.iconX = wmhints->icon_x; | |||||
| 125 | prop.iconY = wmhints->icon_y; | |||||
| 126 | } | |||||
| 127 | if (wmhints->flags & IconMaskHint(1L << 5)) | |||||
| 128 | prop.iconMask = wmhints->icon_mask; | |||||
| 129 | if (wmhints->flags & WindowGroupHint(1L << 6)) | |||||
| 130 | prop.windowGroup = wmhints->window_group; | |||||
| 131 | return XChangeProperty (dpy, w, XA_WM_HINTS((Atom) 35), XA_WM_HINTS((Atom) 35), 32, | |||||
| 132 | PropModeReplace0, (unsigned char *) &prop, | |||||
| 133 | NumPropWMHintsElements9); | |||||
| 134 | } | |||||
| 135 | ||||||
| 136 | ||||||
| 137 | ||||||
| 138 | /* | |||||
| 139 | * XSetZoomHints sets the property | |||||
| 140 | * WM_ZOOM_HINTS type: WM_SIZE_HINTS format: 32 | |||||
| 141 | */ | |||||
| 142 | ||||||
| 143 | int | |||||
| 144 | XSetZoomHints ( | |||||
| 145 | Display *dpy, | |||||
| 146 | Window w, | |||||
| 147 | XSizeHints *zhints) | |||||
| 148 | { | |||||
| 149 | return XSetSizeHints (dpy, w, zhints, XA_WM_ZOOM_HINTS((Atom) 42)); | |||||
| 150 | } | |||||
| 151 | ||||||
| 152 | ||||||
| 153 | /* | |||||
| 154 | * XSetNormalHints sets the property | |||||
| 155 | * WM_NORMAL_HINTS type: WM_SIZE_HINTS format: 32 | |||||
| 156 | */ | |||||
| 157 | ||||||
| 158 | int | |||||
| 159 | XSetNormalHints ( /* old routine */ | |||||
| 160 | Display *dpy, | |||||
| 161 | Window w, | |||||
| 162 | XSizeHints *hints) | |||||
| 163 | { | |||||
| 164 | return XSetSizeHints (dpy, w, hints, XA_WM_NORMAL_HINTS((Atom) 40)); | |||||
| 165 | } | |||||
| 166 | ||||||
| 167 | ||||||
| 168 | ||||||
| 169 | /* | |||||
| 170 | * Note, the following is one of the few cases were we really do want sizeof | |||||
| 171 | * when examining a protocol structure. This is because the XChangeProperty | |||||
| 172 | * routine will take care of converting to host to network data structures. | |||||
| 173 | */ | |||||
| 174 | ||||||
| 175 | int | |||||
| 176 | XSetIconSizes ( | |||||
| 177 | Display *dpy, | |||||
| 178 | Window w, /* typically, root */ | |||||
| 179 | XIconSize *list, | |||||
| 180 | int count) /* number of items on the list */ | |||||
| 181 | { | |||||
| 182 | register int i; | |||||
| 183 | xPropIconSize *pp, *prop; | |||||
| 184 | #define size_of_the_real_thing sizeof /* avoid grepping screwups */ | |||||
| 185 | unsigned nbytes = count * size_of_the_real_thing(xPropIconSize); | |||||
| 186 | #undef size_of_the_real_thing | |||||
| 187 | if ((prop = pp = Xmalloc (nbytes)malloc(((nbytes) == 0 ? 1 : (nbytes))))) { | |||||
| 188 | for (i = 0; i < count; i++) { | |||||
| 189 | pp->minWidth = list->min_width; | |||||
| 190 | pp->minHeight = list->min_height; | |||||
| 191 | pp->maxWidth = list->max_width; | |||||
| 192 | pp->maxHeight = list->max_height; | |||||
| 193 | pp->widthInc = list->width_inc; | |||||
| 194 | pp->heightInc = list->height_inc; | |||||
| 195 | pp += 1; | |||||
| 196 | list += 1; | |||||
| 197 | } | |||||
| 198 | XChangeProperty (dpy, w, XA_WM_ICON_SIZE((Atom) 38), XA_WM_ICON_SIZE((Atom) 38), 32, | |||||
| 199 | PropModeReplace0, (unsigned char *) prop, | |||||
| 200 | count * NumPropIconSizeElements6); | |||||
| 201 | Xfree (prop)free((prop)); | |||||
| 202 | } | |||||
| 203 | return 1; | |||||
| 204 | } | |||||
| 205 | ||||||
| 206 | int | |||||
| 207 | XSetCommand ( | |||||
| 208 | Display *dpy, | |||||
| 209 | Window w, | |||||
| 210 | char **argv, | |||||
| 211 | int argc) | |||||
| 212 | { | |||||
| 213 | register int i; | |||||
| 214 | register int nbytes; | |||||
| 215 | register char *buf, *bp; | |||||
| 216 | for (i = 0, nbytes = 0; i < argc; i++) { | |||||
| 217 | nbytes += safestrlen(argv[i])((argv[i]) ? strlen(argv[i]) : 0) + 1; | |||||
| 218 | } | |||||
| 219 | if ((bp = buf = Xmalloc(nbytes)malloc(((nbytes) == 0 ? 1 : (nbytes))))) { | |||||
| 220 | /* copy arguments into single buffer */ | |||||
| 221 | for (i = 0; i < argc; i++) { | |||||
| 222 | if (argv[i]) { | |||||
| 223 | (void) strcpy(bp, argv[i])__builtin___strcpy_chk (bp, argv[i], __builtin_object_size (bp , 2 > 1 ? 1 : 0)); | |||||
| ||||||
| 224 | bp += strlen(argv[i]) + 1; | |||||
| 225 | } | |||||
| 226 | else | |||||
| 227 | *bp++ = '\0'; | |||||
| 228 | } | |||||
| 229 | XChangeProperty (dpy, w, XA_WM_COMMAND((Atom) 34), XA_STRING((Atom) 31), 8, | |||||
| 230 | PropModeReplace0, (unsigned char *)buf, nbytes); | |||||
| 231 | Xfree(buf)free((buf)); | |||||
| 232 | } | |||||
| 233 | return 1; | |||||
| 234 | } | |||||
| 235 | /* | |||||
| 236 | * XSetStandardProperties sets the following properties: | |||||
| 237 | * WM_NAME type: STRING format: 8 | |||||
| 238 | * WM_ICON_NAME type: STRING format: 8 | |||||
| 239 | * WM_HINTS type: WM_HINTS format: 32 | |||||
| 240 | * WM_COMMAND type: STRING | |||||
| 241 | * WM_NORMAL_HINTS type: WM_SIZE_HINTS format: 32 | |||||
| 242 | */ | |||||
| 243 | ||||||
| 244 | int | |||||
| 245 | XSetStandardProperties ( | |||||
| 246 | Display *dpy, | |||||
| 247 | Window w, /* window to decorate */ | |||||
| 248 | _Xconstconst char *name, /* name of application */ | |||||
| 249 | _Xconstconst char *icon_string,/* name string for icon */ | |||||
| 250 | Pixmap icon_pixmap, /* pixmap to use as icon, or None */ | |||||
| 251 | char **argv, /* command to be used to restart application */ | |||||
| 252 | int argc, /* count of arguments */ | |||||
| 253 | XSizeHints *hints) /* size hints for window in its normal state */ | |||||
| 254 | { | |||||
| 255 | XWMHints phints; | |||||
| 256 | phints.flags = 0; | |||||
| 257 | ||||||
| 258 | if (name != NULL((void*)0)) XStoreName (dpy, w, name); | |||||
| ||||||
| 259 | ||||||
| 260 | if (icon_string != NULL((void*)0)) { | |||||
| 261 | XChangeProperty (dpy, w, XA_WM_ICON_NAME((Atom) 37), XA_STRING((Atom) 31), 8, | |||||
| 262 | PropModeReplace0, | |||||
| 263 | (_Xconstconst unsigned char *)icon_string, | |||||
| 264 | safestrlen(icon_string)((icon_string) ? strlen(icon_string) : 0)); | |||||
| 265 | } | |||||
| 266 | ||||||
| 267 | if (icon_pixmap != None0L) { | |||||
| 268 | phints.icon_pixmap = icon_pixmap; | |||||
| 269 | phints.flags |= IconPixmapHint(1L << 2); | |||||
| 270 | } | |||||
| 271 | if (argv != NULL((void*)0)) XSetCommand(dpy, w, argv, argc); | |||||
| 272 | ||||||
| 273 | if (hints != NULL((void*)0)) XSetNormalHints(dpy, w, hints); | |||||
| 274 | ||||||
| 275 | if (phints.flags != 0) XSetWMHints(dpy, w, &phints); | |||||
| 276 | ||||||
| 277 | return 1; | |||||
| 278 | } | |||||
| 279 | ||||||
| 280 | int | |||||
| 281 | XSetTransientForHint( | |||||
| 282 | Display *dpy, | |||||
| 283 | Window w, | |||||
| 284 | Window propWindow) | |||||
| 285 | { | |||||
| 286 | return XChangeProperty(dpy, w, XA_WM_TRANSIENT_FOR((Atom) 68), XA_WINDOW((Atom) 33), 32, | |||||
| 287 | PropModeReplace0, (unsigned char *) &propWindow, 1); | |||||
| 288 | } | |||||
| 289 | ||||||
| 290 | int | |||||
| 291 | XSetClassHint( | |||||
| 292 | Display *dpy, | |||||
| 293 | Window w, | |||||
| 294 | XClassHint *classhint) | |||||
| 295 | { | |||||
| 296 | char *class_string; | |||||
| 297 | char *s; | |||||
| 298 | int len_nm, len_cl; | |||||
| 299 | ||||||
| 300 | len_nm = safestrlen(classhint->res_name)((classhint->res_name) ? strlen(classhint->res_name) : 0 ); | |||||
| 301 | len_cl = safestrlen(classhint->res_class)((classhint->res_class) ? strlen(classhint->res_class) : 0); | |||||
| 302 | if ((class_string = s = Xmalloc(len_nm + len_cl + 2)malloc(((len_nm + len_cl + 2) == 0 ? 1 : (len_nm + len_cl + 2 ))))) { | |||||
| 303 | if (len_nm) { | |||||
| 304 | strcpy(s, classhint->res_name)__builtin___strcpy_chk (s, classhint->res_name, __builtin_object_size (s, 2 > 1 ? 1 : 0)); | |||||
| 305 | s += len_nm + 1; | |||||
| 306 | } | |||||
| 307 | else | |||||
| 308 | *s++ = '\0'; | |||||
| 309 | if (len_cl) | |||||
| 310 | strcpy(s, classhint->res_class)__builtin___strcpy_chk (s, classhint->res_class, __builtin_object_size (s, 2 > 1 ? 1 : 0)); | |||||
| 311 | else | |||||
| 312 | *s = '\0'; | |||||
| 313 | XChangeProperty(dpy, w, XA_WM_CLASS((Atom) 67), XA_STRING((Atom) 31), 8, | |||||
| 314 | PropModeReplace0, (unsigned char *) class_string, | |||||
| 315 | len_nm+len_cl+2); | |||||
| 316 | Xfree(class_string)free((class_string)); | |||||
| 317 | } | |||||
| 318 | return 1; | |||||
| 319 | } |