source:
patches/bash-3.2-fixes-5.patch@
2baa4a3
Last change on this file since 2baa4a3 was 24cc73c, checked in by , 17 years ago | |
---|---|
|
|
File size: 32.0 KB |
-
array.c
Submitted By: Joe Ciccone <jciccone@gmail.com> Date: 2007-07-23 Initial Package Version: 3.2 Origin: ftp://ftp.cwru.edu/pub/bash/bash-3.2-patches/ Upstream Status: From Upstream Description: Contains patches 001-017 from upstream diff -Naur bash-3.2.orig/array.c bash-3.2/array.c
old new 120 120 return(a1); 121 121 } 122 122 123 #ifdef INCLUDE_UNUSED124 123 /* 125 124 * Make and return a new array composed of the elements in array A from 126 125 * S to E, inclusive. … … 141 140 for (p = s, i = 0; p != e; p = element_forw(p), i++) { 142 141 n = array_create_element (element_index(p), element_value(p)); 143 142 ADD_BEFORE(a->head, n); 144 mi = element_index( ae);143 mi = element_index(n); 145 144 } 146 145 a->num_elements = i; 147 146 a->max_index = mi; 148 147 return a; 149 148 } 150 #endif151 149 152 150 /* 153 151 * Walk the array, calling FUNC once for each element, with the array … … 300 298 return array; 301 299 } 302 300 301 ARRAY * 302 array_quote_escapes(array) 303 ARRAY *array; 304 { 305 ARRAY_ELEMENT *a; 306 char *t; 307 308 if (array == 0 || array_head(array) == 0 || array_empty(array)) 309 return (ARRAY *)NULL; 310 for (a = element_forw(array->head); a != array->head; a = element_forw(a)) { 311 t = quote_escapes (a->value); 312 FREE(a->value); 313 a->value = t; 314 } 315 return array; 316 } 317 303 318 /* 304 319 * Return a string whose elements are the members of array A beginning at 305 320 * index START and spanning NELEM members. Null elements are counted. … … 311 326 arrayind_t start, nelem; 312 327 int starsub, quoted; 313 328 { 329 ARRAY *a2; 314 330 ARRAY_ELEMENT *h, *p; 315 331 arrayind_t i; 316 char *ifs, sep[2] ;332 char *ifs, sep[2], *t; 317 333 318 334 p = a ? array_head (a) : 0; 319 335 if (p == 0 || array_empty (a) || start > array_max_index(a)) … … 336 352 for (i = 0, h = p; p != a->head && i < nelem; i++, p = element_forw(p)) 337 353 ; 338 354 355 a2 = array_slice(a, h, p); 356 357 if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) 358 array_quote(a2); 359 else 360 array_quote_escapes(a2); 361 339 362 if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) { 340 363 ifs = getifs(); 341 364 sep[0] = ifs ? *ifs : '\0'; … … 343 366 sep[0] = ' '; 344 367 sep[1] = '\0'; 345 368 346 return (array_to_string_internal (h, p, sep, quoted)); 369 t = array_to_string (a2, sep, 0); 370 array_dispose(a2); 371 372 return t; 347 373 } 348 374 349 375 char * … … 367 393 } 368 394 369 395 if (mflags & MATCH_QUOTED) 370 array_quote (a2); 396 array_quote(a2); 397 else 398 array_quote_escapes(a2); 371 399 if (mflags & MATCH_STARSUB) { 372 400 ifs = getifs(); 373 401 sifs[0] = ifs ? *ifs : '\0'; -
array.h
diff -Naur bash-3.2.orig/array.h bash-3.2/array.h
old new 55 55 extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *)); 56 56 extern int array_shift_element __P((ARRAY *, char *)); 57 57 extern ARRAY *array_quote __P((ARRAY *)); 58 extern ARRAY *array_quote_escapes __P((ARRAY *)); 58 59 59 60 extern char *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int)); 60 61 extern char *array_patsub __P((ARRAY *, char *, char *, int)); -
builtins/common.c
diff -Naur bash-3.2.orig/builtins/common.c bash-3.2/builtins/common.c
old new 1 /* Copyright (C) 1987-200 5Free Software Foundation, Inc.1 /* Copyright (C) 1987-2007 Free Software Foundation, Inc. 2 2 3 3 This file is part of GNU Bash, the Bourne Again SHell. 4 4 … … 475 475 476 476 if (the_current_working_directory == 0) 477 477 { 478 #if defined (GETCWD_BROKEN) 479 the_current_working_directory = getcwd (0, PATH_MAX); 480 #else 478 481 the_current_working_directory = getcwd (0, 0); 482 #endif 479 483 if (the_current_working_directory == 0) 480 484 { 481 485 fprintf (stderr, _("%s: error retrieving current directory: %s: %s\n"), -
builtins/printf.def
diff -Naur bash-3.2.orig/builtins/printf.def bash-3.2/builtins/printf.def
old new 1 1 This file is printf.def, from which is created printf.c. 2 2 It implements the builtin "printf" in Bash. 3 3 4 Copyright (C) 1997-200 5Free Software Foundation, Inc.4 Copyright (C) 1997-2007 Free Software Foundation, Inc. 5 5 6 6 This file is part of GNU Bash, the Bourne Again SHell. 7 7 … … 49 49 # define INT_MIN (-2147483647-1) 50 50 #endif 51 51 52 #if defined (PREFER_STDARG) 53 # include <stdarg.h> 54 #else 55 # include <varargs.h> 56 #endif 57 52 58 #include <stdio.h> 53 59 #include <chartypes.h> 54 60 … … 64 70 #include "bashgetopt.h" 65 71 #include "common.h" 66 72 73 #if defined (PRI_MACROS_BROKEN) 74 # undef PRIdMAX 75 #endif 76 67 77 #if !defined (PRIdMAX) 68 78 # if HAVE_LONG_LONG 69 79 # define PRIdMAX "lld" … … 151 161 #define SKIP1 "#'-+ 0" 152 162 #define LENMODS "hjlLtz" 153 163 164 #ifndef HAVE_ASPRINTF 165 extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3))); 166 #endif 167 154 168 static void printf_erange __P((char *)); 155 169 static int printstr __P((char *, char *, int, int, int)); 156 170 static int tescape __P((char *, char *, int *)); -
config-bot.h
diff -Naur bash-3.2.orig/config-bot.h bash-3.2/config-bot.h
old new 1 1 /* config-bot.h */ 2 2 /* modify settings or make new ones based on what autoconf tells us. */ 3 3 4 /* Copyright (C) 1989-200 2Free Software Foundation, Inc.4 /* Copyright (C) 1989-2007 Free Software Foundation, Inc. 5 5 6 6 This file is part of GNU Bash, the Bourne Again SHell. 7 7 … … 70 70 # define TERMIOS_MISSING 71 71 #endif 72 72 73 /* If we have a getcwd(3), but it calls popen(), #undef HAVE_GETCWD so 74 the replacement in getcwd.c will be built. */ 75 #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) 73 /* If we have a getcwd(3), but one that does not dynamically allocate memory, 74 #undef HAVE_GETCWD so the replacement in getcwd.c will be built. We do 75 not do this on Solaris, because their implementation of loopback mounts 76 breaks the traditional file system assumptions that getcwd uses. */ 77 #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) && !defined (SOLARIS) 76 78 # undef HAVE_GETCWD 77 79 #endif 78 80 -
config.h.in
diff -Naur bash-3.2.orig/config.h.in bash-3.2/config.h.in
old new 1 1 /* config.h -- Configuration file for bash. */ 2 2 3 /* Copyright (C) 1987-200 6Free Software Foundation, Inc.3 /* Copyright (C) 1987-2007 Free Software Foundation, Inc. 4 4 5 5 This file is part of GNU Bash, the Bourne Again SHell. 6 6 … … 413 413 414 414 #undef HAVE_DECL_STRTOLD 415 415 416 #undef PRI_MACROS_BROKEN 417 416 418 #undef STRTOLD_BROKEN 417 419 418 420 /* Define if WCONTINUED is defined in system headers, but rejected by waitpid */ … … 1006 1008 /* Define if you have the `dcgettext' function. */ 1007 1009 #undef HAVE_DCGETTEXT 1008 1010 1011 /* Define if you have the `localeconv' function. */ 1012 #undef HAVE_LOCALECONV 1013 1009 1014 /* Define if your system has a working `malloc' function. */ 1010 1015 /* #undef HAVE_MALLOC */ 1011 1016 -
configure
diff -Naur bash-3.2.orig/configure bash-3.2/configure
old new 27316 27316 sco3.2v4*) LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;; 27317 27317 sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;; 27318 27318 sunos4*) LOCAL_CFLAGS=-DSunOS4 ;; 27319 solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;; 27319 solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;; 27320 solaris2*) LOCAL_CFLAGS=-DSOLARIS ;; 27320 27321 lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; 27321 27322 linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading 27322 27323 case "`uname -r`" in -
configure.in
diff -Naur bash-3.2.orig/configure.in bash-3.2/configure.in
old new 5 5 dnl 6 6 dnl Process this file with autoconf to produce a configure script. 7 7 8 # Copyright (C) 1987-200 6Free Software Foundation, Inc.8 # Copyright (C) 1987-2007 Free Software Foundation, Inc. 9 9 10 10 # This program is free software; you can redistribute it and/or modify 11 11 # it under the terms of the GNU General Public License as published by … … 991 991 sco3.2v4*) LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;; 992 992 sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;; 993 993 sunos4*) LOCAL_CFLAGS=-DSunOS4 ;; 994 solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;; 994 solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;; 995 solaris2*) LOCAL_CFLAGS=-DSOLARIS ;; 995 996 lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; 996 997 linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading 997 998 case "`uname -r`" in -
execute_cmd.c
diff -Naur bash-3.2.orig/execute_cmd.c bash-3.2/execute_cmd.c
old new 1 1 /* execute_cmd.c -- Execute a COMMAND structure. */ 2 2 3 /* Copyright (C) 1987-200 5Free Software Foundation, Inc.3 /* Copyright (C) 1987-2007 Free Software Foundation, Inc. 4 4 5 5 This file is part of GNU Bash, the Bourne Again SHell. 6 6 … … 2546 2546 arg1 = cond_expand_word (cond->left->op, 0); 2547 2547 if (arg1 == 0) 2548 2548 arg1 = nullstr; 2549 arg2 = cond_expand_word (cond->right->op, patmatch||rmatch);2549 arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0)); 2550 2550 if (arg2 == 0) 2551 2551 arg2 = nullstr; 2552 2552 … … 3050 3050 if (command_line == 0) 3051 3051 command_line = savestring (the_printed_command_except_trap); 3052 3052 3053 #if defined (PROCESS_SUBSTITUTION) 3054 if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0) 3055 simple_command->flags &= ~CMD_NO_FORK; 3056 #endif 3057 3053 3058 execute_disk_command (words, simple_command->redirects, command_line, 3054 3059 pipe_in, pipe_out, async, fds_to_close, 3055 3060 simple_command->flags); -
findcmd.c
diff -Naur bash-3.2.orig/findcmd.c bash-3.2/findcmd.c
old new 308 308 if (hashed_file && (posixly_correct || check_hashed_filenames)) 309 309 { 310 310 st = file_status (hashed_file); 311 if ((st ^ (FS_EXISTS | FS_EXECABLE)) != 0)311 if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE)) 312 312 { 313 313 phash_remove (pathname); 314 314 free (hashed_file); -
bash-3.2
diff -Naur bash-3.2.orig/jobs.c bash-3.2/jobs.c
old new 984 984 temp = jobs[job_index]; 985 985 if (temp == 0) 986 986 return; 987 if (job_index == js.j_current || job_index == js.j_previous)988 reset_current ();989 987 990 988 if ((dflags & DEL_NOBGPID) == 0) 991 989 { … … 1028 1026 js.j_firstj = js.j_lastj = 0; 1029 1027 else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0) 1030 1028 reset_job_indices (); 1029 1030 if (job_index == js.j_current || job_index == js.j_previous) 1031 reset_current (); 1031 1032 } 1032 1033 1033 1034 /* Must be called with SIGCHLD blocked. */ -
lib/readline/display.c
diff -Naur bash-3.2.orig/lib/readline/display.c bash-3.2/lib/readline/display.c
old new 561 561 wrap_offset = prompt_invis_chars_first_line = 0; 562 562 } 563 563 564 #if defined (HANDLE_MULTIBYTE) 565 #define CHECK_INV_LBREAKS() \ 566 do { \ 567 if (newlines >= (inv_lbsize - 2)) \ 568 { \ 569 inv_lbsize *= 2; \ 570 inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ 571 _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \ 572 } \ 573 } while (0) 574 #else 564 575 #define CHECK_INV_LBREAKS() \ 565 576 do { \ 566 577 if (newlines >= (inv_lbsize - 2)) \ … … 569 580 inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ 570 581 } \ 571 582 } while (0) 583 #endif /* HANDLE_MULTIBYTE */ 572 584 573 585 #if defined (HANDLE_MULTIBYTE) 574 586 #define CHECK_LPOS() \ … … 1586 1598 temp = nls - nfd; 1587 1599 if (temp > 0) 1588 1600 { 1601 /* If nfd begins at the prompt, or before the invisible 1602 characters in the prompt, we need to adjust _rl_last_c_pos 1603 in a multibyte locale to account for the wrap offset and 1604 set cpos_adjusted accordingly. */ 1589 1605 _rl_output_some_chars (nfd, temp); 1590 _rl_last_c_pos += _rl_col_width (nfd, 0, temp);; 1606 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) 1607 { 1608 _rl_last_c_pos += _rl_col_width (nfd, 0, temp); 1609 if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) 1610 { 1611 _rl_last_c_pos -= wrap_offset; 1612 cpos_adjusted = 1; 1613 } 1614 } 1615 else 1616 _rl_last_c_pos += temp; 1591 1617 } 1592 1618 } 1593 1619 /* Otherwise, print over the existing material. */ … … 1595 1621 { 1596 1622 if (temp > 0) 1597 1623 { 1624 /* If nfd begins at the prompt, or before the invisible 1625 characters in the prompt, we need to adjust _rl_last_c_pos 1626 in a multibyte locale to account for the wrap offset and 1627 set cpos_adjusted accordingly. */ 1598 1628 _rl_output_some_chars (nfd, temp); 1599 1629 _rl_last_c_pos += col_temp; /* XXX */ 1630 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) 1631 { 1632 if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) 1633 { 1634 _rl_last_c_pos -= wrap_offset; 1635 cpos_adjusted = 1; 1636 } 1637 } 1600 1638 } 1601 1639 lendiff = (oe - old) - (ne - new); 1602 1640 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) … … 1732 1770 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) 1733 1771 { 1734 1772 dpos = _rl_col_width (data, 0, new); 1735 if (dpos > prompt_last_invisible) /* XXX - don't use woff here */ 1773 /* Use NEW when comparing against the last invisible character in the 1774 prompt string, since they're both buffer indices and DPOS is a 1775 desired display position. */ 1776 if (new > prompt_last_invisible) /* XXX - don't use woff here */ 1736 1777 { 1737 1778 dpos -= woff; 1738 1779 /* Since this will be assigned to _rl_last_c_pos at the end (more … … 2380 2421 2381 2422 if (end <= start) 2382 2423 return 0; 2424 if (MB_CUR_MAX == 1 || rl_byte_oriented) 2425 return (end - start); 2383 2426 2384 2427 memset (&ps, 0, sizeof (mbstate_t)); 2385 2428 -
lib/sh/snprintf.c
diff -Naur bash-3.2.orig/lib/sh/snprintf.c bash-3.2/lib/sh/snprintf.c
old new 471 471 10^x ~= r 472 472 * log_10(200) = 2; 473 473 * log_10(250) = 2; 474 * 475 * NOTE: do not call this with r == 0 -- an infinite loop results. 474 476 */ 475 477 static int 476 478 log_10(r) … … 576 578 { 577 579 integral_part[0] = '0'; 578 580 integral_part[1] = '\0'; 579 fraction_part[0] = '0'; 580 fraction_part[1] = '\0'; 581 /* The fractional part has to take the precision into account */ 582 for (ch = 0; ch < precision-1; ch++) 583 fraction_part[ch] = '0'; 584 fraction_part[ch] = '0'; 585 fraction_part[ch+1] = '\0'; 581 586 if (fract) 582 587 *fract = fraction_part; 583 588 return integral_part; … … 663 668 p->flags &= ~PF_ZEROPAD; 664 669 665 670 sd = d; /* signed for ' ' padding in base 10 */ 666 flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0; 671 flags = 0; 672 flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0; 667 673 if (*p->pf == 'X') 668 674 flags |= FL_HEXUPPER; 669 675 … … 733 739 p->flags &= ~PF_ZEROPAD; 734 740 735 741 sd = d; /* signed for ' ' padding in base 10 */ 736 flags = (*p->pf == ' u' || *p->pf == 'U') ? FL_UNSIGNED : 0;742 flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0; 737 743 if (*p->pf == 'X') 738 744 flags |= FL_HEXUPPER; 739 745 … … 805 811 PUT_CHAR(*tmp, p); 806 812 tmp++; 807 813 } 814 808 815 PAD_LEFT(p); 809 816 } 810 817 … … 972 979 if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp))) 973 980 tmp = t; 974 981 982 if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0) 983 { 984 /* smash the trailing zeros unless altform */ 985 for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--) 986 tmp2[i] = '\0'; 987 if (tmp2[0] == '\0') 988 p->precision = 0; 989 } 990 975 991 /* calculate the padding. 1 for the dot */ 976 992 p->width = p->width - 977 993 ((d > 0. && p->justify == RIGHT) ? 1:0) - 978 994 ((p->flags & PF_SPACE) ? 1:0) - 979 strlen(tmp) - p->precision - 1; 995 strlen(tmp) - p->precision - 996 ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0); /* radix char */ 980 997 PAD_RIGHT(p); 981 998 PUT_PLUS(d, p, 0.); 982 999 PUT_SPACE(d, p, 0.); … … 991 1008 if (p->precision != 0 || (p->flags & PF_ALTFORM)) 992 1009 PUT_CHAR(decpoint, p); /* put the '.' */ 993 1010 994 if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)995 /* smash the trailing zeros unless altform */996 for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)997 tmp2[i] = '\0';998 999 1011 for (; *tmp2; tmp2++) 1000 1012 PUT_CHAR(*tmp2, p); /* the fraction */ 1001 1013 … … 1011 1023 char *tmp, *tmp2; 1012 1024 int j, i; 1013 1025 1014 if ( chkinfnan(p, d, 1) || chkinfnan(p, d, 2))1026 if (d != 0 && (chkinfnan(p, d, 1) || chkinfnan(p, d, 2))) 1015 1027 return; /* already printed nan or inf */ 1016 1028 1017 1029 GETLOCALEDATA(decpoint, thoussep, grouping); 1018 1030 DEF_PREC(p); 1019 j = log_10(d); 1020 d = d / pow_10(j); /* get the Mantissa */ 1021 d = ROUND(d, p); 1031 if (d == 0.) 1032 j = 0; 1033 else 1034 { 1035 j = log_10(d); 1036 d = d / pow_10(j); /* get the Mantissa */ 1037 d = ROUND(d, p); 1038 } 1022 1039 tmp = dtoa(d, p->precision, &tmp2); 1023 1040 1024 1041 /* 1 for unit, 1 for the '.', 1 for 'e|E', … … 1076 1093 PUT_CHAR(*tmp, p); 1077 1094 tmp++; 1078 1095 } 1096 1079 1097 PAD_LEFT(p); 1080 1098 } 1081 1099 #endif … … 1358 1376 STAR_ARGS(data); 1359 1377 DEF_PREC(data); 1360 1378 d = GETDOUBLE(data); 1361 i = log_10(d);1379 i = (d != 0.) ? log_10(d) : -1; 1362 1380 /* 1363 1381 * for '%g|%G' ANSI: use f if exponent 1364 1382 * is in the range or [-4,p] exclusively -
parse.y
diff -Naur bash-3.2.orig/parse.y bash-3.2/parse.y
old new 1029 1029 #define PST_CMDTOKEN 0x1000 /* command token OK - unused */ 1030 1030 #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */ 1031 1031 #define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */ 1032 #define PST_REGEXP 0x8000 /* parsing an ERE/BRE as a single word */ 1032 1033 1033 1034 /* Initial size to allocate for tokens, and the 1034 1035 amount to grow them by. */ … … 2591 2592 return (character); 2592 2593 } 2593 2594 2595 if (parser_state & PST_REGEXP) 2596 goto tokword; 2597 2594 2598 /* Shell meta-characters. */ 2595 2599 if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0)) 2596 2600 { … … 2698 2702 if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND)) 2699 2703 return (character); 2700 2704 2705 tokword: 2701 2706 /* Okay, if we got this far, we have to read a word. Read one, 2702 2707 and then check it against the known ones. */ 2703 2708 result = read_token_word (character); … … 2735 2740 /* itrace("parse_matched_pair: open = %c close = %c", open, close); */ 2736 2741 count = 1; 2737 2742 pass_next_character = backq_backslash = was_dollar = in_comment = 0; 2738 check_comment = (flags & P_COMMAND) && qc != ' \'' && qc != '"' && (flags & P_DQUOTE) == 0;2743 check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0; 2739 2744 2740 2745 /* RFLAGS is the set of flags we want to pass to recursive calls. */ 2741 2746 rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE); … … 3202 3207 if (tok == WORD && test_binop (yylval.word->word)) 3203 3208 op = yylval.word; 3204 3209 #if defined (COND_REGEXP) 3205 else if (tok == WORD && STREQ (yylval.word->word,"=~")) 3206 op = yylval.word; 3210 else if (tok == WORD && STREQ (yylval.word->word, "=~")) 3211 { 3212 op = yylval.word; 3213 parser_state |= PST_REGEXP; 3214 } 3207 3215 #endif 3208 3216 else if (tok == '<' || tok == '>') 3209 3217 op = make_word_from_token (tok); /* ( */ … … 3234 3242 3235 3243 /* rhs */ 3236 3244 tok = read_token (READ); 3245 parser_state &= ~PST_REGEXP; 3237 3246 if (tok == WORD) 3238 3247 { 3239 3248 tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); … … 3419 3428 goto next_character; 3420 3429 } 3421 3430 3431 #ifdef COND_REGEXP 3432 /* When parsing a regexp as a single word inside a conditional command, 3433 we need to special-case characters special to both the shell and 3434 regular expressions. Right now, that is only '(' and '|'. */ /*)*/ 3435 if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/ 3436 { 3437 if (character == '|') 3438 goto got_character; 3439 3440 push_delimiter (dstack, character); 3441 ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0); 3442 pop_delimiter (dstack); 3443 if (ttok == &matched_pair_error) 3444 return -1; /* Bail immediately. */ 3445 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, 3446 token_buffer_size, TOKEN_DEFAULT_GROW_SIZE); 3447 token[token_index++] = character; 3448 strcpy (token + token_index, ttok); 3449 token_index += ttoklen; 3450 FREE (ttok); 3451 dollar_present = all_digit_token = 0; 3452 goto next_character; 3453 } 3454 #endif /* COND_REGEXP */ 3455 3422 3456 #ifdef EXTENDED_GLOB 3423 3457 /* Parse a ksh-style extended pattern matching specification. */ 3424 if (extended_glob && PATTERN_CHAR (character))3458 if MBTEST(extended_glob && PATTERN_CHAR (character)) 3425 3459 { 3426 3460 peek_char = shell_getc (1); 3427 3461 if MBTEST(peek_char == '(') /* ) */ -
patchlevel.h
diff -Naur bash-3.2.orig/patchlevel.h bash-3.2/patchlevel.h
old new 25 25 regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh 26 26 looks for to find the patch level (for the sccs version string). */ 27 27 28 #define PATCHLEVEL 028 #define PATCHLEVEL 17 29 29 30 30 #endif /* _PATCHLEVEL_H_ */ -
pathexp.c
diff -Naur bash-3.2.orig/pathexp.c bash-3.2/pathexp.c
old new 1 1 /* pathexp.c -- The shell interface to the globbing library. */ 2 2 3 /* Copyright (C) 1995-200 2Free Software Foundation, Inc.3 /* Copyright (C) 1995-2007 Free Software Foundation, Inc. 4 4 5 5 This file is part of GNU Bash, the Bourne Again SHell. 6 6 … … 110 110 return (0); 111 111 } 112 112 113 /* Return 1 if C is a character that is `special' in a POSIX ERE and needs to 114 be quoted to match itself. */ 115 static inline int 116 ere_char (c) 117 int c; 118 { 119 switch (c) 120 { 121 case '.': 122 case '[': 123 case '\\': 124 case '(': 125 case ')': 126 case '*': 127 case '+': 128 case '?': 129 case '{': 130 case '|': 131 case '^': 132 case '$': 133 return 1; 134 default: 135 return 0; 136 } 137 return (0); 138 } 139 113 140 /* PATHNAME can contain characters prefixed by CTLESC; this indicates 114 141 that the character is to be quoted. We quote it here in the style 115 142 that the glob library recognizes. If flags includes QGLOB_CVTNULL, … … 142 169 { 143 170 if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/') 144 171 continue; 172 if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0) 173 continue; 145 174 temp[j++] = '\\'; 146 175 i++; 147 176 if (pathname[i] == '\0') -
pathexp.h
diff -Naur bash-3.2.orig/pathexp.h bash-3.2/pathexp.h
old new 1 1 /* pathexp.h -- The shell interface to the globbing library. */ 2 2 3 /* Copyright (C) 1987-200 5Free Software Foundation, Inc.3 /* Copyright (C) 1987-2007 Free Software Foundation, Inc. 4 4 5 5 This file is part of GNU Bash, the Bourne Again SHell. 6 6 … … 32 32 /* Flag values for quote_string_for_globbing */ 33 33 #define QGLOB_CVTNULL 0x01 /* convert QUOTED_NULL strings to '\0' */ 34 34 #define QGLOB_FILENAME 0x02 /* do correct quoting for matching filenames */ 35 #define QGLOB_REGEXP 0x04 /* quote an ERE for regcomp/regexec */ 35 36 36 37 #if defined (EXTENDED_GLOB) 37 38 /* Flags to OR with other flag args to strmatch() to enabled the extended -
po/ru.po
diff -Naur bash-3.2.orig/po/ru.po bash-3.2/po/ru.po
old new 12 12 "Last-Translator: Evgeniy Dushistov <dushistov@mail.ru>\n" 13 13 "Language-Team: Russian <ru@li.org>\n" 14 14 "MIME-Version: 1.0\n" 15 "Content-Type: text/plain; charset= UTF-8\n"15 "Content-Type: text/plain; charset=KOI8-R\n" 16 16 "Content-Transfer-Encoding: 8bit\n" 17 17 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 18 18 -
subst.c
diff -Naur bash-3.2.orig/subst.c bash-3.2/subst.c
old new 4 4 /* ``Have a little faith, there's magic in the night. You ain't a 5 5 beauty, but, hey, you're alright.'' */ 6 6 7 /* Copyright (C) 1987-200 6Free Software Foundation, Inc.7 /* Copyright (C) 1987-2007 Free Software Foundation, Inc. 8 8 9 9 This file is part of GNU Bash, the Bourne Again SHell. 10 10 … … 1887 1887 sep[1] = '\0'; 1888 1888 #endif 1889 1889 1890 /* XXX -- why call quote_list if ifs == 0? we can get away without doing 1891 it now that quote_escapes quotes spaces */ 1892 #if 0 1890 1893 tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0)) 1894 #else 1895 tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) 1896 #endif 1891 1897 ? quote_list (list) 1892 1898 : list_quote_escapes (list); 1893 1899 … … 2646 2652 2647 2653 /* This needs better error handling. */ 2648 2654 /* Expand W for use as an argument to a unary or binary operator in a 2649 [[...]] expression. If SPECIAL is nonzero, this is the rhs argument2655 [[...]] expression. If SPECIAL is 1, this is the rhs argument 2650 2656 to the != or == operator, and should be treated as a pattern. In 2651 this case, we quote the string specially for the globbing code. The 2652 caller is responsible for removing the backslashes if the unquoted 2653 words is needed later. */ 2657 this case, we quote the string specially for the globbing code. If 2658 SPECIAL is 2, this is an rhs argument for the =~ operator, and should 2659 be quoted appropriately for regcomp/regexec. The caller is responsible 2660 for removing the backslashes if the unquoted word is needed later. */ 2654 2661 char * 2655 2662 cond_expand_word (w, special) 2656 2663 WORD_DESC *w; … … 2658 2665 { 2659 2666 char *r, *p; 2660 2667 WORD_LIST *l; 2668 int qflags; 2661 2669 2662 2670 if (w->word == 0 || w->word[0] == '\0') 2663 2671 return ((char *)NULL); … … 2672 2680 } 2673 2681 else 2674 2682 { 2683 qflags = QGLOB_CVTNULL; 2684 if (special == 2) 2685 qflags |= QGLOB_REGEXP; 2675 2686 p = string_list (l); 2676 r = quote_string_for_globbing (p, QGLOB_CVTNULL);2687 r = quote_string_for_globbing (p, qflags); 2677 2688 free (p); 2678 2689 } 2679 2690 dispose_words (l); … … 2916 2927 2917 2928 /* Quote escape characters in string s, but no other characters. This is 2918 2929 used to protect CTLESC and CTLNUL in variable values from the rest of 2919 the word expansion process after the variable is expanded. */ 2930 the word expansion process after the variable is expanded. If IFS is 2931 null, we quote spaces as well, just in case we split on spaces later 2932 (in the case of unquoted $@, we will eventually attempt to split the 2933 entire word on spaces). Corresponding code exists in dequote_escapes. 2934 Even if we don't end up splitting on spaces, quoting spaces is not a 2935 problem. */ 2920 2936 char * 2921 2937 quote_escapes (string) 2922 2938 char *string; … … 2924 2940 register char *s, *t; 2925 2941 size_t slen; 2926 2942 char *result, *send; 2943 int quote_spaces; 2927 2944 DECLARE_MBSTATE; 2928 2945 2929 2946 slen = strlen (string); 2930 2947 send = string + slen; 2931 2948 2949 quote_spaces = (ifs_value && *ifs_value == 0); 2932 2950 t = result = (char *)xmalloc ((slen * 2) + 1); 2933 2951 s = string; 2934 2952 2935 2953 while (*s) 2936 2954 { 2937 if (*s == CTLESC || *s == CTLNUL )2955 if (*s == CTLESC || *s == CTLNUL || (quote_spaces && *s == ' ')) 2938 2956 *t++ = CTLESC; 2939 2957 COPY_CHAR_P (t, s, send); 2940 2958 } … … 2976 2994 register char *s, *t; 2977 2995 size_t slen; 2978 2996 char *result, *send; 2997 int quote_spaces; 2979 2998 DECLARE_MBSTATE; 2980 2999 2981 3000 if (string == 0) … … 2990 3009 if (strchr (string, CTLESC) == 0) 2991 3010 return (strcpy (result, s)); 2992 3011 3012 quote_spaces = (ifs_value && *ifs_value == 0); 2993 3013 while (*s) 2994 3014 { 2995 if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL ))3015 if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' '))) 2996 3016 { 2997 3017 s++; 2998 3018 if (*s == '\0') … … 4123 4143 nfifo = 0; 4124 4144 } 4125 4145 4146 int 4147 fifos_pending () 4148 { 4149 return nfifo; 4150 } 4151 4126 4152 static char * 4127 4153 make_named_pipe () 4128 4154 { … … 4172 4198 nfds++; 4173 4199 } 4174 4200 4201 int 4202 fifos_pending () 4203 { 4204 return 0; /* used for cleanup; not needed with /dev/fd */ 4205 } 4206 4175 4207 void 4176 4208 unlink_fifo_list () 4177 4209 { … … 4456 4488 /* Add the character to ISTRING, possibly after resizing it. */ 4457 4489 RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE); 4458 4490 4459 if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC || c == CTLNUL) 4491 /* This is essentially quote_string inline */ 4492 if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */) 4493 istring[istring_index++] = CTLESC; 4494 /* Escape CTLESC and CTLNUL in the output to protect those characters 4495 from the rest of the word expansions (word splitting and globbing.) 4496 This is essentially quote_escapes inline. */ 4497 else if (c == CTLESC) 4498 istring[istring_index++] = CTLESC; 4499 else if (c == CTLNUL || (c == ' ' && (ifs_value && *ifs_value == 0))) 4460 4500 istring[istring_index++] = CTLESC; 4461 4501 4462 4502 istring[istring_index++] = c; … … 4665 4705 4666 4706 last_command_exit_value = rc; 4667 4707 rc = run_exit_trap (); 4708 #if defined (PROCESS_SUBSTITUTION) 4709 unlink_fifo_list (); 4710 #endif 4668 4711 exit (rc); 4669 4712 } 4670 4713 else … … 5546 5589 so verify_substring_values just returns the numbers specified and we 5547 5590 rely on array_subrange to understand how to deal with them). */ 5548 5591 tt = array_subrange (array_cell (v), e1, e2, starsub, quoted); 5592 #if 0 5593 /* array_subrange now calls array_quote_escapes as appropriate, so the 5594 caller no longer needs to. */ 5549 5595 if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0) 5550 5596 { 5551 5597 temp = tt ? quote_escapes (tt) : (char *)NULL; 5552 5598 FREE (tt); 5553 5599 } 5554 5600 else 5601 #endif 5555 5602 temp = tt; 5556 5603 break; 5557 5604 #endif … … 5707 5754 vtype &= ~VT_STARSUB; 5708 5755 5709 5756 mflags = 0; 5757 if (patsub && *patsub == '/') 5758 { 5759 mflags |= MATCH_GLOBREP; 5760 patsub++; 5761 } 5710 5762 5711 5763 /* Malloc this because expand_string_if_necessary or one of the expansion 5712 5764 functions in its call chain may free it on a substitution error. */ … … 5741 5793 } 5742 5794 5743 5795 /* ksh93 doesn't allow the match specifier to be a part of the expanded 5744 pattern. This is an extension. */ 5796 pattern. This is an extension. Make sure we don't anchor the pattern 5797 at the beginning or end of the string if we're doing global replacement, 5798 though. */ 5745 5799 p = pat; 5746 if (pat && pat[0] == '/') 5747 { 5748 mflags |= MATCH_GLOBREP|MATCH_ANY; 5749 p++; 5750 } 5800 if (mflags & MATCH_GLOBREP) 5801 mflags |= MATCH_ANY; 5751 5802 else if (pat && pat[0] == '#') 5752 5803 { 5753 5804 mflags |= MATCH_BEG; … … 5798 5849 #if defined (ARRAY_VARS) 5799 5850 case VT_ARRAYVAR: 5800 5851 temp = array_patsub (array_cell (v), p, rep, mflags); 5852 #if 0 5853 /* Don't need to do this anymore; array_patsub calls array_quote_escapes 5854 as appropriate before adding the space separators. */ 5801 5855 if (temp && (mflags & MATCH_QUOTED) == 0) 5802 5856 { 5803 5857 tt = quote_escapes (temp); 5804 5858 free (temp); 5805 5859 temp = tt; 5806 5860 } 5861 #endif 5807 5862 break; 5808 5863 #endif 5809 5864 } -
subst.h
diff -Naur bash-3.2.orig/subst.h bash-3.2/subst.h
old new 222 222 extern char *command_substitute __P((char *, int)); 223 223 extern char *pat_subst __P((char *, char *, char *, int)); 224 224 225 extern int fifos_pending __P((void)); 225 226 extern void unlink_fifo_list __P((void)); 226 227 227 228 extern WORD_LIST *list_string_with_quotes __P((char *)); -
tests/new-exp.right
diff -Naur bash-3.2.orig/tests/new-exp.right bash-3.2/tests/new-exp.right
old new 430 430 Case06---1---A B C::--- 431 431 Case07---3---A:B:C--- 432 432 Case08---3---A:B:C--- 433 ./new-exp.tests: line 506: /${$(($#-1))}: bad substitution433 ./new-exp.tests: line 506: ${$(($#-1))}: bad substitution 434 434 argv[1] = <a> 435 435 argv[2] = <b> 436 436 argv[3] = <c>
Note:
See TracBrowser
for help on using the repository browser.