diff options
| author | Pascal Bach <pascal.bach@siemens.com> | 2016-10-14 14:26:44 +0200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-11-08 23:47:12 +0000 |
| commit | 732dd581f3e66175feccd811bc2ef9f814ee0705 (patch) | |
| tree | 78ec9ff5e03386347cee87655753f5a61f363ad1 /meta | |
| parent | 40f4a6d075236265086cc79400dea3c14720383a (diff) | |
| download | poky-732dd581f3e66175feccd811bc2ef9f814ee0705.tar.gz | |
glibc: fix CVE-2016-1234, CVE-2016-3075, CVE-2016-5417
Only relevant for krogoth since version 2.24+ (master, morty) is not affected.
(From OE-Core rev: 88be4b40bacc7c8a08fb76fc220f491deb2c1c3a)
Signed-off-by: Pascal Bach <pascal.bach@siemens.com>
Signed-off-by: Armin Kuster <akuster808@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2016-1234.patch | 427 | ||||
| -rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2016-3075.patch | 37 | ||||
| -rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2016-5417.patch | 28 | ||||
| -rw-r--r-- | meta/recipes-core/glibc/glibc_2.23.bb | 3 |
4 files changed, 495 insertions, 0 deletions
diff --git a/meta/recipes-core/glibc/glibc/CVE-2016-1234.patch b/meta/recipes-core/glibc/glibc/CVE-2016-1234.patch new file mode 100644 index 0000000000..e0d45c6943 --- /dev/null +++ b/meta/recipes-core/glibc/glibc/CVE-2016-1234.patch | |||
| @@ -0,0 +1,427 @@ | |||
| 1 | glibc-2.23: Fix CVE-2016-1234 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.redhat.com/show_bug.cgi?id=1315647 | ||
| 4 | |||
| 5 | glob: Do not copy d_name field of struct dirent | ||
| 6 | |||
| 7 | Instead, we store the data we need from the return value of | ||
| 8 | readdir in an object of the new type struct readdir_result. | ||
| 9 | This type is independent of the layout of struct dirent. | ||
| 10 | |||
| 11 | Upstream-Status: Backport | ||
| 12 | CVE: CVE-2016-1234 | ||
| 13 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 14 | Signed-off-by: Pascal Bach <pascal.bach@siemens.com> | ||
| 15 | |||
| 16 | diff --git a/posix/bug-glob2.c b/posix/bug-glob2.c | ||
| 17 | index ddf5ec9..22ea35f 100644 | ||
| 18 | --- a/posix/bug-glob2.c | ||
| 19 | +++ b/posix/bug-glob2.c | ||
| 20 | @@ -40,6 +40,17 @@ | ||
| 21 | # define PRINTF(fmt, args...) | ||
| 22 | #endif | ||
| 23 | |||
| 24 | +#define LONG_NAME \ | ||
| 25 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 26 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 27 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 28 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 29 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 30 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 31 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 32 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 33 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ | ||
| 34 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | ||
| 35 | |||
| 36 | static struct | ||
| 37 | { | ||
| 38 | @@ -58,6 +69,7 @@ static struct | ||
| 39 | { ".", 3, DT_DIR, 0755 }, | ||
| 40 | { "..", 3, DT_DIR, 0755 }, | ||
| 41 | { "a", 3, DT_REG, 0644 }, | ||
| 42 | + { LONG_NAME, 3, DT_REG, 0644 }, | ||
| 43 | { "unreadable", 2, DT_DIR, 0111 }, | ||
| 44 | { ".", 3, DT_DIR, 0111 }, | ||
| 45 | { "..", 3, DT_DIR, 0755 }, | ||
| 46 | @@ -75,7 +87,7 @@ typedef struct | ||
| 47 | int level; | ||
| 48 | int idx; | ||
| 49 | struct dirent d; | ||
| 50 | - char room_for_dirent[NAME_MAX]; | ||
| 51 | + char room_for_dirent[sizeof (LONG_NAME)]; | ||
| 52 | } my_DIR; | ||
| 53 | |||
| 54 | |||
| 55 | @@ -193,7 +205,7 @@ my_readdir (void *gdir) | ||
| 56 | return NULL; | ||
| 57 | } | ||
| 58 | |||
| 59 | - dir->d.d_ino = dir->idx; | ||
| 60 | + dir->d.d_ino = 1; /* glob should not skip this entry. */ | ||
| 61 | |||
| 62 | #ifdef _DIRENT_HAVE_D_TYPE | ||
| 63 | dir->d.d_type = filesystem[dir->idx].type; | ||
| 64 | diff --git a/posix/glob.c b/posix/glob.c | ||
| 65 | index 0c04c3c..6c6612d 100644 | ||
| 66 | --- a/posix/glob.c | ||
| 67 | +++ b/posix/glob.c | ||
| 68 | @@ -24,7 +24,9 @@ | ||
| 69 | #include <errno.h> | ||
| 70 | #include <sys/types.h> | ||
| 71 | #include <sys/stat.h> | ||
| 72 | +#include <stdbool.h> | ||
| 73 | #include <stddef.h> | ||
| 74 | +#include <stdint.h> | ||
| 75 | |||
| 76 | /* Outcomment the following line for production quality code. */ | ||
| 77 | /* #define NDEBUG 1 */ | ||
| 78 | @@ -57,10 +59,8 @@ | ||
| 79 | |||
| 80 | #if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__ | ||
| 81 | # include <dirent.h> | ||
| 82 | -# define NAMLEN(dirent) strlen((dirent)->d_name) | ||
| 83 | #else | ||
| 84 | # define dirent direct | ||
| 85 | -# define NAMLEN(dirent) (dirent)->d_namlen | ||
| 86 | # ifdef HAVE_SYS_NDIR_H | ||
| 87 | # include <sys/ndir.h> | ||
| 88 | # endif | ||
| 89 | @@ -75,82 +75,8 @@ | ||
| 90 | # endif /* HAVE_VMSDIR_H */ | ||
| 91 | #endif | ||
| 92 | |||
| 93 | - | ||
| 94 | -/* In GNU systems, <dirent.h> defines this macro for us. */ | ||
| 95 | -#ifdef _D_NAMLEN | ||
| 96 | -# undef NAMLEN | ||
| 97 | -# define NAMLEN(d) _D_NAMLEN(d) | ||
| 98 | -#endif | ||
| 99 | - | ||
| 100 | -/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available | ||
| 101 | - if the `d_type' member for `struct dirent' is available. | ||
| 102 | - HAVE_STRUCT_DIRENT_D_TYPE plays the same role in GNULIB. */ | ||
| 103 | -#if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE | ||
| 104 | -/* True if the directory entry D must be of type T. */ | ||
| 105 | -# define DIRENT_MUST_BE(d, t) ((d)->d_type == (t)) | ||
| 106 | - | ||
| 107 | -/* True if the directory entry D might be a symbolic link. */ | ||
| 108 | -# define DIRENT_MIGHT_BE_SYMLINK(d) \ | ||
| 109 | - ((d)->d_type == DT_UNKNOWN || (d)->d_type == DT_LNK) | ||
| 110 | - | ||
| 111 | -/* True if the directory entry D might be a directory. */ | ||
| 112 | -# define DIRENT_MIGHT_BE_DIR(d) \ | ||
| 113 | - ((d)->d_type == DT_DIR || DIRENT_MIGHT_BE_SYMLINK (d)) | ||
| 114 | - | ||
| 115 | -#else /* !HAVE_D_TYPE */ | ||
| 116 | -# define DIRENT_MUST_BE(d, t) false | ||
| 117 | -# define DIRENT_MIGHT_BE_SYMLINK(d) true | ||
| 118 | -# define DIRENT_MIGHT_BE_DIR(d) true | ||
| 119 | -#endif /* HAVE_D_TYPE */ | ||
| 120 | - | ||
| 121 | -/* If the system has the `struct dirent64' type we use it internally. */ | ||
| 122 | -#if defined _LIBC && !defined COMPILE_GLOB64 | ||
| 123 | -# if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__ | ||
| 124 | -# define CONVERT_D_NAMLEN(d64, d32) | ||
| 125 | -# else | ||
| 126 | -# define CONVERT_D_NAMLEN(d64, d32) \ | ||
| 127 | - (d64)->d_namlen = (d32)->d_namlen; | ||
| 128 | -# endif | ||
| 129 | - | ||
| 130 | -# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__ | ||
| 131 | -# define CONVERT_D_INO(d64, d32) | ||
| 132 | -# else | ||
| 133 | -# define CONVERT_D_INO(d64, d32) \ | ||
| 134 | - (d64)->d_ino = (d32)->d_ino; | ||
| 135 | -# endif | ||
| 136 | - | ||
| 137 | -# ifdef _DIRENT_HAVE_D_TYPE | ||
| 138 | -# define CONVERT_D_TYPE(d64, d32) \ | ||
| 139 | - (d64)->d_type = (d32)->d_type; | ||
| 140 | -# else | ||
| 141 | -# define CONVERT_D_TYPE(d64, d32) | ||
| 142 | -# endif | ||
| 143 | - | ||
| 144 | -# define CONVERT_DIRENT_DIRENT64(d64, d32) \ | ||
| 145 | - memcpy ((d64)->d_name, (d32)->d_name, NAMLEN (d32) + 1); \ | ||
| 146 | - CONVERT_D_NAMLEN (d64, d32) \ | ||
| 147 | - CONVERT_D_INO (d64, d32) \ | ||
| 148 | - CONVERT_D_TYPE (d64, d32) | ||
| 149 | -#endif | ||
| 150 | - | ||
| 151 | - | ||
| 152 | -#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__ | ||
| 153 | -/* Posix does not require that the d_ino field be present, and some | ||
| 154 | - systems do not provide it. */ | ||
| 155 | -# define REAL_DIR_ENTRY(dp) 1 | ||
| 156 | -#else | ||
| 157 | -# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) | ||
| 158 | -#endif /* POSIX */ | ||
| 159 | - | ||
| 160 | #include <stdlib.h> | ||
| 161 | #include <string.h> | ||
| 162 | - | ||
| 163 | -/* NAME_MAX is usually defined in <dirent.h> or <limits.h>. */ | ||
| 164 | -#include <limits.h> | ||
| 165 | -#ifndef NAME_MAX | ||
| 166 | -# define NAME_MAX (sizeof (((struct dirent *) 0)->d_name)) | ||
| 167 | -#endif | ||
| 168 | - | ||
| 169 | #include <alloca.h> | ||
| 170 | |||
| 171 | #ifdef _LIBC | ||
| 172 | @@ -195,8 +121,111 @@ | ||
| 173 | |||
| 174 | static const char *next_brace_sub (const char *begin, int flags) __THROWNL; | ||
| 175 | |||
| 176 | +/* A representation of a directory entry which does not depend on the | ||
| 177 | + layout of struct dirent, or the size of ino_t. */ | ||
| 178 | +struct readdir_result | ||
| 179 | +{ | ||
| 180 | + const char *name; | ||
| 181 | +# if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE | ||
| 182 | + uint8_t type; | ||
| 183 | +# endif | ||
| 184 | + bool skip_entry; | ||
| 185 | +}; | ||
| 186 | + | ||
| 187 | +# if defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE | ||
| 188 | +/* Initializer based on the d_type member of struct dirent. */ | ||
| 189 | +# define D_TYPE_TO_RESULT(source) (source)->d_type, | ||
| 190 | + | ||
| 191 | +/* True if the directory entry D might be a symbolic link. */ | ||
| 192 | +static bool | ||
| 193 | +readdir_result_might_be_symlink (struct readdir_result d) | ||
| 194 | +{ | ||
| 195 | + return d.type == DT_UNKNOWN || d.type == DT_LNK; | ||
| 196 | +} | ||
| 197 | + | ||
| 198 | +/* True if the directory entry D might be a directory. */ | ||
| 199 | +static bool | ||
| 200 | +readdir_result_might_be_dir (struct readdir_result d) | ||
| 201 | +{ | ||
| 202 | + return d.type == DT_DIR || readdir_result_might_be_symlink (d); | ||
| 203 | +} | ||
| 204 | +# else /* defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE */ | ||
| 205 | +# define D_TYPE_TO_RESULT(source) | ||
| 206 | + | ||
| 207 | +/* If we do not have type information, symbolic links and directories | ||
| 208 | + are always a possibility. */ | ||
| 209 | + | ||
| 210 | +static bool | ||
| 211 | +readdir_result_might_be_symlink (struct readdir_result d) | ||
| 212 | +{ | ||
| 213 | + return true; | ||
| 214 | +} | ||
| 215 | + | ||
| 216 | +static bool | ||
| 217 | +eaddir_result_might_be_dir (struct readdir_result d) | ||
| 218 | +{ | ||
| 219 | + return true; | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | +# endif /* defined _DIRENT_HAVE_D_TYPE || defined HAVE_STRUCT_DIRENT_D_TYPE */ | ||
| 223 | + | ||
| 224 | +# if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__ | ||
| 225 | +/* Initializer for skip_entry. POSIX does not require that the d_ino | ||
| 226 | + field be present, and some systems do not provide it. */ | ||
| 227 | +# define D_INO_TO_RESULT(source) false, | ||
| 228 | +# else | ||
| 229 | +# define D_INO_TO_RESULT(source) (source)->d_ino == 0, | ||
| 230 | +# endif | ||
| 231 | + | ||
| 232 | +/* Construct an initializer for a struct readdir_result object from a | ||
| 233 | + struct dirent *. No copy of the name is made. */ | ||
| 234 | +#define READDIR_RESULT_INITIALIZER(source) \ | ||
| 235 | + { \ | ||
| 236 | + source->d_name, \ | ||
| 237 | + D_TYPE_TO_RESULT (source) \ | ||
| 238 | + D_INO_TO_RESULT (source) \ | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | #endif /* !defined _LIBC || !defined GLOB_ONLY_P */ | ||
| 242 | |||
| 243 | +/* Call gl_readdir on STREAM. This macro can be overridden to reduce | ||
| 244 | + type safety if an old interface version needs to be supported. */ | ||
| 245 | +#ifndef GL_READDIR | ||
| 246 | +# define GL_READDIR(pglob, stream) ((pglob)->gl_readdir (stream)) | ||
| 247 | +#endif | ||
| 248 | + | ||
| 249 | +/* Extract name and type from directory entry. No copy of the name is | ||
| 250 | + made. If SOURCE is NULL, result name is NULL. Keep in sync with | ||
| 251 | + convert_dirent64 below. */ | ||
| 252 | +static struct readdir_result | ||
| 253 | +convert_dirent (const struct dirent *source) | ||
| 254 | +{ | ||
| 255 | + if (source == NULL) | ||
| 256 | + { | ||
| 257 | + struct readdir_result result = { NULL, }; | ||
| 258 | + return result; | ||
| 259 | + } | ||
| 260 | + struct readdir_result result = READDIR_RESULT_INITIALIZER (source); | ||
| 261 | + return result; | ||
| 262 | +} | ||
| 263 | + | ||
| 264 | +#ifndef COMPILE_GLOB64 | ||
| 265 | +/* Like convert_dirent, but works on struct dirent64 instead. Keep in | ||
| 266 | + sync with convert_dirent above. */ | ||
| 267 | +static struct readdir_result | ||
| 268 | +convert_dirent64 (const struct dirent64 *source) | ||
| 269 | +{ | ||
| 270 | + if (source == NULL) | ||
| 271 | + { | ||
| 272 | + struct readdir_result result = { NULL, }; | ||
| 273 | + return result; | ||
| 274 | + } | ||
| 275 | + struct readdir_result result = READDIR_RESULT_INITIALIZER (source); | ||
| 276 | + return result; | ||
| 277 | +} | ||
| 278 | +#endif | ||
| 279 | + | ||
| 280 | + | ||
| 281 | #ifndef attribute_hidden | ||
| 282 | # define attribute_hidden | ||
| 283 | #endif | ||
| 284 | @@ -1553,56 +1582,36 @@ glob_in_dir (const char *pattern, const char *directory, int flags, | ||
| 285 | |||
| 286 | while (1) | ||
| 287 | { | ||
| 288 | - const char *name; | ||
| 289 | - size_t len; | ||
| 290 | -#if defined _LIBC && !defined COMPILE_GLOB64 | ||
| 291 | - struct dirent64 *d; | ||
| 292 | - union | ||
| 293 | - { | ||
| 294 | - struct dirent64 d64; | ||
| 295 | - char room [offsetof (struct dirent64, d_name[0]) | ||
| 296 | - + NAME_MAX + 1]; | ||
| 297 | - } | ||
| 298 | - d64buf; | ||
| 299 | - | ||
| 300 | - if (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)) | ||
| 301 | + struct readdir_result d; | ||
| 302 | { | ||
| 303 | - struct dirent *d32 = (*pglob->gl_readdir) (stream); | ||
| 304 | - if (d32 != NULL) | ||
| 305 | - { | ||
| 306 | - CONVERT_DIRENT_DIRENT64 (&d64buf.d64, d32); | ||
| 307 | - d = &d64buf.d64; | ||
| 308 | - } | ||
| 309 | + if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0)) | ||
| 310 | + d = convert_dirent (GL_READDIR (pglob, stream)); | ||
| 311 | else | ||
| 312 | - d = NULL; | ||
| 313 | - } | ||
| 314 | - else | ||
| 315 | - d = __readdir64 (stream); | ||
| 316 | + { | ||
| 317 | +#ifdef COMPILE_GLOB64 | ||
| 318 | + d = convert_dirent (__readdir (stream)); | ||
| 319 | #else | ||
| 320 | - struct dirent *d = (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0) | ||
| 321 | - ? ((struct dirent *) | ||
| 322 | - (*pglob->gl_readdir) (stream)) | ||
| 323 | - : __readdir (stream)); | ||
| 324 | + d = convert_dirent64 (__readdir64 (stream)); | ||
| 325 | #endif | ||
| 326 | - if (d == NULL) | ||
| 327 | + } | ||
| 328 | + } | ||
| 329 | + if (d.name == NULL) | ||
| 330 | break; | ||
| 331 | - if (! REAL_DIR_ENTRY (d)) | ||
| 332 | + if (d.skip_entry) | ||
| 333 | continue; | ||
| 334 | |||
| 335 | /* If we shall match only directories use the information | ||
| 336 | provided by the dirent call if possible. */ | ||
| 337 | - if ((flags & GLOB_ONLYDIR) && !DIRENT_MIGHT_BE_DIR (d)) | ||
| 338 | + if ((flags & GLOB_ONLYDIR) && !readdir_result_might_be_dir (d)) | ||
| 339 | continue; | ||
| 340 | |||
| 341 | - name = d->d_name; | ||
| 342 | - | ||
| 343 | - if (fnmatch (pattern, name, fnm_flags) == 0) | ||
| 344 | + if (fnmatch (pattern, d.name, fnm_flags) == 0) | ||
| 345 | { | ||
| 346 | /* If the file we found is a symlink we have to | ||
| 347 | make sure the target file exists. */ | ||
| 348 | - if (!DIRENT_MIGHT_BE_SYMLINK (d) | ||
| 349 | - || link_exists_p (dfd, directory, dirlen, name, pglob, | ||
| 350 | - flags)) | ||
| 351 | + if (!readdir_result_might_be_symlink (d) | ||
| 352 | + || link_exists_p (dfd, directory, dirlen, d.name, | ||
| 353 | + pglob, flags)) | ||
| 354 | { | ||
| 355 | if (cur == names->count) | ||
| 356 | { | ||
| 357 | @@ -1622,12 +1631,10 @@ glob_in_dir (const char *pattern, const char *directory, int flags, | ||
| 358 | names = newnames; | ||
| 359 | cur = 0; | ||
| 360 | } | ||
| 361 | - len = NAMLEN (d); | ||
| 362 | - names->name[cur] = (char *) malloc (len + 1); | ||
| 363 | + names->name[cur] = strdup (d.name); | ||
| 364 | if (names->name[cur] == NULL) | ||
| 365 | - goto memory_error; | ||
| 366 | - *((char *) mempcpy (names->name[cur++], name, len)) | ||
| 367 | - = '\0'; | ||
| 368 | + goto memory_error; | ||
| 369 | + ++cur; | ||
| 370 | ++nfound; | ||
| 371 | } | ||
| 372 | } | ||
| 373 | diff --git a/posix/tst-gnuglob.c b/posix/tst-gnuglob.c | ||
| 374 | index 992b997..3a27a06 100644 | ||
| 375 | --- a/posix/tst-gnuglob.c | ||
| 376 | +++ b/posix/tst-gnuglob.c | ||
| 377 | @@ -211,7 +211,7 @@ my_readdir (void *gdir) | ||
| 378 | return NULL; | ||
| 379 | } | ||
| 380 | |||
| 381 | - dir->d.d_ino = dir->idx; | ||
| 382 | + dir->d.d_ino = 1; /* glob should not skip this entry. */ | ||
| 383 | |||
| 384 | #ifdef _DIRENT_HAVE_D_TYPE | ||
| 385 | dir->d.d_type = filesystem[dir->idx].type; | ||
| 386 | diff --git a/sysdeps/unix/sysv/linux/i386/glob64.c b/sysdeps/unix/sysv/linux/i386/glob64.c | ||
| 387 | index b4fcd1a..4a2dfc1 100644 | ||
| 388 | --- a/sysdeps/unix/sysv/linux/i386/glob64.c | ||
| 389 | +++ b/sysdeps/unix/sysv/linux/i386/glob64.c | ||
| 390 | @@ -1,3 +1,21 @@ | ||
| 391 | +/* Two glob variants with 64-bit support, for dirent64 and __olddirent64. | ||
| 392 | + Copyright (C) 1998-2016 Free Software Foundation, Inc. | ||
| 393 | + This file is part of the GNU C Library. | ||
| 394 | + | ||
| 395 | + The GNU C Library is free software; you can redistribute it and/or | ||
| 396 | + modify it under the terms of the GNU Lesser General Public | ||
| 397 | + License as published by the Free Software Foundation; either | ||
| 398 | + version 2.1 of the License, or (at your option) any later version. | ||
| 399 | + | ||
| 400 | + The GNU C Library is distributed in the hope that it will be useful, | ||
| 401 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 402 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 403 | + Lesser General Public License for more details. | ||
| 404 | + | ||
| 405 | + You should have received a copy of the GNU Lesser General Public | ||
| 406 | + License along with the GNU C Library; if not, see | ||
| 407 | + <http://www.gnu.org/licenses/>. */ | ||
| 408 | + | ||
| 409 | #include <dirent.h> | ||
| 410 | #include <glob.h> | ||
| 411 | #include <sys/stat.h> | ||
| 412 | @@ -38,11 +56,15 @@ int __old_glob64 (const char *__pattern, int __flags, | ||
| 413 | |||
| 414 | #undef dirent | ||
| 415 | #define dirent __old_dirent64 | ||
| 416 | +#undef GL_READDIR | ||
| 417 | +#define GL_READDIR(pglob, stream) \ | ||
| 418 | + ((struct __old_dirent64 *) (pglob)->gl_readdir (stream)) | ||
| 419 | #undef __readdir | ||
| 420 | #define __readdir(dirp) __old_readdir64 (dirp) | ||
| 421 | #undef glob | ||
| 422 | #define glob(pattern, flags, errfunc, pglob) \ | ||
| 423 | __old_glob64 (pattern, flags, errfunc, pglob) | ||
| 424 | +#define convert_dirent __old_convert_dirent | ||
| 425 | #define glob_in_dir __old_glob_in_dir | ||
| 426 | #define GLOB_ATTRIBUTE attribute_compat_text_section | ||
| 427 | |||
diff --git a/meta/recipes-core/glibc/glibc/CVE-2016-3075.patch b/meta/recipes-core/glibc/glibc/CVE-2016-3075.patch new file mode 100644 index 0000000000..7b9dc4f5c3 --- /dev/null +++ b/meta/recipes-core/glibc/glibc/CVE-2016-3075.patch | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | glibc-2.23: Fix CVE-2016-3075 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2016-3075 | ||
| 4 | |||
| 5 | resolv/nss_dns/dns-network.c: Stack overflow in _nss_dns_getnetbyname_r | ||
| 6 | |||
| 7 | The defensive copy is not needed because the name may not alias the | ||
| 8 | output buffer. | ||
| 9 | |||
| 10 | Upstream-Status: Backport | ||
| 11 | CVE: CVE-2016-3075 | ||
| 12 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 13 | Signed-off-by: Pascal Bach <pascal.bach@siemens.com> | ||
| 14 | |||
| 15 | diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c | ||
| 16 | index 2eb2f67..8f301a7 100644 | ||
| 17 | --- a/resolv/nss_dns/dns-network.c | ||
| 18 | +++ b/resolv/nss_dns/dns-network.c | ||
| 19 | @@ -118,17 +118,14 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result, | ||
| 20 | } net_buffer; | ||
| 21 | querybuf *orig_net_buffer; | ||
| 22 | int anslen; | ||
| 23 | - char *qbuf; | ||
| 24 | enum nss_status status; | ||
| 25 | |||
| 26 | if (__res_maybe_init (&_res, 0) == -1) | ||
| 27 | return NSS_STATUS_UNAVAIL; | ||
| 28 | |||
| 29 | - qbuf = strdupa (name); | ||
| 30 | - | ||
| 31 | net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024); | ||
| 32 | |||
| 33 | - anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf, | ||
| 34 | + anslen = __libc_res_nsearch (&_res, name, C_IN, T_PTR, net_buffer.buf->buf, | ||
| 35 | 1024, &net_buffer.ptr, NULL, NULL, NULL, NULL); | ||
| 36 | if (anslen < 0) | ||
| 37 | { | ||
diff --git a/meta/recipes-core/glibc/glibc/CVE-2016-5417.patch b/meta/recipes-core/glibc/glibc/CVE-2016-5417.patch new file mode 100644 index 0000000000..8e0252beb4 --- /dev/null +++ b/meta/recipes-core/glibc/glibc/CVE-2016-5417.patch | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | glibc-2.23: Fix CVE-2016-5417 | ||
| 2 | |||
| 3 | [No upstream tracking] -- https://bugzilla.redhat.com/show_bug.cgi?id=1362534 | ||
| 4 | |||
| 5 | resolv/res_init.c:Fix resource leak in resolver | ||
| 6 | |||
| 7 | The number of currently defined nameservers is stored in ->nscount, | ||
| 8 | whereas ->_u._ext.nscount is set by __libc_res_nsend only after local | ||
| 9 | initializations. | ||
| 10 | |||
| 11 | Upstream-Status: Backport | ||
| 12 | CVE: CVE-2016-5417 | ||
| 13 | Signed-off-by: Andrej Valek <andrej.valek@siemens.com> | ||
| 14 | Signed-off-by: Pascal Bach <pascal.bach@siemens.com> | ||
| 15 | |||
| 16 | diff --git a/resolv/res_init.c b/resolv/res_init.c | ||
| 17 | index e0b6a80..6c951f5 100644 | ||
| 18 | --- a/resolv/res_init.c | ||
| 19 | +++ b/resolv/res_init.c | ||
| 20 | @@ -594,7 +594,7 @@ __res_iclose(res_state statp, bool free_addr) { | ||
| 21 | statp->_vcsock = -1; | ||
| 22 | statp->_flags &= ~(RES_F_VC | RES_F_CONN); | ||
| 23 | } | ||
| 24 | - for (ns = 0; ns < statp->_u._ext.nscount; ns++) | ||
| 25 | + for (ns = 0; ns < statp->nscount; ns++) | ||
| 26 | if (statp->_u._ext.nsaddrs[ns]) { | ||
| 27 | if (statp->_u._ext.nssocks[ns] != -1) { | ||
| 28 | close_not_cancel_no_status(statp->_u._ext.nssocks[ns]); | ||
diff --git a/meta/recipes-core/glibc/glibc_2.23.bb b/meta/recipes-core/glibc/glibc_2.23.bb index 63dc911e00..85b52159dc 100644 --- a/meta/recipes-core/glibc/glibc_2.23.bb +++ b/meta/recipes-core/glibc/glibc_2.23.bb | |||
| @@ -38,6 +38,9 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \ | |||
| 38 | file://0026-When-disabling-SSE-make-sure-fpmath-is-not-set-to-us.patch \ | 38 | file://0026-When-disabling-SSE-make-sure-fpmath-is-not-set-to-us.patch \ |
| 39 | file://CVE-2016-3706.patch \ | 39 | file://CVE-2016-3706.patch \ |
| 40 | file://CVE-2016-4429.patch \ | 40 | file://CVE-2016-4429.patch \ |
| 41 | file://CVE-2016-1234.patch \ | ||
| 42 | file://CVE-2016-3075.patch \ | ||
| 43 | file://CVE-2016-5417.patch \ | ||
| 41 | " | 44 | " |
| 42 | 45 | ||
| 43 | SRC_URI += "\ | 46 | SRC_URI += "\ |
