@@ -124,6 +124,58 @@ void datum_stratum_mod_username_tests() {
124124 datum_test (0 == strcmp (buf , "def.ghi" ));
125125 datum_test (datum_stratum_mod_username (s , buf , sizeof (buf ), 0x8000 , modname , 2 ) == pool_addr );
126126 datum_test (datum_stratum_mod_username (s , buf , sizeof (buf ), 0xffff , modname , 2 ) == pool_addr );
127+
128+ // Intentionally overflow buf with address: we lose the worker name, but get the full address via its umod buffer
129+ s = "def.ghi~x" ;
130+ modname = & s [8 ];
131+ memset (buf , 0x0e , 8 );
132+ res = datum_stratum_mod_username (s , buf , 2 , 0 , modname , 1 );
133+ datum_test (res != buf );
134+ datum_test (res != pool_addr );
135+ datum_test (buf [2 ] == 0x0e );
136+ datum_test (0 == strcmp (res , "addrA" ));
137+ res = datum_stratum_mod_username (s , buf , 2 , 0x4ccc , modname , 1 );
138+ datum_test (0 == strcmp (res , "addrA" ));
139+ datum_test (datum_stratum_mod_username (s , buf , 2 , 0x4ccd , modname , 1 ) == pool_addr );
140+ datum_test (datum_stratum_mod_username (s , buf , 2 , 0xffff , modname , 1 ) == pool_addr );
141+ datum_test (buf [2 ] == 0x0e );
142+ datum_test (buf [6 ] == 0x0e );
143+ res = datum_stratum_mod_username (s , buf , 6 , 0 , modname , 1 );
144+ datum_test (res == buf );
145+ datum_test (res != pool_addr );
146+ datum_test (buf [6 ] == 0x0e );
147+ datum_test (0 == strcmp (res , "addrA" ));
148+ memset (buf , 0x0e , 9 );
149+ datum_test (datum_stratum_mod_username (s , buf , 7 , 0 , modname , 1 ) == buf );
150+ datum_test (buf [8 ] == 0x0e );
151+ datum_test (0 == strcmp (res , "addrA." ));
152+ memset (buf , 0x0e , 10 );
153+ datum_test (datum_stratum_mod_username (s , buf , 8 , 0 , modname , 1 ) == buf );
154+ datum_test (buf [9 ] == 0x0e );
155+ datum_test (0 == strcmp (res , "addrA.g" ));
156+ memset (buf , 0x0e , 11 );
157+ datum_test (datum_stratum_mod_username (s , buf , 9 , 0 , modname , 1 ) == buf );
158+ datum_test (buf [10 ] == 0x0e );
159+ datum_test (0 == strcmp (res , "addrA.gh" ));
160+ memset (buf , 0x0e , 12 );
161+ datum_test (datum_stratum_mod_username (s , buf , 10 , 0 , modname , 1 ) == buf );
162+ datum_test (buf [11 ] == 0x0e );
163+ datum_test (0 == strcmp (res , "addrA.ghi" ));
164+ s = "def.ghi~:)" ;
165+ modname = & s [8 ];
166+ memset (buf , 0x0e , 9 );
167+ datum_test (datum_stratum_mod_username (s , buf , 2 , 0 , modname , 2 ) == buf );
168+ datum_test (buf [2 ] == 0x0e );
169+ datum_test (0 == strcmp (res , "d" ));
170+ datum_test (datum_stratum_mod_username (s , buf , 6 , 0 , modname , 2 ) == buf );
171+ datum_test (buf [6 ] == 0x0e );
172+ datum_test (0 == strcmp (res , "def.g" ));
173+ datum_test (datum_stratum_mod_username (s , buf , 7 , 0 , modname , 2 ) == buf );
174+ datum_test (buf [7 ] == 0x0e );
175+ datum_test (0 == strcmp (res , "def.gh" ));
176+ datum_test (datum_stratum_mod_username (s , buf , 8 , 0 , modname , 2 ) == buf );
177+ datum_test (buf [8 ] == 0x0e );
178+ datum_test (0 == strcmp (res , "def.ghi" ));
127179}
128180
129181void datum_stratum_tests (void ) {
0 commit comments