Fix Undefined-shift in ubidi_getRuns

Upstream PR: https://github.com/unicode-org/icu/pull/663

Bug: chromium:966377
Change-Id: Icde4128f0c333e6c1cf79704789f893b9a5f3780
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/deps/icu/+/1637963
Reviewed-by: Jungshik Shin <jshin@chromium.org>
diff --git a/README.chromium b/README.chromium
index c75f49a..5250aee 100644
--- a/README.chromium
+++ b/README.chromium
@@ -265,3 +265,10 @@
     https://unicode-org.atlassian.net/browse/ICU-20595
   - upstream PR:
     https://github.com/unicode-org/icu/pull/649
+
+10. Bidi UBSan breakage patch
+  - patches/bidiunshift.patch
+  - upstream bug:
+    https://unicode-org.atlassian.net/browse/ICU-20641
+  - upstream PR:
+    https://github.com/unicode-org/icu/pull/663
diff --git a/patches/bidiunshift.patch b/patches/bidiunshift.patch
new file mode 100644
index 0000000..353a038
--- /dev/null
+++ b/patches/bidiunshift.patch
@@ -0,0 +1,15 @@
+diff --git a/source/common/ubidiimp.h b/source/common/ubidiimp.h
+index a5d07274..41bca38a 100644
+--- a/source/common/ubidiimp.h
++++ b/source/common/ubidiimp.h
+@@ -198,8 +198,8 @@ typedef struct Run {
+ /* in a Run, logicalStart will get this bit set if the run level is odd */
+ #define INDEX_ODD_BIT (1UL<<31)
+ 
+-#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31))
+-#define ADD_ODD_BIT_FROM_LEVEL(x, level)  ((x)|=((int32_t)(level)<<31))
++#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)((level)&1)<<31))
++#define ADD_ODD_BIT_FROM_LEVEL(x, level)  ((x)|=((int32_t)((level)&1)<<31))
+ #define REMOVE_ODD_BIT(x)                 ((x)&=~INDEX_ODD_BIT)
+ 
+ #define GET_INDEX(x)   ((x)&~INDEX_ODD_BIT)
diff --git a/source/common/ubidiimp.h b/source/common/ubidiimp.h
index a5d0727..41bca38 100644
--- a/source/common/ubidiimp.h
+++ b/source/common/ubidiimp.h
@@ -198,8 +198,8 @@
 /* in a Run, logicalStart will get this bit set if the run level is odd */
 #define INDEX_ODD_BIT (1UL<<31)
 
-#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)(level)<<31))
-#define ADD_ODD_BIT_FROM_LEVEL(x, level)  ((x)|=((int32_t)(level)<<31))
+#define MAKE_INDEX_ODD_PAIR(index, level) ((index)|((int32_t)((level)&1)<<31))
+#define ADD_ODD_BIT_FROM_LEVEL(x, level)  ((x)|=((int32_t)((level)&1)<<31))
 #define REMOVE_ODD_BIT(x)                 ((x)&=~INDEX_ODD_BIT)
 
 #define GET_INDEX(x)   ((x)&~INDEX_ODD_BIT)