| [c5c522c] | 1 | BASH PATCH REPORT |
|---|
| 2 | ================= |
|---|
| 3 | |
|---|
| 4 | Bash-Release: 4.3 |
|---|
| 5 | Patch-ID: bash43-031 |
|---|
| 6 | |
|---|
| 7 | Bug-Reported-by: lolilolicon <lolilolicon@gmail.com> |
|---|
| 8 | Bug-Reference-ID: <CAMtVo_Nz=32Oq=zWTb6=+8gUNXOo2rRvud1W4oPnA-cgVk_ZqQ@mail.gmail.com> |
|---|
| 9 | Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-08/msg00139.html |
|---|
| 10 | |
|---|
| 11 | Bug-Description: |
|---|
| 12 | |
|---|
| 13 | The new nameref assignment functionality introduced in bash-4.3 did not perform |
|---|
| 14 | enough validation on the variable value and would create variables with |
|---|
| 15 | invalid names. |
|---|
| 16 | |
|---|
| 17 | Patch (apply with `patch -p0'): |
|---|
| 18 | |
|---|
| 19 | *** ../bash-4.3-patched/subst.h 2014-01-11 21:02:27.000000000 -0500 |
|---|
| 20 | --- subst.h 2014-09-01 12:16:56.000000000 -0400 |
|---|
| 21 | *************** |
|---|
| 22 | *** 48,51 **** |
|---|
| 23 | --- 48,52 ---- |
|---|
| 24 | #define ASS_MKGLOBAL 0x0008 /* force global assignment */ |
|---|
| 25 | #define ASS_NAMEREF 0x0010 /* assigning to nameref variable */ |
|---|
| 26 | + #define ASS_FROMREF 0x0020 /* assigning from value of nameref variable */ |
|---|
| 27 | |
|---|
| 28 | /* Flags for the string extraction functions. */ |
|---|
| 29 | *** ../bash-4.3-patched/variables.c 2014-05-15 08:26:50.000000000 -0400 |
|---|
| 30 | --- variables.c 2014-09-01 14:37:44.000000000 -0400 |
|---|
| 31 | *************** |
|---|
| 32 | *** 2504,2511 **** |
|---|
| 33 | int hflags, aflags; |
|---|
| 34 | { |
|---|
| 35 | ! char *newval; |
|---|
| 36 | SHELL_VAR *entry; |
|---|
| 37 | |
|---|
| 38 | entry = (hflags & HASH_NOSRCH) ? (SHELL_VAR *)NULL : hash_lookup (name, table); |
|---|
| 39 | /* Follow the nameref chain here if this is the global variables table */ |
|---|
| 40 | if (entry && nameref_p (entry) && (invisible_p (entry) == 0) && table == global_variables->table) |
|---|
| 41 | --- 2566,2590 ---- |
|---|
| 42 | int hflags, aflags; |
|---|
| 43 | { |
|---|
| 44 | ! char *newname, *newval; |
|---|
| 45 | SHELL_VAR *entry; |
|---|
| 46 | + #if defined (ARRAY_VARS) |
|---|
| 47 | + arrayind_t ind; |
|---|
| 48 | + char *subp; |
|---|
| 49 | + int sublen; |
|---|
| 50 | + #endif |
|---|
| 51 | |
|---|
| 52 | + newname = 0; |
|---|
| 53 | + #if defined (ARRAY_VARS) |
|---|
| 54 | + if ((aflags & ASS_FROMREF) && (hflags & HASH_NOSRCH) == 0 && valid_array_reference (name)) |
|---|
| 55 | + { |
|---|
| 56 | + newname = array_variable_name (name, &subp, &sublen); |
|---|
| 57 | + if (newname == 0) |
|---|
| 58 | + return (SHELL_VAR *)NULL; /* XXX */ |
|---|
| 59 | + entry = hash_lookup (newname, table); |
|---|
| 60 | + } |
|---|
| 61 | + else |
|---|
| 62 | + #endif |
|---|
| 63 | entry = (hflags & HASH_NOSRCH) ? (SHELL_VAR *)NULL : hash_lookup (name, table); |
|---|
| 64 | + |
|---|
| 65 | /* Follow the nameref chain here if this is the global variables table */ |
|---|
| 66 | if (entry && nameref_p (entry) && (invisible_p (entry) == 0) && table == global_variables->table) |
|---|
| 67 | *************** |
|---|
| 68 | *** 2538,2541 **** |
|---|
| 69 | --- 2617,2630 ---- |
|---|
| 70 | } |
|---|
| 71 | } |
|---|
| 72 | + #if defined (ARRAY_VARS) |
|---|
| 73 | + else if (entry == 0 && newname) |
|---|
| 74 | + { |
|---|
| 75 | + entry = make_new_array_variable (newname); /* indexed array by default */ |
|---|
| 76 | + if (entry == 0) |
|---|
| 77 | + return entry; |
|---|
| 78 | + ind = array_expand_index (name, subp, sublen); |
|---|
| 79 | + bind_array_element (entry, ind, value, aflags); |
|---|
| 80 | + } |
|---|
| 81 | + #endif |
|---|
| 82 | else if (entry == 0) |
|---|
| 83 | { |
|---|
| 84 | *************** |
|---|
| 85 | *** 2658,2662 **** |
|---|
| 86 | if (nameref_cell (nv) == 0) |
|---|
| 87 | return (bind_variable_internal (nv->name, value, nvc->table, 0, flags)); |
|---|
| 88 | ! return (bind_variable_internal (nameref_cell (nv), value, nvc->table, 0, flags)); |
|---|
| 89 | } |
|---|
| 90 | else |
|---|
| 91 | --- 2747,2752 ---- |
|---|
| 92 | if (nameref_cell (nv) == 0) |
|---|
| 93 | return (bind_variable_internal (nv->name, value, nvc->table, 0, flags)); |
|---|
| 94 | ! /* XXX - bug here with ref=array[index] */ |
|---|
| 95 | ! return (bind_variable_internal (nameref_cell (nv), value, nvc->table, 0, flags|ASS_FROMREF)); |
|---|
| 96 | } |
|---|
| 97 | else |
|---|
| 98 | *** ../bash-4.3/patchlevel.h 2012-12-29 10:47:57.000000000 -0500 |
|---|
| 99 | --- patchlevel.h 2014-03-20 20:01:28.000000000 -0400 |
|---|
| 100 | *************** |
|---|
| 101 | *** 26,30 **** |
|---|
| 102 | looks for to find the patch level (for the sccs version string). */ |
|---|
| 103 | |
|---|
| 104 | ! #define PATCHLEVEL 30 |
|---|
| 105 | |
|---|
| 106 | #endif /* _PATCHLEVEL_H_ */ |
|---|
| 107 | --- 26,30 ---- |
|---|
| 108 | looks for to find the patch level (for the sccs version string). */ |
|---|
| 109 | |
|---|
| 110 | ! #define PATCHLEVEL 31 |
|---|
| 111 | |
|---|
| 112 | #endif /* _PATCHLEVEL_H_ */ |
|---|