JOSTALY TECHNOLOGIES
John SETH Thielemann
sthielemann@jostaly.com
+1-223-231-3511 (Visit preferred)
11/12/2024-11/25/2024
0 NEWS)
03/11/2024 - New version of LightSpy targets iOS.
14/11/2024 - Hot Topic hacked, data breach.
18/11/2024 - US confirms telecommunications breached to access wiretap facilities to spy on Americans.
20/11/2024 - Finastra starts investigation of data breach.
20/11/2024 - US government arrests members of 0ktapus.
20/11/2024 - iPhone security update for pair of bugs used in active cyberattacks.
0.1) "rawutils" release
As part of this article a piece of the standard C system call and POSIX infrastructure
is being released to the public domain "officially" outside of social networking (Attached with
instructions to cut-out of the article and is additionally available at https://www.jostaly.com
under public releases). Unit testing is available on the behavior of the applications and written
in a free-standing spirit.
0.2) Attachment
Attachment is from an "air-gapped" machine. Signed with an additional fido2 key. Keys circular signed.
See section 2.1 for public key blocks (gpg --list-sigs will show circular signatures)
https://www.jostaly.com/public.keys/
0.3) SHA256 Manifest / Cut-out
ace605c826445db39dcfc58c7de6f59ab4d701161a05634071c8ae1c814f548b jostaly-technologies-bison_part2_repackage.tar.bz2
66b270a75d0e64cd1721f6f7bea52cb2c2dc7575e11ef49129c5abb27263b7b4 jostaly-technologies-bison_part2_repackage.tar.bz2.asc
7014decb8ff6253d48f24a3411a1bcd3dd07bc12f47e40dfa01dc2f742cae5bd jostaly-technologies-bison_part2_repackage.tar.bz2.asc.asc
\
c307bfeb754848b4e923810acff634cd5a9f3dcdefe3b50cb14b5f056f0f8ef8 ./bison-3.8-modified-article-25112024-1538.tgz
e3cbfeec5415b822265a81901a4557e2c2c7936d85192829e5383073def6050b ./bison-3.8-modified-article-25112024-1538.tgz.asc
ed8822aaa41fdf7041da237e22684bc249a7aa934dea9345c20fdb5e78d8042c ./bison-3.8-modified-article-25112024-1538.tgz.asc.asc
d5d184d421aee15603939973a6b0f372f908edfb24c5bc740697497021ad9458 ./bison-3.8.tar.gz
9decf7cabe15f4530550cc17a019f108bca5c82d726804a4558192153c474191 ./bison-3.8.tar.gz.sig
1b57645a2c077ee3f2f97cf84288f43671c9f91a83573664f20105119c97ce2f ./rawutils_JOSTALYtechnologies-20112024-1830.tgz
017bd8950d9d7849b8e0577f0e32976736f5b4ba2013ec9a2d190053f4e7ccd7 ./rawutils_JOSTALYtechnologies-20112024-1830.tgz.asc
1b6618bd8a4b14e1a82369c1362400ac6bb98216534b5b7e082f8bfaa12e0c2c ./sthielemann.jostaly.1mopub.pub
f27148947f40248fe339f03a835cfb2878f4e3af85b84360fd04693ceaf21b25 ./sthielemann.jostaly.2025.08.17.pub
$ dd if=bison_part2.jostaly.packaged.txt of=./article.attachment.tar.bz2 bs=1 iseek=26016
0.4) Attachment Signature
Inner envelope: (article.attachment.tar.bz2.asc)
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEoR1GRDaqHnluoFwVTiqT8BWplXsFAmdE4GwACgkQTiqT8BWp
lXteUA//bA6203YdacAjwDHBZ8LIhSXuJ7+XyLhiABEJPonElPBaJXVlb4foxW9r
6w6hpwr88bCAV3RHZH5/av/2xWUtq4ChtHpK3ttpMENI40NOiwifPSopLH02QhXO
DPTeAmrUeI4SOp18OdZejLxhm/5LKrZwt30hHaDdKceQ2WWALzRqWAWjkK9tyXn6
qIafS5Cjh3WxU1VomtgyE94IASdRqADawlKC8J7rwV56IOgoZTHZMpeo9EvSNVNm
ArFNaWk9urzULo7BotcOkya8VQaj7zRFlAXpyNXnYGltEe9QBpYJuRlYwyysUM9O
BFgpzgtbl3tPSEbqx4w8g88ooNLVpbJH/nDjCfF0aW8sM1xYx83QdDP/MzjJ18mg
CJm/oAtHMIs2ikV3sQmyRTBwwaZE4DcD1afqyegCdl5vzqFypJYe5rmfbs6E6N7B
ONu/5BqzR6FX5kNhuFe/4hPBsY9gKM6+QdVZx7d3GzJPne8WHyLFhPKz0yXVCcwY
B0AMOFYkbqLT7NSJNUMADSEBWKdYWW5eO/YGVV9j6EF6/6mufqktYSjGi6qruuOt
x00KNeZ0dWAk9wibsga/l+gMTVaJ8NMY5i1F4VP5it+foVRZ3z4gaeJjHxW3o5Al
vlCrxnqPu8yT5KZbXCkSX8G3z3e4+mu39yYID13mmRQq9ZGBA1Y=
=71EA
-----END PGP SIGNATURE-----
Outter envelope:
-----BEGIN PGP SIGNATURE-----
iQEzBAABCgAdFiEEoEbOvOF4KUyzahmzlFQYYXg0qVkFAmdE4K8ACgkQlFQYYXg0
qVmHwQf+PoFhIm6q/pLwVkKs2JLyUDzoFqceCEA4CXdnBQpguOiqR5asvT4YjDvO
v1S+CngTb/h+dmwXQc8xQWEvStTjAvAVP3xd+ZnW6yH+chCAJ4R4eoHHAmhQwVEI
BJjGIAP9zqmbL1iSWfGHziL76e+GmHKAvBMDLeTSi3uaIgoJyKW5OO28gbw3h/F3
CugDcZqS/X1SyjvgZYu4kEpU34LKcLu5MNkt6eBAtRMsM/vJqWtanELF8iLO1GrQ
zuTNiZ2teugpOxA5aFVVu+Kk2HDS+Ta8DWMYaQ+h4PH52qFlZs3qtsAJLWCoOpAJ
N8D+Vx2QuF3dr0y6CCb+EMxQtwt4eQ==
=u6be
-----END PGP SIGNATURE-----
1 ARTICLE)
There's a reason for hashing filesystems, redundancy/mirrors, physically writing down hashes,
sticky bits, immutable bits, etc. even on machines that are "offline." With additional operator
error on removing the last backup. Rework. The build system replaced with the ./build.sh script.
stdc replacement functions from the underlying GNUlib removed (this is really just a secondary
wrapper to the likely libc that already exists on the system anyway).
A number of types like 'typedef const char* uniqstr', 'typedef ptrdiff_t idx_t', have been
replaced with their decay type. Modified gram_scanner_close to check for fileno == 1 to return,
fixes unit test broken form _safer() removal calls.
Simple removals:
* Timer tracing
* 'create_pipe_bidi' from src/output.c, replace with standard pipe/execv calls.
* The decay of "ASCII" in locale_charset adds +2 on unit tests (4 special characters),
but I went ahead and fixed this issue for the article. Unit tests explained at the end.
* Use a number of functions from ctype.h and wctype.h
* ialloc trinary wrapped variants on top of secondary wrapped xalloc functions.
* xmalloc removals
* programname
* xalloc-oversized is an overflow detection, add check for the one use case for result of * < size.
* Targetting and building for *nix, removed some win32 macros, filename.h
* Removal of unitypes.h, textstyle.h functions (ostream_*) can be replaced with fprintf.
* styled_ostream_begin/end_use_class, styled_stream_flush_to_current_style are empty.
These just generate errors when the header is removed.
* While debugging (also noted below), #line directives were throwing gdb off.
These are not needed, along with the .l files and a few other sources.
Simple mappings:
* execute->execv
* last_component->basename
* asnprintf->snprintf
* remove vas(n)printf (not quite so simple) -> snprintf
* assure->assert
* xstrdup->strdup
* get_errno()->errno
* integer_length_* -> builtin functions.
* fstrcmp_bounded is essentially a strspn divided over the length, and way simpler.
* 'INT_ADD_WRAPV' (and friends) replace with builtin overflow calls.
Circling back around to glyphs to avoid the u8_uctomb implementation, the ASCII 'arrow' (e.g. ->) or
snprintf(buffer, sizeof(buffer), "\u2192") breaks a bunch of others, better could be done:
jostaly@jostaly:~/workspace/bison/bison-3.8.tmp$ hexdump -C /home/jostaly/workspace/raw_glyphs
00000000 41 3a e2 86 92 0a 44 3a e2 80 a2 0a 56 3a e2 86 |A:....D:....V:..|
00000010 b3 0a 45 3a ce b5 0a |..E:...|
00000017
jostaly@jostaly:~/workspace/bison/bison-3.8.tmp$ cat /home/jostaly/workspace/raw_glyphs
A:→
D:•
V:↳
E:ε
Change glyphs.c one more time (and header, only .c noted here):
unsigned char glyph_arrow[4] = { 0xe2, 0x86, 0x92, 0x00 };
unsigned char glyph_dot[4] = { 0xe2, 0x80, 0xa2, 0x00 };
unsigned char glyph_empty[7] { 0xce, 0xb5, 0, 0, 0, 0, 0 };
unsigned char glyph_down_arrow[5] = { 0xe2, 0x86, 0xb3, 0x20, 0x00 };
const char *derivation_separator = " ";
int glyph_arrow_width = 1; // 2
int glyph_dot_width = 1;
int glyph_down_arrow_width = 2; // 3
int glyph_empty_width = 1; // 6 (%empty)
int derivation_separator_width = 1;
void
glyphs_init (void)
{
wchar_t temp = 0;
if (mbtowc(&temp, glyph_arrow, 3) < 3) {
snprintf(glyph_arrow, 4, "->");
glyph_arrow_width = 2;
}
if (mbtowc(&temp, glyph_dot, 3) < 3)
snprintf(glyph_dot, 4, ".");
if (mbtowc(&temp, glyph_empty, 2) < 2) {
snprintf(glyph_empty, 7, "%%empty");
glyph_empty_width = 6;
}
if (mbtowc(&temp, glyph_down_arrow, 3) < 3) {
snprintf(glyph_down_arrow, 5, "`-> ");
glyph_down_arrow_width = 4;
}
}
Unit tests pass and using standard C99. The error location caret and tildes were chased
for quite some time. The logic is housed within src/location.c (important to note that this is also
shared partially by the grammar). Brief examination of this region of code was not very successful.
A significant deep dive to grasp how the grammar and the caret use the surrounding functions was
needed. CVEs are common around multibyte sequences / UTF-8 conversions (a pain point for programmers).
A few recent CVEs: 2024-6197, 2024-52531, 2024-46954, 2024-25293, 2024-34363 (https://cve.mitre.org).
The sequences may not be visible outside of a hexdump, and the terminal locale is also important.
Failed attempt:
jostaly@jostaly:~/workspace/bison/bison-3.8$ hexdump tests/testsuite.dir/004/input.y -C
00000000 25 68 65 61 64 65 72 20 22 f0 00 80 88 22 0a 00 |%header "...."..|
^---------- Invalid, opaque to output:
00000010 01 02 ff 3f 0a 22 00 22 0a 25 25 0a 3f 0a 64 65 |...?.".".%%.?.de|
00000020 66 61 75 6c 74 3a 20 27 61 27 20 7d 0a 25 26 0a |fault: 'a' }.%&.|
00000030 25 61 2d 64 6f 65 73 2d 6e 6f 74 2d 65 78 69 73 |%a-does-not-exis|
00000040 74 0a 25 2d 0a 25 7b 0a |t.%-.%{.|
+++ /home/jostaly/workspace/bison/bison-3.8/tests/testsuite.dir/at-groups/4/stdout 2024-11-08 16:14:41.832650222 +0000
@@ -1,9 +1,9 @@
-input.y:1.11: error: invalid null character
+input.y:1.10: error: invalid null character <---- grammar counting being off on this run.
1 | %header "\xf0\x00\x80\x88"
- | ^
-input.y:2.1-2: error: invalid characters: '\0\001\002\377?'
+ | ^
+input.y:2.1-4: error: invalid characters: '\0\001\002\377?'
2 | \x00\xff?
- | ^~
+ | ^~~~ <--------- the caret being off on this test case run.
input.y:3.2: error: invalid null character
3 | "\x00"
Added replacement functions into src/location.c, technically UTF-8 can extend into 8 byte
sequences (this does narrow down to four bytes and is also a seam to keep working with the
surrounding mbfile/mbchar code):
size_t multibyte_clength(const char* s, size_t len) {
size_t result = 0;
char* start = (char*)s;
for (char* p = start; p < (s + len); p++) {
size_t cl = (p - start) + 1;
if (cl > 1) {
int r = mblen(start, cl);
if (0 == r)
break;
else if (r < 0 && cl >= sizeof(wchar_t))
return -1;
else if (r < 0)
continue;
else {
start = (p + 1);
result++;
}
} else if ('\0' == *p)
break;
else if (isascii(*p)) {
result++;
start = (p + 1);
}
}
return result;
}
static void replacement_getc(mbchar_t* res) {
wchar_t wc = 0;
res->buf[0] = res->buf[1] = res->buf[2] = res->buf[3] = 0;
char* p = &res->buf[0];
while (1) {
ssize_t r = fread(p, 1, 1, caret_info.file);
if (r <= 0) {
mbeof(res);
return;
}
p++;
size_t len = ((ptrdiff_t)(p - &res->buf[0]));
if (len > 1) {
r = mblen(&res->buf[0], len);
if (0 == r) {
mbwcnull(res, p - &res->buf[0]);
return;
} else if (len > sizeof(wchar_t) || (r < 0 && len == sizeof(wchar_t))) {
mbwcinval(res);
return;
} else if (r < 0)
continue;
} else if (((char)0xFF) == res->buf[0]) {
mbwcnull(res, 1);
return;
} else if (!isascii(res->buf[0])) {
r = 1;
continue;
}
res->ptr = &res->buf[0];
res->wc_valid = true;
res->wc = *((wchar_t*)&res->buf[0]);
res->bytes = len;
return;
}
}
/* Getc, but smash \r\n as \n. */
static void
caret_getc(mbchar_t *res)
{
static mbchar_t rc = { NULL, 0, false, 0, "" };
if (rc.wc_valid) {
mb_copy(res, &rc);
rc.wc_valid = false;
return;
}
replacement_getc(&rc);
if (mb_iseq(rc, '\r')) {
replacement_getc(res);
if (mb_iseq(*res, '\n')) {
rc.wc_valid = false;
return;
}
}
mb_copy(res, &rc);
rc.wc_valid = false;
}
The article leaves off with the following status:
testsuite: 4 74 150 310 failed
4: Invalid inputs FAILED (input.at:104)
Invalid multi-byte sequences no longer get passed to the output, failing this test.
Where this might be a problem is generating lexicographical or strings that should not
be valid. There seems to be only a single test case for this. However, the sequence is
invalid and removed from the input. ASCII "invalid" (non-printables) still get passed
to the output.
--- - 2024-11-13 20:45:20.445123633 +0000
+++ /home/jostaly/workspace/bison/bison-3.8/tests/testsuite.dir/at-groups/4/stdout 2024-11-13 20:45:20.436876188 +0000
@@ -1,5 +1,5 @@
input.y:1.11: error: invalid null character
- 1 | %header "\xf0\x00\x80\x88"
+ 1 | %header ""
| ^
input.y:2.1-2: error: invalid characters: '\0\001\002\377?'
2 | \x00\xff?
74: Many kinds of errors FAILED (named-refs.at:426)
The tildes is off slightly on this test, better could be done here. The original grammar
locations from a backtrace were not available, hampered by the #line directives leading to their
removal.
./named-refs.at:384: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS; VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS; bison --color=no -fno-caret -o test.c test.y
./named-refs.at:426: COLUMNS=1000; export COLUMNS; NO_TERM_HYPERLINKS=1; export NO_TERM_HYPERLINKS; VALGRIND_OPTS="$VALGRIND_OPTS --leak-check=summary --show-reachable=no"; export VALGRIND_OPTS; bison --color=no -fno-caret -fcaret -o test.c test.y
--- - 2024-11-11 13:57:23.029748689 +0000
+++ /home/jostaly/workspace/bison/bison-3.8/tests/testsuite.dir/at-groups/74/stderr 2024-11-11 13:57:23.024000353 +0000
@@ -3,13 +3,13 @@
| ^~~~~~
test.y:23.11-24.62: note: symbol not found in production: cond1
23 | if_stmt1: IF expr[cond] THEN stmt[then] ELSE stmt.list[else] FI
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.y:26.43-53: error: invalid reference: '$stmt.field'
26 | { $if_stmt2 = new IfStmt($cond, $stmt.field, 0); };
| ^~~~~~~~~~~
test.y:25.11-26.60: note: symbol not found in production: stmt
25 | if_stmt2: IF expr[cond] THEN stmt[then] FI
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.y:25.35-38: note: possibly meant: $then.field, hiding $stmt.field at $4
25 | if_stmt2: IF expr[cond] THEN stmt[then] FI
| ^~~~
@@ -18,7 +18,7 @@
| ^~~~~~~~~~
test.y:27.11-28.59: note: symbol not found in production: stmt
27 | if_stmt3: IF expr[cond] THEN stmt.list FI
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
150: Tabulations and multibyte characters FAILED (diagnostics.at:282)
jostaly@jostaly:~/workspace/bison/bison-3.8/tests/testsuite.dir/150$ hexdump -C input.y
00000000 25 63 6f 64 65 20 74 6f 70 20 7b 0a 23 69 6e 63 |%code top {.#inc|
00000010 6c 75 64 65 20 3c 74 65 73 74 73 75 69 74 65 2e |lude .}..%%.e: {...|
1 2 3 4 5
00000030 e2 83 97 c3 97 f0 9d 90 b8 e2 83 97 20 3d 20 2d |............ = -|
6 7 8 9 10 11 12 13
00000040 e2 88 82 f0 9d 90 b5 e2 83 97 2f e2 88 82 74 7d |........../...t}|
00000050 14 15 16 17 18 19 20 |.|
jostaly@jostaly:~/workspace/bison/bison-3.8/tests/testsuite.dir/150$ bison -fcaret --color=debug -Wall,cex input.y
input.y:6.4-17: warning: empty rule without %empty [-Wempty-rule]
6 | e: {∇⃗×𝐸⃗ = -∂𝐵⃗/∂t}
| ^~~~~~~~~~~~~~
| %empty
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
jostaly@jostaly:~/workspace/bison/bison-3.8/tests/testsuite.dir/150$ ../../../src/bison -fcaret --color=debug -Wall,cex input.y
input.y:6.4-20: warning: empty rule without %empty [-Wempty-rule]
6 | e: {∇⃗×𝐸⃗ = -∂𝐵⃗/∂t}
| ^~~~~~~~~~~~~~~~~
| %empty
input.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother]
jostaly@jostaly:/tmp$ ./a.out
Boundary compute of (e)[0x65] (size: 1) -> line/column/byte 1/1/1
Boundary compute of (:)[0x3A] (size: 1) -> line/column/byte 1/2/2
Boundary compute of ( )[0x20] (size: 1) -> line/column/byte 1/3/3
Boundary compute of ({)[0x7B] (size: 1) -> line/column/byte 1/4/4
Boundary compute of (.)[0xE2] (.)[0x88] (.)[0x87] (size: 3) -> line/column/byte 1/5/5
Boundary compute of (.)[0xE2] (.)[0x83] (.)[0x97] (size: 3) -> line/column/byte 1/6/8
Boundary compute of (.)[0xC3] (.)[0x97] (size: 2) -> line/column/byte 1/7/11
Boundary compute of (.)[0xF0] (.)[0x9D] (.)[0x90] (.)[0xB8] (size: 4) -> line/column/byte 1/8/13
Boundary compute of (.)[0xE2] (.)[0x83] (.)[0x97] (size: 3) -> line/column/byte 1/9/17
Boundary compute of ( )[0x20] (size: 1) -> line/column/byte 1/10/20
Boundary compute of (=)[0x3D] (size: 1) -> line/column/byte 1/11/21
Boundary compute of ( )[0x20] (size: 1) -> line/column/byte 1/12/22
Boundary compute of (-)[0x2D] (size: 1) -> line/column/byte 1/13/23
Boundary compute of (.)[0xE2] (.)[0x88] (.)[0x82] (size: 3) -> line/column/byte 1/14/24
Boundary compute of (.)[0xF0] (.)[0x9D] (.)[0x90] (.)[0xB5] (size: 4) -> line/column/byte 1/15/27
Boundary compute of (.)[0xE2] (.)[0x83] (.)[0x97] (size: 3) -> line/column/byte 1/16/31
Boundary compute of (/)[0x2F] (size: 1) -> line/column/byte 1/17/34
Boundary compute of (.)[0xE2] (.)[0x88] (.)[0x82] (size: 3) -> line/column/byte 1/18/35
Boundary compute of (t)[0x74] (size: 1) -> line/column/byte 1/19/38
Boundary compute of (})[0x7D] (size: 1) -> line/column/byte 1/20/39
(gdb) run -fcaret --color=debug -Wall,cex input.y
Starting program: /home/jostaly/workspace/bison/bison-3.8/src/bison -fcaret --color=debug -Wall,cex input.y
input.y:10.4-20: warning: empty rule without %empty [-Wempty-rule]
Breakpoint 1, location_caret (loc=..., style=0x4f8b8e "warning", out=0x543ae0 <_IO_2_1_stderr_>) at src/location.c:641
641 caret_getc (&c);
(gdb) p loc.start.column
$1 = 4
(gdb) p loc.end.column
$2 = 21
310: Several parsers (headers.at:199): FAILED (headers.at:380)
Related to the original configuration, opening up the test build and changing
CXXFLAGS="-static" fixes this testcase.
2) Public-key blocks
2.1) FIDO2/Yubi
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
yK8fgZw=
=/2a0
-----END PGP PUBLIC KEY BLOCK-----
2.2) gpg key
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=jXh9
-----END PGP PUBLIC KEY BLOCK-----
BZh91AY&SYT&