Description: Cherry-pick 3 encoding fixes from upstream
  - Fix EDIFACT encoding (0f2adb) (Closes: #773719)
  - Fix encoding of _. (45813a) (Closes: #429210)
  - Fix cases where data might be lost. (ebbb6e2) (Closes: #835296)
Author: Jakob Haufe <sur5r@sur5r.net>
Origin: upstream
Bug-Debian: https://bugs.debian.org/429210
Bug-Debian: https://bugs.debian.org/773719
Bug-Debian: https://bugs.debian.org/835296
Last-Update: 2021-12-15

--- iec16022-0.2.4.orig/iec16022ecc200.c
+++ iec16022-0.2.4/iec16022ecc200.c
@@ -255,7 +255,7 @@ char ecc200encode(unsigned char *t, int
 			{
 				char out[6], p = 0;
 				const char *e,
-				    *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]_",
+				    *s2 = "!\"#$%&'()*+,-./:;<=>?@[\\]^_",
 				    *s3 = 0;
 				if (newenc == 'c') {
 					e = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
@@ -321,11 +321,11 @@ char ecc200encode(unsigned char *t, int
 							}
 						}
 					}
-					if (p == 2 && tp + 2 == tl && sp == sl)
-						out[p++] = 0;	// shift 1 pad at end
-					while (p >= 3) {
-						int v =
-						    out[0] * 1600 +
+					while (p >= 3 || (p && sp == sl)) {
+						int v;
+						while (p < 3) out[p++] = 0; // pad at end
+						if (tp + 2 >= tl) return 0; // not enough space
+						v = out[0] * 1600 +
 						    out[1] * 40 + out[2] + 1;
 						if (enc != newenc) {
 							if (enc == 'c'
@@ -356,26 +356,36 @@ char ecc200encode(unsigned char *t, int
 		case 'e':	// EDIFACT
 			{
 				unsigned char out[4], p = 0;
-				if (enc != newenc) {	// can only be from C40/Text/X12
+				if (enc != 'a' && enc != newenc) {	// can only be from C40/Text/X12
 					t[tp++] = 254;
 					enc = 'a';
 				}
+				if (enc == 'a')
+				{
+					t[tp++] = 240;
+					enc = 'e';
+				}
 				while (sp < sl && tolower(encoding[sp]) == 'e'
-				       && p < 4)
+				       && p < 4) {
+					if (s[sp] < 32 || s[sp] > 94) {
+						fprintf(stderr, "Cannot encode 0x%02X in EDIFACT\n", s[sp]);
+						return 0;
+					}
 					out[p++] = s[sp++];
+				}
 				if (p < 4) {
 					out[p++] = 0x1F;
 					enc = 'a';
 				}	// termination
-				t[tp] = ((s[0] & 0x3F) << 2);
-				t[tp++] |= ((s[1] & 0x30) >> 4);
-				t[tp] = ((s[1] & 0x0F) << 4);
+				t[tp] = ((out[0] & 0x3F) << 2);
+				t[tp++] |= ((out[1] & 0x30) >> 4);
+				t[tp] = ((out[1] & 0x0F) << 4);
 				if (p == 2)
 					tp++;
 				else {
-					t[tp++] |= ((s[2] & 0x3C) >> 2);
-					t[tp] = ((s[2] & 0x03) << 6);
-					t[tp++] |= (s[3] & 0x3F);
+					t[tp++] |= ((out[2] & 0x3C) >> 2);
+					t[tp] = ((out[2] & 0x03) << 6);
+					t[tp++] |= (out[3] & 0x3F);
 				}
 			}
 			break;
@@ -420,6 +430,7 @@ char ecc200encode(unsigned char *t, int
 					t[tp] = s[sp++] + (((tp + 1) * 149) % 255) + 1;	// see annex H
 					tp++;
 				}
+				if (l) return 0; // not enough space
 				enc = 'a';	// reverse to ASCII at end
 			}
 			break;
